SNMP 原理及配置简述 net-snmp-utils net-snmp 第2版基于SNMP 群体名(community name) 第3版引入了安全性更高的访问控制方法 SNMP协议操作只有4种 Apache的php_snmp 模块
--http://www.linuxfly.org/post/552/
关键词
被监控机器:服务器端 只安装net-snmp
监控机器:客户端 net-snmp-utils 包
net-snmp-utils 包提供了一些客户端软件。
查看net-snmp版本
# rpm -qa|grep net-snmp
net-snmp-5.5-54.el6_7.1.x86_64
net-snmp-libs-5.5-54.el6_7.1.x86_64
随着机器数量的增长,管理员不能像过去那样,一台台机器进行监控、解决问题,而需要借助各方工具进行统一监控和管理。利用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是:
这个OID也有一个方便读取的名称:
(请参考下面的net-snmp 实现)
※ 实际上,目前只能在OID iso.org.dod.internet.mgmt(即数字1.3.6.1.2)之下才能找到有用的数据。
常见的几个MIB II 选择的OID
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代理程序agent、一些命令行工具和一个库,这个库可用于开发支持SNMP 的应用软件。net-snmp的代理程序负责收集本地主机的信息,并通过网络把这些信息提供给SNMP管理器,这个代理程序可以扩展,例如执行Linux命令后,把命令的输出作为SNMP响应返回。这样,利用该功能,就能用SNMP监控系统上的几乎任何东西了。
官网地址:NET-SNMP
1、 配置代理程序
记住我这里说的代理程序,就是要监控的目标(服务端)。以红旗 DC Server 5.0 SP4为例,其自带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,里面有详细的例子和说明。简单来说,就是先配置验证信息,然后分组,给予权限,并分配可访问的信息。
# 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
保存后,启动服务:
查看端口是否已经打开:
udp 0 0 0.0.0.0:161 0.0.0.0:*
2、管理器连接
记住,这里的管理器实际上就是客户端。因为上面指定了允许访问的IP,因此,只能通过该IP 进行访问。net-snmp-utils 包提供了一些客户端软件。包括:
snmpdf 通过SNMP监视远程主机的磁盘空间
snmpget 从一个代理得到一个SNMP变量的值
snmpgetnext 从序列中获得下一个变量
snmpset 设置代理商的一个SNMP变量
snmptable 得到一个SNMP变量表
snmptranslate 搜索并说明MIB结构中的OID
snmptrap 生成一次trap 告警
snmpwalk 从某个特定的OID开始遍历MIB
这些命令很好用,可放在shell 中利用脚本进行监控。当然,还可以用perl 、php 等函数来获取或设置SNMP Agent。
例如:
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方式验证(已在配置文件中定义):
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信息,但可能不完整。
对比:
8392
# snmpwalk -v 2c -c opendata 192.168.228.148|wc -l
6545
如果您想看某一部分OID节点的内容,可在snmpwalk 中通过数字或名称的方式指定,下面三个命令的结果完全相同,都表示目标系统已运行的时间:
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 中有类似:
%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节点得到相关信息。
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.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、自助配置脚本
为方便配置,我提供一个精简版的配置脚本。不过,该脚本加入了一个可查看全部信息的组,没有打开额外的功能。
用法:
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服务,其他输入信息将退出脚本。
然后用下面的命令测试连接即可:
[原]激活Windows下Apache的php_snmp 模块支持!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[原]使用SNMP监控Heartbeat状态
[原]自定义SNMP Agent
[原]使用MRTG画图进行监控