snmp学习笔记——配置使用trap(一)

本文是笔者学习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;

}

0 comments:

Blogger Templates by Blog Forum