SNMP 原理及配置简述

转载 2016年01月13日 16:18:51
随着机器数量的增长,管理员不能像过去那样,一台台机器进行监控、解决问题,而需要借助各方工具进行统一监控和管理。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。
    在这里,我不想讲太多原理性的东西,网上有大堆的资料可以参考(附录中有链接),下面仅说明关键内容,并提供Linux 和 Windows 环境下snmp实现的方法。

一、SNMP的组成
SNMP采用了Client/Server模型的特殊形式:代理/管理站模型。对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。每个SNMP从代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。
简单来说,就是需要一个服务器程序(代理,agent)和一个客户机(管理器,manager)。而与直观上不同的是,SNMP的服务器端代表被管理的事物,而客户机端才是管理者。客户机从简单的命令行实用程序,如net-snmp提供的snmpwalk,到专门的管理软件、工作站都有。

二、SNMP的组织结构
SNMP数据以一种标准化的层次结构进行布置,这种结构的大部分都留给将来扩充,而特定厂商添加的部分则被本地化以避免冲突。命名的层次结构由MIB(Management Information Base,管理信息库)组成,它是描述通过SNMP协议可访问的数据的结构化文本文件。MIB 包括了对特定数据变量的说明,数据变量被称为OID(Object Identifier,对象标识符)。

SNMP 层次结构非常像一个文件系统。不过,它是用点号(.)作为分隔符,每个节点被赋予了一个数字而不是名字。为了易于引用,还可以给节点赋予文字名称,但这种命名其实只是为了高层应用方面而已,而不是层次结构的一项功能。(有点类似于DNS的作用)。

例如:设置(获取)系统正确运行时间的OID是:

引用
1.3.6.1.2.1.1.3

这个OID也有一个方便读取的名称:

引用
iso.org.dod.internet.mgmt.mib-2.system.sysUpTime

(请参考下面的net-snmp 实现)
※ 实际上,目前只能在OID iso.org.dod.internet.mgmt(即数字1.3.6.1.2)之下才能找到有用的数据。

常见的几个MIB II 选择的OID

引用
system.sysDescr 系统信息:厂家、型号、操作系统类型等;
interfaces.ifNumber 系统的网络接口数量
ip.ipRouteTable 系统的路由表

除了这些基本的MIB之外,不同的硬件厂商还会提供它们特有的MIB信息,如提供Agent,利用它们自己的API,往MIB中添加信息,以便于管理器获取相关的信息。MIB只是提供了一个管理数据的约定,SNMP协议名字空间和设备实际状态之间的映射关系必须由代理端代码支持才有用。当然,遵循同样的规定,你也可以编写直接的Agent。

三、SNMP协议一些操作
基本的SNMP协议操作只有4种:get(获取)、get_next(获取下一个)、set(设置)和trap(陷阱)。
get 和 set 是从节点读取数据和把数据写入节点的基本操作,节点以OID方式说明。
get-next 用于在MIB 层次结构上步进。
trap 是从服务器(代理程序)到客户机(管理器)的一个主动提供的异步通知,在出现特定的事情或状态时,它会报告。SNMP协议已经定义了若干标准的trap操作,例如“I have just come up”(刚启动),还有报告网络链路故障或已修复,路由或身份认证等的trap,这取决于agent程序的实现。

四、SNMP 验证
因为SNMP提供大量机器及系统信息,权限允许的话,还可以进行修改的操作,因此,SNMP的安全性很重要。目前,SNMP有两种验证标准,第2版和第3版。服务器(代理程序)和客户机(管理器)的验证方式必须相同。
第2版基于SNMP 群体名(community name)的概念,其实可理解为“口令”,以明文传输的方式进行;通常一个群名用于只读访问,另一个群名则允许写入。
第3版引入了安全性更高的访问控制方法,通过用户名和密码的加密传输来实现身份验证,5.4 以上版本net-snmp支持v3方式,以下的版本可用v2方式。

五、Linux 下SNMP的实现
Linux 下SNMP协议协议,以net-snmp软件来实现,它包含一个SNMP代理程序、一些命令行工具和一个库,这个库可用于开发支持SNMP 的应用软件。net-snmp的代理程序负责收集本地主机的信息,并通过网络把这些信息提供给SNMP管理器,这个代理程序可以扩展,例如执行Linux命令后,把命令的输出作为SNMP响应返回。这样,利用该功能,就能用SNMP监控系统上的几乎任何东西了。
官网地址:NET-SNMP

