snmp学习笔记——配置使用trap

本文是笔者学习net-snmp开发包时的心得,由于那个官方网站的东西比较乱,所以写一个总结,希望后来者少走些弯路


一,trap的用途

TRAP是提供从代理进程到管理站的异步报告机制。

为了使管理站能够及时而又有效地对被管理设备进行监控,同时又不过分增加网络的通信负载,必须使用陷入(TRAP)制导的轮讯过程。代理进程负责在必要时 向管理站报告异常事件,得到异常事件的报告后,管理站可以查询有关的代理,以便得到更具体的信息,对事件的原因做进一步的分析

二,trap的工作流程

1agent端:

<!--[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语言程序,用相应的apisend_easy_trap send_v2trap)发送

2manager端:

<!--[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文件,包括snmp1snmp2两种trap

Snmp1mibTRAP-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

Snmp2mibNOTIFICATION-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

 

managersnmptrapd.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

 

重启snmptrapdsnmptrapd 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

配置agentsnmpd.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.confsnmptrapd.conf,调试出系统自动触发trap

学习mib结构,搞清楚如何写自定义trapmib

搞清楚例子的意思

研究一下在程序中发送trapc语言api

学习perlpython等一种脚本语言,学会编写trap处理程序

http://blog.chinaunix.net/u1/43391/showart_355332.html

你可能感兴趣的:(manager,command,脚本,Authentication,语言,variables)