免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2559 | 回复: 0
打印 上一主题 下一主题

snmp学习笔记——配置使用trap [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-06 16:09 |只看该作者 |倒序浏览


本文是笔者学习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 uptraphandle .1.3.6.1.4.1.2021.251.1  page_me uptraphandle .1.3.6.1.4.1.2021.251.2  page_me downtraphandle 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
                        perror("fork:");
                }
                else{
                        printf("send a trap\n");
                        sleep(2);
                }
        }
        return 0;
}




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/80698/showart_1777662.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP