Snmp实践与总结
一、Snmp简介
什么是SNMP
SNMP:“简单网络管理协议”,用于网络管理的协议。SNMP用于网络设备的管理。SNMP的工作方式:管理员需要向设备获取数据,所以SNMP提供了“读”操作;管理员需要向设备执行设置操作,所以SNMP提供了“写”操作;设备需要在重要状况改变的时候,向管理员通报事件的发生,所以SNMP提供了“Trap”操作。
如上图,snmp分为Agent端和Manger端。Agent端用于对设备、磁盘、进程等相关信息进行监控,当有异常信息时,上报snmp报文。
Snmp 的Manger端负责对snmp报文的接收和进行相应的处理。
相应的数字表示(对象标识符OID,唯一标识一个MIB对象)为:
1.3.6.1.2.1.4.3
图2 MIB树结构
当网络管理协议在报文中使用MIB变量时,每个变量名后还要加一个后缀,以作为该变量的一个实例。每个对象都能够通过如上结构的数字构成的OID进行唯一标识。
二、snmp的安装
1)以网络下载的方式安装
本地验证使用的是Ubuntu环境,直接使用aapt-get install snmpd安装即可。
2) 以源码包编译的方式安装
首先在http://sourceforge.net/projects/net-snmp/files/net-snmp/5.7.1/ 网址下载最新的snmp源码包
放到指定目录后,tar -xvf net-snmp-5.7.1.tar.gz 进行解压
然后cd 到net-tar -xvfnet-snmp-5.7.1目录。
执行 ./configure 然后,选型都使用默认值即可
然后执行 make 命令。最后执行make install命令。
安装的时候执行make命令的时候可能会报错。因为用的linux系统里不一定装了libperl-dev 。
在没有安装libperl-dev 的情况下,make会报错如下:
make[1]: *** [libnetsnmpagent.la] Error 1
解决办法:
手动安装libperl-dev
我本地用的是ubuntu,如下为ubuntu的安装办法。如果你使用的不是ubuntu,是suse或者别的操作系统,可以考虑使用yum或者下载rpm包后用rpm -ivh的方式安装。
1.安裝Perl
apt-get install perl libperl-dev
2. 修改 /etc/ld.so.conf,增加下列內容
/lib
/usr/lib
/usr/local/lib
3.重新读取 library database
ldconfig
4.安裝Net-SNMP
make
make install
结果如下:
make的结果:
安装后结果
三、snmpd的配置
Snmp的Agent端主要通过配置snmpd.conf文件进行监控和管理。
###############################################################################
#
# ACCESS CONTROL
#
# system + hrSystem groups only
view systemonly included .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.25.1
如上内容,为snmpd.conf样例中默认有的内容。View可用于配置snmp可被snmpwalk查看和浏览的OID范围。
#
# Process Monitoring
#
# At least one 'mountd' process
proc mountd
# No more than 4 'ntalkd' processes - 0 is OK
proc ntalkd 4
# At least one 'sendmail' process, but no more than 10
proc sendmail 10 1
如上 proc 用于监控snmpd服务部署的环境的系统进程运行情况。
proc ProcessName MAX MIN
如上为prco的设置格式。proc后面跟的是 进程的名字。MAX和MIN分别代表该进程名对应的进程实例在系统中可运行的最大数量和最小数量[MIN,MAX],当不在该范围时,就会产生对应snmp报文信息。
当MAX和MIN都不设置时,默认表示1到无穷大,只要有一个对应进程名的实例在运行即可。
Proc 对应的 OID是.1.3.6.1.4.1.2021.2.1
Walk proc监控信息也可以使用UCD-SNMP-MIB::prTable
如下:
可以walk的前提是snmpd.conf文件里配置了view的权限,否则就会看不到内容
root@ubuntu:/usr/software/net-snmp-5.7.1# snmpwalk -v 2c -c public 127.0.0.1 UCD-SNMP-MIB::prTable
UCD-SNMP-MIB::prTable = No more variables left in this MIB View (It is past the end of the MIB tree)
如上,当没有配置对应OID权限的时候就会看不到具体内容。
增加OID范围:
对于proc监控,可以在有进程异常时,使用procfix进行修复,将进程拉起。
#
# Disk Monitoring
#
# 10MBs required on root disk, 5% free on /var, 10% free on all other disks
disk / 10000
disk /var 5%
includeAllDisks 10%
# Walk the UCD-SNMP-MIB::dskTable to see the resulting output
# Note that this table will be empty if there are no "disk" entries in the snmpd.conf file
如上为设置disk的监控内容。disk后面跟具体的目录,最后面设置磁盘路径的大小或者磁盘的空闲度。当对应磁盘路劲不满足时就会报snmp报文信息。
Disk的walk和proc类似。
#trap2sink localhost public
# send SNMPv2c INFORMs
#informsink localhost public
Trap2sink 用于将报文信息发送到指定地址,并指定发送的用户。在发送时可以在目的地址上加上端口号
例如:trap2sink 127.0.0.1:171 public
指令简介:
·#号后为内容注释。
·trapsink: 指明信息发送的snmptrapd地址,1版本。
·trap2sink:指明信息发送的snmptrapd地址,2c版本。
·authtrapenable:决定是否发送身份验证失败信息。1为发送,2为不发送。
·rwuser:建立读写权限用户。
·iquerySecName:指定内部查询用户名。
·linkUpDownNotifications:在建立断开链接的时候发送通知。
·defaultMonitors:打开默认监视项。其中包括进程,磁盘等的监视,必须打开此项,否则进程,磁盘等的监视信息不会被发出。
·proc:监视指定进程,当进程数不在指定的范围时将特定标志位置1,但是不会发出trap信号,需要打开defaultMonitors,由其发送trap信号。
·disk:监视磁盘剩余空间,当剩余空间小于指定值时将特定标志位置1,同proc。
·load:系统负载,指定1,5,15分钟的系统负载,超过阈值后处理方法同proc。
·notificationEvent:自定义通知事件。
·monitor:监视指定事件。
四、Snmptrapd的配置
Snmpd相当于snmp的Agent端。Snmptrapd相当于snmp的Manager端。Snmptrapd可以配置接收snmp报文。并对报文进行过滤和进行相应的处理。
一般在snmptrapd.conf文件中首先配置
authCommunity log,execute,net public
这条指令指明以“public”为“community”请求的snmp “notification”允许的操作。
设置所有用户的访问权限:可执行,记录,传递
然后设置 traphandle,用于在snmptrapd接收到指定OID的报文信息时,做相应的处理操作。
traphandle .1.3.6.1.4.1.2021.251.1 my_command
如上,当收到.1.3.6.1.4.1.2021.251.1 对应的报文信息时,snmptrapd会调用my_command
命令。
traphandle .1.3.6.1.4.1.2021.251.1 /root/traptest/test.pl
或者如上,当收到.1.3.6.1.4.1.2021.251.1 对应的报文信息时,snmptrapd会调用/root/traptest/test.pl脚本。
traphandle .1.3.6.1.4.1.2021.251.1 /root/traptest/test.pl test_param
如上,当收到.1.3.6.1.4.1.2021.251.1 对应的报文信息时,snmptrapd会调用/root/traptest/test.pl脚本,并给脚本传递参数 test_param 。
Forward 选项
forward default/OID destination
如上,forward选项可以用于转发指定OID报文或者全部报文信息到指定的目的地址,目的地址上可以跟具体的端口号。默认162端口。
traphandle 后面也可以跟default,表示默认所有OID。
snmpTrapAddr 选项
snmpTrapAddr udp:127.0.0.1:171
如上格式,snmpTrapAddr能够指定snmptrapd 接收报文的端口。默认使用端口是162. 当162 端口被占用时,启动snmptrapd 会报错失败。在不能使用默认端口的时候,可以通过snmpTrapAddr指定其他端口用于接收报文。
使用 lsof -i:162 命令可以查看162端口被哪个进程占用。
如图:lsof –i:22 可以看到22号端口被ssh服务占用了。
五、Snmp 其他命令
· snmptrap:可以模拟snmp agent发送一个trap到snmp管理端(一般称为网管,snmp manager或snmp client);
· snmpinform:可以模拟snmp agent发送一个inform request到snmp管理端(Trap是发送给SNMP管理者的通知网络状况等的警告消息,而Inform是需要SNMP管理者确认接收的Trap。与Inform相比较,Trap通知方式为不可靠传输,因为snmp管理端在收到一条Trap通知后无需回复任何确认信息,所以snmp agent无法知道Trap通知是否已经被snmp管理端正确接收);
· snmptrapd:一个模拟snmp管理端接收trap/inform通知的程序;
snmptrap |
-v1 |
-c public |
10.10.12.219 |
1.3.6.1.4.1.1 |
10.10.12.219 |
2 |
3 |
1000 |
命令 |
Snmp协议版本 |
共同体 |
Snmp管理端IP |
Enterprise-OID |
Snmp代理IP |
Trap类型 |
Trap特征码 |
uptime |
1.3.6.1.9.9.44.1.2.1 |
I |
12 |
12 1.3.4.1.2.3.1 |
s |
test_snmptrap |
被发送参数的OID |
数据类型 |
数据值 |
被发送参数的OID |
数据类型 |
数据值 |
如上,snmptrap的可以模拟发送报文信息
snmptrap -v 2c -c public 127.0.0.1 "" .1.3.6.1.4.1.2021.251.1 sysLocation.0 s "test_info"
snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户。通过snmpwalk也可以查看支持SNMP协议(可网管)的设备的一些其他信息,比如cisco交换机或路由器IP地址、内存使用率等,也可用来协助开发SNMP功能。
snmpwalk语法:
snmpwalk 交换机或路由器IP地址 -c SNMP读密码 -v 1或2(代表SNMP版本) OID(对象标示符)
用法举例:
1、snmpwalk -c public -v 1 -m ALL 127.0.0.1 .1.3.6.1.2.1.25.1 得到取得windows端的系统进程用户数等
2、snmpwalk -c public -v 1 -m ALL 127.0.0.1 .1.3.6.1.2.1.25.2.2 取得系统总内存
3、snmpwalk -c public -v 1 -m ALL 127.0.0.1 hrSystemNumUsers
4、snmpwalk -c public -v 1 -m ALL 127.0.0.1 .1.3.6.1.2.1.4.20 取得IP信息
5、snmpwalk -v 2c -c public 127.0.0.1 system 查看系统信息
6、snmpwalk -v 1 127.0.0.1 -c public ifDescr
7、如果你也不知道具体参数,那么就执行snmpwalk -v 2c -c public 127.0.0.1,就可以看到所有信息。
六、Snmp 发送和接收验证
配置snmpd.conf文件
agentAddress udp:127.0.0.1:161
# system + hrSystem groups only
view systemonly included .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.25.1
view systemonly included .1.3.6.1.4.1
# Full access from the local host
#rocommunity public localhost
# Default access to basic system info
rocommunity public default -V systemonly
#rocommunity secret 10.0.0.0/16
# Full read-only access for SNMPv3
rouser authOnlyUser
# Full write access for encrypted requests
# Remember to activate the 'createUser' lines above
sysLocation Sitting on the Dock of the Bay
sysContact Me <me@example.org>
# Application + End-to-End layers
sysServices 72
#
# Process Monitoring
#
# At least one 'mountd' process
proc mountd
# No more than 4 'ntalkd' processes - 0 is OK
proc ntalkd 4
# At least one 'sendmail' process, but no more than 10
proc sendmail 10 1
# Walk the UCD-SNMP-MIB::prTable to see the resulting output
# Note that this table will be empty if there are no "proc" entries in the snmpd.conf file
#
# Disk Monitoring
#
# 10MBs required on root disk, 5% free on /var, 10% free on all other disks
disk / 10000
disk /var 5%
includeAllDisks 10%
load 12 10 5
# Walk the UCD-SNMP-MIB::laTable to see the resulting output
# Note that this table *will* be populated, even without a "load" entry in the snmpd.conf file
# send SNMPv1 traps
trapsink localhost public
iquerySecName internalUser
rouser internalUser
# generate traps on UCD error conditions
defaultMonitors yes
# generate traps on linkUp/Down
linkUpDownNotifications yes
# Run as an AgentX master agent
master agentx
如上,配置内容为安装snmp的时候就会自带的样例内容,增加view的范围,其他的内容不变。
直接输入snmpd就可以启动snmpd服务。
配置snmptrapd.conf文件
增加一行内容 authCommunity log,execute,net public
把snmptrapd.conf文件放到一指定目录。我的本地是放到和snmp.conf同一目录. /usr/local/share/snmp目录
snmptrapd -C -c /usr/local/share/snmp/snmptrapd.conf -df -Lo 的方式启动snmptrapd服务。
(注: snmptrapd -C -c /usr/local/share/snmp/snmptrapd.conf -df -Lf /tmp/log.txt的方式可以把接收的snmp报文输出到指定文件中)
启动snmpd服务。
如上,当启动snmpd的时候,snmptrapd接收到proc进程异常的snmp报文信息。
(注:snmpd服务启动后,监测到有进程等异常信息后,只会主动报一次snmp报文,不会多次上报。因此为了演示,重新启动了一下snmpd)
使用snmptrap模拟发送报文:
snmptrap -v 2c -c public 127.0.0.1 "" .1.3.6.1.4.1.2021.251.1 sysLocation.0 s "test_info"
如上,在一个终端界面输入以上信息:
在snmptrapd的启动终端查看:
如图所示,收到了刚才snmptrap模拟发送的报文信息。
如上,基本展示了snmp的发送与接收基本实现。
总结:
以上都只是snmp的基础理论知识和安装使用说明,以及snmp Agent端监控发送报文信息,snmptrapd接收报文信息的最基本的模拟。
Snmp还有很多高级用法,以及使用snmp可以监控的很多东西还没能在本文中详细研究和展示。