本文是筆者學習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中
用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
Snmp2的mib:NOTIFICATION-TEST-MIB.txt
在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檔案,輸入以下内容
在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)
五,下一步
仔細研究snmpd.conf和snmptrapd.conf,調試出系統自動觸發trap
學習mib結構,搞清楚如何寫自定義trap的mib
搞清楚例子的意思
研究一下在程式中發送trap的c語言api
學習perl,python等一種腳本語言,學會編寫trap處理程式