1、 配置代理程序
记住我这里说的代理程序,就是要监控的目标(服务端)。以红旗 DC Server 5.0 SP4为例,其自带net-snmp版本为:

引用
# rpm -qa|grep net-snmp
net-snmp-libs-5.1.2-18.2
net-snmp-devel-5.1.2-18.2
net-snmp-perl-5.1.2-18.2
net-snmp-5.1.2-18.2
net-snmp-utils-5.1.2-18.2

版本是5.1.2的。同样的,红旗 Asianux 3.0的版本也仅为5.3.2.2,都是仅支持v2 的认证方式,也就是说,下面的配置方式都是相同的。故我暂以v2 的验证方式来说明,v3 的方式留待以后5.4 版本的net-snmp再进行描述。
配置文件是:/etc/snmp/snmpd.conf,里面有详细的例子和说明。简单来说,就是先配置验证信息,然后分组,给予权限,并分配可访问的信息。

引用
# First, map the community name "public" into a "security name"
#       sec.name  source          community
# 设置允许某个IP,通过opendata作为密码进行访问
com2sec notConfigUser  192.168.228.149       opendata
####
# Second, map the security name into a group name:
#       groupName      securityModel securityName
# 设置组及验证的方式
group   notConfigGroup v1           notConfigUser
group   notConfigGroup v2c           notConfigUser
####
# Third, create a view for us to let the group have rights to:
# Make at least  snmpwalk -v 1 localhost -c public system fast again.
# 用view 设置视图,定义允许访问的信息范围
#       name           incl/excl     subtree         mask(optional)
# view    systemview    included   .1.3.6.1.2.1.1
# view    systemview    included   .1.3.6.1.2.1.25.1.1
view all    included  .1                               80
####
# Finally, grant the group read-only access to the systemview view.
#       group          context sec.model sec.level prefix read   write  notif
# 最后用access 把上面的三项连接起来
#access  notConfigGroup ""      any       noauth    exact  systemview none none
# 这里的all 表示允许访问全部信息
access  notConfigGroup ""      any       noauth    exact all none none

保存后,启动服务:

# service snmpd start

查看端口是否已经打开:

引用
# netstat -ln|grep 161
udp        0      0 0.0.0.0:161                 0.0.0.0:*

2、管理器连接
记住,这里的管理器实际上就是客户端。因为上面指定了允许访问的IP,因此,只能通过该IP 进行访问。net-snmp-utils 包提供了一些客户端软件。包括:

引用
snmpdelta 一直监视SNMP 变量的变化
snmpdf 通过SNMP监视远程主机的磁盘空间
snmpget 从一个代理得到一个SNMP变量的值
snmpgetnext 从序列中获得下一个变量
snmpset 设置代理商的一个SNMP变量
snmptable 得到一个SNMP变量表
snmptranslate 搜索并说明MIB结构中的OID
snmptrap 生成一次trap 告警
snmpwalk 从某个特定的OID开始遍历MIB

这些命令很好用,可放在shell 中利用脚本进行监控。当然,还可以用perl 、php 等函数来获取或设置SNMP Agent。
例如:

引用
# snmpdf -v 1 -c opendata 192.168.228.148
Description              size (kB)            Used       Available Used%
Memory Buffers             1034448           10772         1023676    1%
Real Memory                1034448          403876          630572   39%
Swap Space                       0               0               0    0%
/                         12381404         4552792         7828612   36%
/sys                             0               0               0    0%
/proc/sys/fs/binfmt_misc               0               0               0    0%

这里用-v 1表示v1的验证方式,还可以用-v c2表示以v2方式验证(已在配置文件中定义):

引用
# snmpwalk -v 2c -c opendata 192.168.228.148 .1|more
SNMPv2-MIB::sysDescr.0 = STRING: Linux max1 2.6.9-42.7AXsmp #1 SMP Wed Jan 10 11:12:02 EST 2007 i686
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysUpTime.0 = Timeticks: (1236742) 3:26:07.42
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: max1
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (1) 0:00:00.01
......

※ 不带OID节点参数运行的snmpwalk 也会列举MIB信息,但可能不完整。
对比:

引用
# snmpwalk -v 2c -c opendata 192.168.228.148 .1|wc -l
8392
# snmpwalk -v 2c -c opendata 192.168.228.148|wc -l
6545

如果您想看某一部分OID节点的内容,可在snmpwalk 中通过数字或名称的方式指定,下面三个命令的结果完全相同,都表示目标系统已运行的时间:

