snmp從入門到開發(fā)詳解
1) 一個管理信息庫MIB(Management InformaTIon Base)。管理信息庫包含所有代理進(jìn)程的所有可被查詢和修改的參數(shù)。RFC 1213[McCloghrie and Rose 1991]定義了第二版的MIB,叫做MIB-II。
2) 關(guān)于MIB的一套公用的結(jié)構(gòu)和表示符號。叫做管理信息結(jié)構(gòu)SMI(Structure of Management InformaTIon)。這個在RFC 1155 [Rose and McCloghrie 1990] 中定義。例如:SMI定義計數(shù)器是一個非負(fù)整數(shù),它的計數(shù)范圍是 0~4294967295,當(dāng)達(dá)到最大值時,又從0開始計數(shù)。
3) 管理進(jìn)程和代理進(jìn)程之間的通信協(xié)議,叫做簡單網(wǎng)絡(luò)管理協(xié)議SNMP(Simple Network Management Protocol)。在RFC 1157 [Case et al. 1990]中定義。SNMP包括數(shù)據(jù)報交換的格式等。盡管可以在傳輸層采用各種各樣的協(xié)議,但是在SNMP中,用得最多的協(xié)議還是UDP。
一、SNMP協(xié)議概述
簡單網(wǎng)絡(luò)管理協(xié)議(SNMP:Simple Network Management Protocol)是由互聯(lián)網(wǎng)工程任務(wù)組(IETF:Internet Engineering Task Force )定義的一套網(wǎng)絡(luò)管理協(xié)議。該協(xié)議基于簡單網(wǎng)關(guān)監(jiān)視協(xié)議(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一個管理工作站可以遠(yuǎn)程管理所有支持這種協(xié)議的網(wǎng)絡(luò)設(shè)備,包括監(jiān)視網(wǎng)絡(luò)狀態(tài)、修改網(wǎng)絡(luò)設(shè)備配置、接收網(wǎng)絡(luò)事件警告等。 雖然SNMP開始是面向基于IP的網(wǎng)絡(luò)管理,但作為一個工業(yè)標(biāo)準(zhǔn)也被成功用于電話網(wǎng)絡(luò)管理。
二、SNMP的發(fā)展史SNMP經(jīng)過了一個相對較長的發(fā)展過程,到目前為止一共經(jīng)歷了三個版本。當(dāng)下使用最廣泛是SNMPv2。
1989年發(fā)布了第一個版本的SNMP,稱為SNMPv1。
1991年發(fā)布SNMP的一個補(bǔ)充---RMON(Remote Network Monitoring,遠(yuǎn)程網(wǎng)絡(luò)監(jiān)視)。RMON擴(kuò)充了SNMP的功能,包括對LAN的管理以及對依附于這些網(wǎng)絡(luò)設(shè)備的管理。注:RMON沒有修改和增加SNMP協(xié)議本身以及SMI,只是增加了SNMP監(jiān)視子網(wǎng)的能力,把整個子網(wǎng)當(dāng)成一個個體來監(jiān)視,提供了新的MIB庫及相關(guān)的MIB行為。
1993年SNMPv1的升級版被提出,SNMPv2。
1995年SNMPv2正式發(fā)布,v2增加了SNMPv1的功能,并規(guī)定了如何在基于OSI的網(wǎng)絡(luò)中使用SNMP。同時RMON于本年度擴(kuò)展為RMONv2
1998年SNMPv3發(fā)布,一系列文檔定義了SNMP的安全性,并定義了將來改進(jìn)的總體結(jié)構(gòu)。SNMPv3可以和v2、v1一起使用。
三、SNMP的工作原理SNMP采用特殊的客戶機(jī)/服務(wù)器模式,即代理/管理站模型。對網(wǎng)絡(luò)的管理與維護(hù)是通過管理工作站與SNMP代理間的交互工作完成的。每個SNMP從代理負(fù)責(zé)回答SNMP管理工作站(主代理)關(guān)于MIB定義信息的各種查詢。
SNMP的應(yīng)用場景如圖1所示:
管理站和代理端使用MIB進(jìn)行接口統(tǒng)一,MIB定義了設(shè)備中的被管理對象。管理站和代理都實(shí)現(xiàn)相應(yīng)的MIB對象,使得雙方可以識別對方的數(shù)據(jù),實(shí)現(xiàn)通信。管理站向代理請求MIB中定義的數(shù)據(jù),代理端識別后,將管理設(shè)備提供的相關(guān)狀態(tài)或參數(shù)等數(shù)據(jù)轉(zhuǎn)換成MIB定義的格式,最后將該信息返回給管理站,完成一次管理操作。
四、SNMP的報文類型SNMP中定義了五種消息類型:Get-Request、Get-Response、Get-Next-Request、Set-Request和Trap 。
?。?)Get-Request 、Get-Next-Request與Get-Response
SNMP 管理站用Get-Request消息從擁有SNMP代理的網(wǎng)絡(luò)設(shè)備中檢索信息,而SNMP代理則用Get-Response消息響應(yīng)。Get-Next- Request用于和Get-Request組合起來查詢特定的表對象中的列元素。
?。?)Set-Request
SNMP管理站用Set-Request 可以對網(wǎng)絡(luò)設(shè)備進(jìn)行遠(yuǎn)程配置(包括設(shè)備名、設(shè)備屬性、刪除設(shè)備或使某一個設(shè)備屬性有效/無效等)。
?。?)Trap
SNMP代理使用Trap向SNMP管理站發(fā)送非請求消息,一般用于描述某一事件的發(fā)生,如接口UP/DOWN,IP地址更改等。
上面五種消息中Get-Request、Get-Next-Request和Set-Request是由管理站發(fā)送到代理側(cè)的161端口的;后面兩種Get-Response和Trap 是由代理進(jìn)程發(fā)給管理進(jìn)程的,其中Trap消息被發(fā)送到管理進(jìn)程的162端口,所有數(shù)據(jù)都是走UDP封裝。SNMP工作流程如圖2:
五、SNMP的報文格式
SNMP代理和管理站通過SNMP協(xié)議中的標(biāo)準(zhǔn)消息進(jìn)行通信,每個消息都是一個單獨(dú)的數(shù)據(jù)報。SNMP使用UDP(用戶數(shù)據(jù)報協(xié)議)作為第四層協(xié)議(傳輸協(xié)議),進(jìn)行無連接操作。SNMP消息報文包含兩個部分:SNMP報頭和協(xié)議數(shù)據(jù)單元PDU。
在實(shí)際網(wǎng)絡(luò)傳輸環(huán)境下,SNMP報文的長度取決于其所采用的編碼方式。SNMP統(tǒng)一采用BER(Basic Encoding Rule)的編碼規(guī)則,同時在正式SNMP規(guī)范中使用的是ASN.1語法,Abastract Syntax NotaTIon v1,即抽象語法描述語言。這兩個概念在后面實(shí)踐環(huán)節(jié)再做進(jìn)一步介紹,這里只要稍微了解一下即可,不妨礙我們對協(xié)議本身的分析。這里我們簡單解釋一下BER編碼規(guī)則:
BER作為ANS.1的基本編碼規(guī)則,描述具體的ANS.1對象如何編碼為比特流在網(wǎng)絡(luò)上進(jìn)行傳輸。BER編碼規(guī)則由三部分組成:
SNMP中定義了幾種基本的數(shù)據(jù)類型,其中v1和v2版有些改動,具體參見相應(yīng)的RFC文檔。這里我們只介紹幾種最常見的類型:
l INTEGER:一個整數(shù)
l OCTER STRING: 0或多個8bit字節(jié),每個字節(jié)在0~255之間取值
l DisplayString:0或多個8bit字節(jié),每個字節(jié)必須是ASCII碼。在MIB-II中,所有該類型變量不能超過255個字符(0個字符可以)
l NULL:代表相關(guān)的變量沒有值
l IpAddress:4字節(jié)長的OCTER STRING,以網(wǎng)絡(luò)字節(jié)序表示IP地址
l PhyAddress:6字節(jié)長的OCTER STRING,代表物理地址
l Counter:非負(fù)整數(shù),可以從0遞增到232-1()。達(dá)到最大值后歸0
l TImeTicks:時間計數(shù)器,以0.01秒為單位遞增,不同的變量可以有不同的遞增幅度。所以在定義這種類型的變量時需要制定遞增幅度
l SEQUENCE:與C語言中的結(jié)構(gòu)體類似
l SEQUENCE OF:一個向量,參見后面ANS.1語法詳細(xì)介紹章節(jié)
SNMP報文在傳輸層是封裝在UDP報文中的,而UDP又是基于IP網(wǎng)絡(luò)的,因此,我們可以得到完整的報文描述結(jié)構(gòu),如下圖所示:
PDU類型其實(shí)包含兩個字節(jié),第一個字節(jié)表示真實(shí)的PDU的類型;第二個字節(jié)表示后面報文所占的字節(jié)總數(shù)。針對SNMPv1,這個字段取值如下:
表1 PDU類型
PDU類型 名稱代理進(jìn)程對自己初始化
1warmStart一個接口已從工作狀態(tài)變?yōu)楣收蠣顟B(tài)(報文中的第一個變量標(biāo)識此接口)
3linkUp從SNMP管理進(jìn)程收到無效共同體的報文
5egpNeighborLoss地址)
6enterpriseSpecific《span times=“” new=“” roman“;=”“ mso-hansi-font-family:”times=“” roman“;mso-bidi-font-family:”times=“” mso-font-kerning:0pt“=”“ style=”word-wrap: break-word; font-size: 9pt; font-family: 宋體;“》在這個特定的代碼段中查找trap信息
通過wireshark抓包工具,捕獲一條如下的SNMP報文,接下來對其進(jìn)行仔細(xì)分析。
其余部分都為SNMP報文,接下來我們對照前面的報文結(jié)構(gòu)體來逐個分析一下。
SNMPv2 Trap報文
SNMPv2的Trap報文格式如圖8所示:
同樣的,這里除了trap類型和報文長度是標(biāo)準(zhǔn)網(wǎng)絡(luò)字節(jié)序之外,其余協(xié)議字段也均為BER編碼方式??梢钥吹絭2版的trap報文正在向統(tǒng)一的報文格式發(fā)展,已經(jīng)非常類似普通的SNMP請求、響應(yīng)報文了。
SNMPv2原始報文內(nèi)容:
余下部分全為SNMP報文內(nèi)容,這里我們做一下簡單的約定:
xx 標(biāo)注類型;xx 標(biāo)注長度;xx 標(biāo)注真正的數(shù)據(jù)。
這樣一來上面這串原始數(shù)據(jù)就好分析多了J