1. 程式人生 > >snmp trap入門

snmp trap入門

更多資訊在http://www.ibm.com/developerworks/cn/linux/l-cn-snmp/

SNMP(Simple Network Management Protocol) trap是一種很有用,但是也容易讓人難以理解的協議。雖然名字叫做簡單網路管理協議,但實際上並不是字面上的意思,尤其是看到.1.3.6.1.2.1.1.1.0這樣一串串詭異的數字時候,就會有點讓人崩潰。

不管怎麼說,現在所有的網路裝置的都需要支援SNMP。而且現在還有很多的開源的網路管理系統,所以就有利於我們來學習和理解SNMP。SNMP trap是由被管理的裝置主動的向管理伺服器傳送裝置的異常情況,可以看成是管理伺服器被動的去接收的過程。所以會有很多的工具會把snmptrap整合到自己的工具中,對網路裝置進行監控。


Francois Meehan在Sysadmin magazine發表過

一篇文章是關於把SNMP trap整合的到Nagios當中的,大體的工作流程是:
1. 由snmptrapd來接收網路裝置發出的trap
2. snmptrapd呼叫snmptt(snmp trap translator 翻譯器)
3. snmptt中定義了每一種trap的級別,以及什麼樣的trap才有必要寫入到syslog中
4. SEC(simple event correlator是一個事件收集器)從syslog中讀取每一個事件,並把呼叫使用者的指令碼snmptraphandling.py 來處理。
5. snmptraphandling.py 會呼叫根據主機名和trap的級別來呼叫相當的Nagios命令列。

這個過程包含了很多層,所以感覺很複雜,還是深入進去看看snmptrapd是怎麼工作的。從而儘可能簡化snmptrap的使用方法。

snmptrapd來自開源軟體Net-SNMP. Net-SNMP會有很多的用途,當然使用trap也是一個很有用的用途。當snmptrapd接收到trap以後,可以呼叫使用者自定義的指令碼或者命令列來處理trap。如果想使用這個功能就需要在snmptrapd的配置檔案中設定traphandle。 snmptrapd接收到的trap資訊格式是:
1. 資料包來源的主機名字。
2. 資料包來源的ip地址。
3. 資料包中的內容。

traphandle的工作就是讀取這些內容並進行處理就可以了。

trap資訊例子:

cisco2611.lon.altinity
192.168.10.20
RFC1213-MIB::sysUpTime.0 0:18:14:45.66
SNMPv2-MIB::snmpTrapOID.0 IF-MIB::linkDown
RFC1213-MIB::ifIndex.2 2
RFC1213-MIB::ifDescr.2 "Serial0/0"
RFC1213-MIB::ifType.2 ppp
OLD-CISCO-INTERFACES-MIB::locIfReason.2 "administratively down"
SNMP-COMMUNITY-MIB::snmpTrapAddress.0 192.168.10.20
SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 "public"
SNMPv2-MIB::snmpTrapEnterprise.0 CISCO-SMI::ciscoProducts.186



因為snmptt對trap資訊中的OID進行了翻譯,如果不進行翻譯的話,那麼trap資訊的樣子應該是

cisco2611.lon.altinity
192.168.10.20
.1.3.6.1.2.1.1.3.0 0:18:13:59.95
.1.3.6.1.6.3.1.1.4.1.0 .1.3.6.1.6.3.1.1.5.3
.1.3.6.1.2.1.2.2.1.1.2 2
.1.3.6.1.2.1.2.2.1.2.2 "Serial0/0"
.1.3.6.1.2.1.2.2.1.3.2 ppp
.1.3.6.1.4.1.9.2.2.1.1.20.2 "administratively down"
.1.3.6.1.6.3.18.1.3.0 192.168.10.20
.1.3.6.1.6.3.18.1.4.0 "public"
.1.3.6.1.6.3.1.1.4.3.0 .1.3.6.1.4.1.9.1.186

這就說明了,snmptt擁有自己的配置檔案,檔案中包含了OID和對應的屬性名,並且是使用OID來進行索引的。如果snmptt在配置檔案中無法找到對應的OID的話,那麼snmptt也就無法對資訊進行翻譯,我們看到的資訊內容也就是原始的格式了。

snmptt使用的配置檔案叫做MIBs(Management Information Base管理資訊基礎),在MIBs以OID為索引的key,可以快速查詢到對應的文字形式和警告的級別。每一個MIB都有自己固定的定義格式,其中會包含一個巨集(用來說明要顯示資訊的內容)。

可是為什麼要有MIBs的存在呢?直接由snmptrapd來完成OID到資訊的翻譯不可以麼?
1. MIBs是可以由使用者自己來定義,使用的。因為各廠商對trap資訊定義的內容肯定是不同的,所以想要snmp有一定的擴充套件性,那麼就必須要支援使用者自定義MIBs檔案。這也就是MIBs存在的原因。
2. 如果由snmptrapd自己來完成翻譯也是可以的,因為如果每次都去通過檢索OID對應的訊息的話,那對效能的影響是非常的大的,因此snmptrapd就需要讀入MIBs。問題也就出現了,如果更新MIBs話,就要把snmptrapd重新啟動,必定會影響到trap訊息的接收。所以把snmptt作為一個獨立的deamon存在是很正確的選擇。

最後要做的事情就是新增traphandle了,handle會影響到snmptrap的接收效能,所以處理的速度要快,因為handle有可能1秒中會有數百次的呼叫。
 這樣以來上面的處理流程就可以進行簡化的:
1. snmptrapd接收到trap的資訊
2. snmptrapd呼叫handle(如果不是呼叫現有的命令的話,在handle中就可以完成所有的處理了,就沒有下面的處理了。又節省了一步,哈哈)
3. handle中再呼叫Nagios的命令列就可以了

這樣一看流程就簡單許多了,以後再使用snmptrap的時候也可以參考這個處理的流程