引用
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 系统的路由表
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
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
# 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:*
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
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%
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
......
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
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
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
%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"
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"
表述内容如下:
引用
o 是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服务,其他输入信息将退出脚本。
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