引用
# snmpwalk -v 1 -c opendata 192.168.228.148 1.3.6.1.2.1.1.3
SNMPv2-MIB::sysUpTime.0 = Timeticks: (843438) 2:20:34.38
# snmpwalk -v 1 -c opendata 192.168.228.148 iso.org.dod.internet.mgmt.mib-2.system.sysUpTime
SNMPv2-MIB::sysUpTime.0 = Timeticks: (843527) 2:20:35.27
# snmpwalk -v 1 -c opendata 192.168.228.148 SNMPv2-MIB::sysUpTime.0
SNMPv2-MIB::sysUpTime.0 = Timeticks: (1263665) 2:20:35.51

六、附录
1、在Windows 上打开SNMP 代理程序
可参考:在Windows服务器上开启SNMP代理程序 一文:

2、监控磁盘 I/O 资源
由于net-snmp 不同版本提供的agent可能不同(有些还因为Bug 的问题,给出的信息不准确)。以监控磁盘 I/O为例,必须在编译时,加上--with-mib-modules=ucd-snmp/diskio 一同编译该agent。
对于rpm 包,可在.spec 中有类似:

引用
MIBS="host agentx smux ucd-snmp/diskio disman/event-mib"
%configure \
        --enable-static --enable-shared                 \
        --with-cflags="$CFLAGS"                         \
        --with-sys-location="Unknown"                   \
        --with-logfile="/var/log/snmpd.log"             \
        --with-persistent-directory="/var/net-snmp"     \
        --with-mib-modules="$MIBS"      \
%if %{tcp_wrappers}
        --with-libwrap=%{_libdir}                       \
%endif
        --sysconfdir=%{_sysconfdir}                     \
        --enable-ipv6                                   \
        --enable-ucd-snmp-compatibility                 \
        --enable-mfd-rewrites                           \
        --with-pic                                      \
        --with-sys-contact="root@localhost" <<EOF

若已确认版本支持监控磁盘I/O资源,可由“.1.3.6.1.4.1.2021” 或“UCD-SNMP-MIB” 的OID节点得到相关信息。

引用
# snmpwalk -v 1 -c opendata 192.168.228.148 .1.3.6.1.4.1.2021|more
UCD-SNMP-MIB::memIndex.0 = INTEGER: 0
UCD-SNMP-MIB::memErrorName.0 = STRING: swap
UCD-SNMP-MIB::memTotalSwap.0 = INTEGER: 0
UCD-SNMP-MIB::memAvailSwap.0 = INTEGER: 0
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 1034448
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 629356
UCD-SNMP-MIB::memTotalFree.0 = INTEGER: 629356
UCD-SNMP-MIB::memMinimumSwap.0 = INTEGER: 16000
......
# snmpwalk -v 1 -c opendata 192.168.228.148 UCD-SNMP-MIB::ucdExperimental.15.1.1.2.19
UCD-SNMP-MIB::ucdExperimental.15.1.1.2.19 = STRING: "sda1"

表述内容如下:

引用
oid=".1.3.6.1.4.1.2021.13.15.1.1.2" 表示设备名称;
oid=".1.3.6.1.4.1.2021.13.15.1.1.3" 是rbyte;
oid=".1.3.6.1.4.1.2021.13.15.1.1.4" 是wbyte;
oid=".1.3.6.1.4.1.2021.13.15.1.1.5" 是read 块;
oid=".1.3.6.1.4.1.2021.13.15.1.1.6" 是write 块;

※ 注意:不带OID节点参数运行的snmpwalk 命令并没有提供这部分信息,用.1作为OID节点参数则可得到。

3、自助配置脚本
为方便配置,我提供一个精简版的配置脚本。不过,该脚本加入了一个可查看全部信息的组,没有打开额外的功能。

用法:

引用
# ./snmp_setup 
Please input client IP: 
( Which admit connect to this machine) 
允许连接的管理端机器IP
Please input community password: 
连接用的密码
Please input system location: 
该服务器的描述
Please input system contact: 
该服务器的描述 
******************************************* 
Client IP: 允许连接的管理端机器IP
Community password: 连接用的密码 
System location: 该服务器的描述 
System contact: 该服务器的描述 
******************************************* 
Do you confirm upper information(Yes/No): 
Yes to continue,No or other words will exit !
输入Yes或yes保存,并启动snmpd服务,其他输入信息将退出脚本。

然后用下面的命令测试连接即可:

# snmpwalk -v 2c -c 密码 已打开snmpd服务的IP .1

七、参考资料
SNMP协议开发家园
Monitoring disk IO with Net-SNMP

