snmp学习笔记——配置使用trap(一)
Friday, June 12, 2009 by JSDN
本文是笔者学习net-snmp开发包时的心得,由于那个官方网站的东西比较乱,所以写一个总结,希望后来者少走些弯路
一,trap的用途
TRAP是提供从代理进程到管理站的异步报告机制。
为了使管理站能够及时而又有效地对被管理设备进行监控,同时又不过分增加网络的通信负载,必须使用陷入(TRAP)制导的轮讯过程。代理进程负责在必要时 向管理站报告异常事件,得到异常事件的报告后,管理站可以查询有关的代理,以便得到更具体的信息,对事件的原因做进一步的分析
二,trap的工作流程
1,agent端:
A, 编写mib文件,确定好trap名称等信息。
B, 命令方式:发送各种trap命令(manager地址后面一定要加端口号162),在manager端看反应结果,在agent端无反应
以下都未实现
C, 自动触发:配置snmpd.conf设置触发trap,系统发生某类错误时会自动触发相应类型的trap,发送给manager
D, 程序方式:一部份trap需要写c语言程序,用相应的api(send_easy_trap 或 send_v2trap)发送
2,manager端:
A, 配置snmptrapd.conf文件,设置访问权限
B, 将mib导入到mibs文件夹中
C, 用perl等脚本语言编写处理trap的程序
D, 配置snmptrapd.conf文件,添加traphandler项,将不同的trap对应到不同的处理程序上
三,trap的环境配置
1, manager端
a, 在/etc/hosts.allow加入允许接受的网段snmptrapd: 192.168.
b, 建立/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这个命令,所以返回命令找不到
2, 处理自定义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就是我们想要的结果
3, 自己编写处理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
4, 让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处理程序
五,程序方式
思路:让一个程序监控设备,如果设备产生了发送trap的条件,那么就编写一条snmptrap命令,新建一个进程将其发送出去。
本demo模拟这一过程,每2秒钟发送一条trap,用到的是上面最后一条命令:
snmptrap -v 1 -c public localhost:162 TRAP-TEST-MIB::demotraps localhost 2 0 "" IF-MIB::ifIndex i 1
manager端trap处理程序不变,mib不变。
Mytrap.c:
#include
#include
int main()
{
while(1){
int pid ;
int status;
if( (pid = fork()) == 0){
execl("/usr/bin/snmptrap","snmptrap","-v","1","-c","public","localhost:162","TRAP-TEST-MIB::demotraps","localhost","2","0","\"\"","IF-MIB::ifIndex","i","1",NULL);
printf("snmptrap\n");
return 0;
}
else if (pid <0){
perror("fork:");
}
else{
printf("send a trap\n");
sleep(2);
}
}
return 0;
}
一,trap的用途
TRAP是提供从代理进程到管理站的异步报告机制。
为了使管理站能够及时而又有效地对被管理设备进行监控,同时又不过分增加网络的通信负载,必须使用陷入(TRAP)制导的轮讯过程。代理进程负责在必要时 向管理站报告异常事件,得到异常事件的报告后,管理站可以查询有关的代理,以便得到更具体的信息,对事件的原因做进一步的分析
二,trap的工作流程
1,agent端:
A, 编写mib文件,确定好trap名称等信息。
B, 命令方式:发送各种trap命令(manager地址后面一定要加端口号162),在manager端看反应结果,在agent端无反应
以下都未实现
C, 自动触发:配置snmpd.conf设置触发trap,系统发生某类错误时会自动触发相应类型的trap,发送给manager
D, 程序方式:一部份trap需要写c语言程序,用相应的api(send_easy_trap 或 send_v2trap)发送
2,manager端:
A, 配置snmptrapd.conf文件,设置访问权限
B, 将mib导入到mibs文件夹中
C, 用perl等脚本语言编写处理trap的程序
D, 配置snmptrapd.conf文件,添加traphandler项,将不同的trap对应到不同的处理程序上
三,trap的环境配置
1, manager端
a, 在/etc/hosts.allow加入允许接受的网段snmptrapd: 192.168.
b, 建立/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这个命令,所以返回命令找不到
2, 处理自定义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就是我们想要的结果
3, 自己编写处理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
4, 让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处理程序
五,程序方式
思路:让一个程序监控设备,如果设备产生了发送trap的条件,那么就编写一条snmptrap命令,新建一个进程将其发送出去。
本demo模拟这一过程,每2秒钟发送一条trap,用到的是上面最后一条命令:
snmptrap -v 1 -c public localhost:162 TRAP-TEST-MIB::demotraps localhost 2 0 "" IF-MIB::ifIndex i 1
manager端trap处理程序不变,mib不变。
Mytrap.c:
#include
#include
int main()
{
while(1){
int pid ;
int status;
if( (pid = fork()) == 0){
execl("/usr/bin/snmptrap","snmptrap","-v","1","-c","public","localhost:162","TRAP-TEST-MIB::demotraps","localhost","2","0","\"\"","IF-MIB::ifIndex","i","1",NULL);
printf("snmptrap\n");
return 0;
}
else if (pid <0){
perror("fork:");
}
else{
printf("send a trap\n");
sleep(2);
}
}
return 0;
}