本文是笔者学习net-snmp开发包时的心得,由于那个官方网站的东西比较乱,所以写一个总结,希望后来者少走些弯路
一,trap的用途 TRAP是提供从代理进程到管理站的异步报告机制。 为了使管理站能够及时而又有效地对被管理设备进行监控,同时又不过分增加网络的通信负载,必须使用陷入(TRAP)制导的轮讯过程。代理进程负责在必要时 向管理站报告异常事件,得到异常事件的报告后,管理站可以查询有关的代理,以便得到更具体的信息,对事件的原因做进一步的分析 二,trap的工作流程 1,agent端: <!--[if !supportLists]-->A, <!--[endif]-->编写mib文件,确定好trap名称等信息。 <!--[if !supportLists]-->B, <!--[endif]-->命令方式:发送各种trap命令(manager地址后面一定要加端口号162),在manager端看反应结果,在agent端无反应 以下都未实现 <!--[if !supportLists]-->C, <!--[endif]-->自动触发:配置snmpd.conf设置触发trap,系统发生某类错误时会自动触发相应类型的trap,发送给manager <!--[if !supportLists]-->D, <!--[endif]-->程序方式:一部份trap需要写c语言程序,用相应的api(send_easy_trap 或 send_v2trap)发送 2,manager端: <!--[if !supportLists]-->A, <!--[endif]-->配置snmptrapd.conf文件,设置访问权限 <!--[if !supportLists]-->B, <!--[endif]-->将mib导入到mibs文件夹中 <!--[if !supportLists]-->C, <!--[endif]-->用perl等脚本语言编写处理trap的程序 <!--[if !supportLists]-->D, <!--[endif]-->配置snmptrapd.conf文件,添加traphandler项,将不同的trap对应到不同的处理程序上 三,trap的环境配置 <!--[if !supportLists]-->1, <!--[endif]-->manager端 <!--[if !supportLists]-->a, <!--[endif]-->在/etc/hosts.allow加入允许接受的网段snmptrapd: 192.168. <!--[if !supportLists]-->b, <!--[endif]-->建立/usr/share/snmp/snmptrapd.conf(我的机器上是这个,不同机器不同,可能有的放在/etc/snmp,/usr/local/share/snmp/下,视不同情况慢慢实验),加入以下一行: authcommunity execute|log|net public 设置所有用户的访问权限:可执行,记录,传递 四,命令方式的过程 1,处理系统默认的trap 添加以下几行到snmptrapd.conf中 traphandle .1.3.6.1.6.3.1.5.1 page_me up
traphandle .1.3.6.1.4.1.2021.251.1 page_me up
traphandle .1.3.6.1.4.1.2021.251.2 page_me down
traphandle default log_it
用snmptrapd –d –f –Lo启动snmptrapd 然后在agent端输入snmptrap -v 2c -c public 192.168.213.64:162 "" UCD-SNMP-MIB::ucdStart Manager端反应: NET-SNMP version 5.3.0.1
Received 73 bytes from UDP: [192.168.213.64]:32807 0000: 30 47 02 01 01 04 06 70 75 62 6C 69 63 A7 3A 02 0G.....public.:. 0016: 04 58 92 A4 F0 02 01 00 02 01 00 30 2C 30 10 06 .X.........0,0.. 0032: 08 2B 06 01 02 01 01 03 00 43 04 03 E7 18 95 30 .+.......C.....0 0048: 18 06 0A 2B 06 01 06 03 01 01 04 01 00 06 0A 2B ...+...........+ 0064: 06 01 04 01 8F 65 81 7B 01 .....e.{.
192.168.213.64 [UDP: [192.168.213.64]:32807]: Trap , DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (65476757) 7 days, 13:52:47.57, SNMPv2-MIB::snmpTrapOID.0 = OID: UCD-SNMP-MIB::ucdStart sh: page_me: command not found 说明收到trap ucdstart并且调用对应的脚本程序,这里由于系统没有page_me这个命令,所以返回命令找不到 <!--[if !supportLists]-->2, <!--[endif]-->处理自定义trap(参考http://www.net-snmp.org/wiki/index.php/TUT:snmptrap) 编写两个mib文件,包括snmp1和snmp2两种trap Snmp1的mib:TRAP-TEST-MIB.txt TRAP-TEST-MIB DEFINITIONS ::= BEGIN
IMPORTS ucdExperimental FROM UCD-SNMP-MIB;
demotraps OBJECT IDENTIFIER ::= { ucdExperimental 990 }
demo-trap TRAP-TYPE
STATUS current
ENTERPRISE demotraps
VARIABLES { sysLocation }
DESCRIPTION "This is just a demo"
::= 17
END
Snmp2的mib:NOTIFICATION-TEST-MIB.txt NOTIFICATION-TEST-MIB DEFINITIONS ::= BEGIN
IMPORTS ucdavis FROM UCD-SNMP-MIB;
demonotifs OBJECT IDENTIFIER ::= { ucdavis 991 }
demo-notif NOTIFICATION-TYPE
STATUS current
OBJECTS { sysLocation }
DESCRIPTION "Just a test notification"
::= { demonotifs 17 }
END
然后放入到mibs文件夹中 在manager端敲入命令: snmptrap -v 2c -c public 192.168.213.64:162 "" NOTIFICATION-TEST-MIB::demo-notif SNMPv2-MIB::sysLocation.0 s "just here" agent端输出: Received 96 bytes from UDP: [192.168.213.64]:32808 0000: 30 5E 02 01 01 04 06 70 75 62 6C 69 63 A7 51 02 0^.....public.Q. 0016: 04 17 27 54 32 02 01 00 02 01 00 30 43 30 10 06 ..'T2......0C0.. 0032: 08 2B 06 01 02 01 01 03 00 43 04 03 F0 3A 1A 30 .+.......C...:.0 0048: 18 06 0A 2B 06 01 06 03 01 01 04 01 00 06 0A 2B ...+...........+ 0064: 06 01 04 01 8F 65 87 5F 11 30 15 06 08 2B 06 01 .....e._.0...+.. 0080: 02 01 01 06 00 04 09 6A 75 73 74 20 68 65 72 65 .......just here
192.168.213.64 [UDP: [192.168.213.64]:32808]: Trap , DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (66075162) 7 days, 15:32:31.62, SNMPv2-MIB::snmpTrapOID.0 = OID: UCD-SNMP-MIB::ucdavis.991.17, SNMPv2-MIB::sysLocation.0 = STRING: just here sh: log_it: command not found 其中just here就是我们想要的结果 <!--[if !supportLists]-->3, <!--[endif]-->自己编写处理trap脚本 建立root/bin/traps文件,输入以下内容 #!/bin/sh
read host
read ip
vars=
while read oid val
do
if [ "$vars" = "" ]
then
vars="$oid = $val"
else
vars="$vars, $oid = $val"
fi
done
echo trap: $1 $host $ip $vars
在manager的snmptrapd.conf加入以下几行 traphandle SNMPv2-MIB::coldStart /root/bin/traps cold traphandle SNMPv2-MIB::warmStart /root/bin/traps warm traphandle IF-MIB::linkDown /root/bin/traps down traphandle IF-MIB::linkUp /root/bin/traps up traphandle SNMPv2-MIB::authenticationFailure /root/bin/traps auth # this one is deprecated traphandle .1.3.6.1.6.3.1.1.5.6 /root/bin/traps egp-neighbor-loss
重启snmptrapd:snmptrapd –d –f –Lo 161这里要它监听161端口 在agent端输入命令: snmptrap -v 1 -c public 192.168.213.64 TRAP-TEST-MIB::demotraps 192.168.213.64 2 0 ""IF-MIB::ifIndex i 1
manager端的反应: Received 63 bytes from UDP: [192.168.213.64]:32812 0000: 30 3D 02 01 00 04 06 70 75 62 6C 69 63 A4 30 06 0=.....public.0. 0016: 0A 2B 06 01 04 01 8F 65 0D 87 5E 40 04 C0 A8 D5 .+.....e..^@.... 0032: 40 02 01 02 02 01 00 43 04 03 F1 9E 99 30 10 30 @......C.....0.0 0048: 0E 06 09 2B 06 01 02 01 02 02 01 01 02 01 01 ...+...........
2007-08-07 12:54:43 192.168.213.64(via UDP: [192.168.213.64]:32812) TRAP, SNMP v1, community public UCD-SNMP-MIB::ucdExperimental.990 Link Down Trap (0) Uptime: 7 days, 15:47:44.25 IF-MIB::ifIndex = INTEGER: 1 trap: down 192.168.213.64 UDP: [192.168.213.64]:32812 DISMAN-EVENT-MIB::sysUpTimeInstance = 7:15:47:44.25, SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkDown, IF-MIB::ifIndex = 1, SNMP-COMMUNITY-MIB::snmpTrapAddress.0 = 192.168.213.64, SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 = "public", SNMPv2-MIB::snmpTrapEnterprise.0 = UCD-SNMP-MIB::ucdExperimental.990 <!--[if !supportLists]-->4, <!--[endif]-->让agent自动产生trap 配置agent的snmpd.conf,加入以下几行:(未搞出来,可能是配置文件问题,manager端收不到任何trap) # send v1 traps
trapsink 192.168.213.64:162 public
# also send v2 traps
trap2sink 192.168.213.64:162 secret
# send traps on authentication failures
authtrapenable 1
五,下一步 仔细研究snmpd.conf和snmptrapd.conf,调试出系统自动触发trap 学习mib结构,搞清楚如何写自定义trap的mib 搞清楚例子的意思 研究一下在程序中发送trap的c语言api 学习perl,python等一种脚本语言,学会编写trap处理程序 |
http://blog.chinaunix.net/u1/43391/showart_355332.html