转:SNMP 原理及配置简述的更多相关文章

  1. SNMP 原理及配置简述 net-snmp-utils net-snmp 第2版基于SNMP 群体名(community name) 第3版引入了安全性更高的访问控制方法 SNMP协议操作只有4种 Apache的php_snmp 模块

    SNMP 原理及配置简述  net-snmp-utils  net-snmp 第2版基于SNMP 群体名(community name) 第3版引入了安全性更高的访问控制方法 SNMP协议操作只有4种 ...

  2. [转帖]keepalived工作原理和配置、使用

    keepalived工作原理和配置.使用 https://www.iteye.com/blog/aoyouzi-2288124 keepalived是什么 keepalived是集群管理中保证集群高可 ...

  3. MySQL主从复制的原理及配置

    [http://www.jb51.net/article/50053.htm]   MySQL 数据库的高可用性架构:         集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单 ...

  4. MySQL的复制原理及配置

    MySQL 的数据库的高可用性的架构大概有以下几种:集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单介绍复制的原理及配置,以及一些常见的问题. 一.复制的原理 MySQL 复制基于主服 ...

  5. Mysql中主从复制的原理、配置过程以及实际案例

    Mysql中主从复制的原理.配置过程以及实际案例1.什么是主从复制?原理:主从分离,什么意思呢?我们不妨画个图看看.如图1所示: 2.准备工作:预备两台服务器,我这里使用虚拟机安装了两个Centos6 ...

  6. Mysql主从复制原理及配置

    Mysql主从复制原理及配置 1.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其 ...

  7. Samba原理和配置

    Samba原理和配置 个人原创,转载请注明,否则追究法律责任. 一,原理及安装 1,Samba是在Linux和UNIX系统上实现在局域网上共享文件一种通信协议,它为局域网内的不同计算机之间提供文件等资 ...

  8. HAProxy原理和配置

    HAProxy原理和配置 目录 1.HAProxy简介 2.haproxy安装和配置说明 proxies配置参数 bind配置 Balance配置 基于cookie的会话绑定 统计接口启用相关的参数 ...

  9. MySQL主从复制的原理及配置方法(比较详细)

    MySQL 的数据库的高可用性的架构大概有以下几种:集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单介绍复制的原理及配置,以及一些常见的问题 一.复制的原理 MySQL 复制基于主服务 ...

随机推荐

  1. 使用Busybox制作CRAMFS文件系统成功

    转:http://www.360doc.com/content/11/1013/22/7775902_155877501.shtml 这几天在使用Busybox制作FS2410开发板的CRAMFS文件 ...

  2. matlab的输出流控制

    Matlab之print,fprint,fscanf,disp函数 print: print函数可以把函数图形保存成图片: minbnd = -4*pi; maxbnd = 4*pi; t = min ...

  3. [Java]利用javax.swing.Timer类在窗口上实现动画效果

    javax.swing.Timer类在创建时需要指定时间间隔和定时器到时间需要执行的动作,即ActionListener. Timer timer = new Timer(100, taskPerfo ...

  4. [Java]在窗口界面上画出硬盘中图片文件

    利用类javax.swing.JPanel来在窗口界面上画图.图片文件通过javax.imageio.ImageIO类来获取. import java.awt.Graphics; import jav ...

  5. C#程序输出信息到调试窗口的几种方式

    网站项目: System.Diagnostics.Debug.WriteLine("aaa"); 控制项目:Console.WriteLine("bbb"); ...

  6. 解决安装mysqlclient出现问题:mysql_config: not found

    解决安装mysqlclient出现如下问题: Complete output from command python setup.py egg_info: /bin/sh: : mysql_confi ...

  7. KMP字符串模式匹配详解(zz)

    刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的.且听详细分解: KMP字符串模式匹配详解 来自CSDN     A_B_ ...

  8. Windows安装和配置Tomcat

    1 从http://tomcat.apache.org下载Tomcat压缩包,我这里下的版本是7.0.67.   2 将Tomcat压缩包解压缩到任意路径下,我这里的解压缩路径为E:\tomcat-7 ...

  9. Java笔记15:多线程

    Java实现多线程有两种方式:一是继承Thread类:二是实现Runable接口. 一.Thread实现 publicclass ThreadDemo2 { publicstaticvoid main ...

  10. 【Web】前台传送JSON格式数据到后台Shell处理

    1.js中的json对象和字符串之间的转化:http://www.oschina.net/code/snippet_175925_6288 代码片段: var obj = JSON.parse(des ...