基于TCP/IP的網絡管理包含3個組成部分:
1) 一個管理信息庫MIB(Management Information Base)。管理信息庫包含所有代理進程的所有可被查詢和修改的參數。RFC 1213[McCloghrie and Rose 1991]定義了第二版的MIB,叫做MIB-II。
2) 關于MIB的一套公用的結構和表示符號。叫做管理信息結構SMI(Structure of Management Information)。這個在RFC 1155 [Rose and McCloghrie 1990] 中定義。例如:SMI定義計數器是一個非負整數,它的計數范圍是 0~4294967295,當達到最大值時,又從0開始計數。
3) 管理進程和代理進程之間的通信協議,叫做簡單網絡管理協議SNMP(Simple Network Management Protocol)。在RFC 1157 [Case et al. 1990]中定義。SNMP包括數據報交換的格式等。盡管可以在傳輸層采用各種各樣的協議,但是在SNMP中,用得最多的協議還是UDP。
一、SNMP協議概述
簡單網絡管理協議(SNMP:Simple Network Management Protocol)是由互聯網工程任務組(IETF:Internet Engineering Task Force )定義的一套網絡管理協議。該協議基于簡單網關監視協議(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一個管理工作站可以遠程管理所有支持這種協議的網絡設備,包括監視網絡狀態、修改網絡設備配置、接收網絡事件警告等。 雖然SNMP開始是面向基于IP的網絡管理,但作為一個工業標準也被成功用于電話網絡管理。
二、SNMP的發展史
SNMP經過了一個相對較長的發展過程,到目前為止一共經歷了三個版本。當下使用最廣泛是SNMPv2。
1989年發布了第一個版本的SNMP,稱為SNMPv1。
1991年發布SNMP的一個補充---RMON(Remote Network Monitoring,遠程網絡監視)。RMON擴充了SNMP的功能,包括對LAN的管理以及對依附于這些網絡設備的管理。注:RMON沒有修改和增加SNMP協議本身以及SMI,只是增加了SNMP監視子網的能力,把整個子網當成一個個體來監視,提供了新的MIB庫及相關的MIB行為。
1993年SNMPv1的升級版被提出,SNMPv2。
1995年SNMPv2正式發布,v2增加了SNMPv1的功能,并規定了如何在基于OSI的網絡中使用SNMP。同時RMON于本年度擴展為RMONv2
? ?1998年SNMPv3發布,一系列文檔定義了SNMP的安全性,并定義了將來改進的總體結構。SNMPv3可以和v2、v1一起使用。
三、SNMP的工作原理
SNMP采用特殊的客戶機/服務器模式,即代理/管理站模型。對網絡的管理與維護是通過管理工作站與SNMP代理間的交互工作完成的。每個SNMP從代理負責回答SNMP管理工作站(主代理)關于MIB定義信息的各種查詢。
SNMP的應用場景如圖1所示:
管理站和代理端使用MIB進行接口統一,MIB定義了設備中的被管理對象。管理站和代理都實現相應的MIB對象,使得雙方可以識別對方的數據,實現通信。管理站向代理請求MIB中定義的數據,代理端識別后,將管理設備提供的相關狀態或參數等數據轉換成MIB定義的格式,最后將該信息返回給管理站,完成一次管理操作。
四、SNMP的報文類型
SNMP中定義了五種消息類型:Get-Request、Get-Response、Get-Next-Request、Set-Request和Trap 。
(1)Get-Request 、Get-Next-Request與Get-Response
SNMP 管理站用Get-Request消息從擁有SNMP代理的網絡設備中檢索信息,而SNMP代理則用Get-Response消息響應。Get-Next- Request用于和Get-Request組合起來查詢特定的表對象中的列元素。
(2)Set-Request
SNMP管理站用Set-Request 可以對網絡設備進行遠程配置(包括設備名、設備屬性、刪除設備或使某一個設備屬性有效/無效等)。
?。?)Trap
SNMP代理使用Trap向SNMP管理站發送非請求消息,一般用于描述某一事件的發生,如接口UP/DOWN,IP地址更改等。
上面五種消息中Get-Request、Get-Next-Request和Set-Request是由管理站發送到代理側的161端口的;后面兩種Get-Response和Trap 是由代理進程發給管理進程的,其中Trap消息被發送到管理進程的162端口,所有數據都是走UDP封裝。SNMP工作流程如圖2:
五、SNMP的報文格式
SNMP代理和管理站通過SNMP協議中的標準消息進行通信,每個消息都是一個單獨的數據報。SNMP使用UDP(用戶數據報協議)作為第四層協議(傳輸協議),進行無連接操作。SNMP消息報文包含兩個部分:SNMP報頭和協議數據單元PDU。
在實際網絡傳輸環境下,SNMP報文的長度取決于其所采用的編碼方式。SNMP統一采用BER(Basic Encoding Rule)的編碼規則,同時在正式SNMP規范中使用的是ASN.1語法,Abastract Syntax Notation v1,即抽象語法描述語言。這兩個概念在后面實踐環節再做進一步介紹,這里只要稍微了解一下即可,不妨礙我們對協議本身的分析。這里我們簡單解釋一下BER編碼規則:
BER作為ANS.1的基本編碼規則,描述具體的ANS.1對象如何編碼為比特流在網絡上進行傳輸。BER編碼規則由三部分組成:
SNMP中定義了幾種基本的數據類型,其中v1和v2版有些改動,具體參見相應的RFC文檔。這里我們只介紹幾種最常見的類型:
l INTEGER:一個整數
l OCTER STRING: 0或多個8bit字節,每個字節在0~255之間取值
l DisplayString:0或多個8bit字節,每個字節必須是ASCII碼。在MIB-II中,所有該類型變量不能超過255個字符(0個字符可以)
l NULL:代表相關的變量沒有值
l IpAddress:4字節長的OCTER STRING,以網絡字節序表示IP地址
l PhyAddress:6字節長的OCTER STRING,代表物理地址
l Counter:非負整數,可以從0遞增到232-1()。達到最大值后歸0
l TimeTicks:時間計數器,以0.01秒為單位遞增,不同的變量可以有不同的遞增幅度。所以在定義這種類型的變量時需要制定遞增幅度
l SEQUENCE:與C語言中的結構體類似
l SEQUENCE OF:一個向量,參見后面ANS.1語法詳細介紹章節
SNMP報文在傳輸層是封裝在UDP報文中的,而UDP又是基于IP網絡的,因此,我們可以得到完整的報文描述結構,如下圖所示:
PDU類型其實包含兩個字節,第一個字節表示真實的PDU的類型;第二個字節表示后面報文所占的字節總數。針對SNMPv1,這個字段取值如下:
表1 PDU類型
PDU類型 名稱代理進程對自己初始化
1warmStart一個接口已從工作狀態變為故障狀態(報文中的第一個變量標識此接口)
3linkUp從SNMP管理進程收到無效共同體的報文
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報文,接下來對其進行仔細分析。
其余部分都為SNMP報文,接下來我們對照前面的報文結構體來逐個分析一下。
SNMPv2 Trap報文
SNMPv2的Trap報文格式如圖8所示:
同樣的,這里除了trap類型和報文長度是標準網絡字節序之外,其余協議字段也均為BER編碼方式??梢钥吹絭2版的trap報文正在向統一的報文格式發展,已經非常類似普通的SNMP請求、響應報文了。
SNMPv2原始報文內容:
余下部分全為SNMP報文內容,這里我們做一下簡單的約定:
xx 標注類型;xx 標注長度;xx 標注真正的數據。
這樣一來上面這串原始數據就好分析多了J
管理信息庫:MIB
我們要擴展mib首先必須清楚mib是如何定義的,用的什么語言,有哪些約定,遵循哪些規則等等。這些基本東西掌握過后,我們就可以很輕松的來寫自己的mib文件了。
所謂管理信息庫,或者MIB,就是所有代理進程包含的、并且能夠被管理進程進行查詢和設置的信息的集合,或者叫管理對象的集合,在RFC 1213 [McColghrie 和Rose 1991]中定義了MIB-II,即第二版的MIB庫。MIB是采用SMI(RFC 1155)來定義的。SMI全稱為Structure Management Information,管理信息結構。SMI規范定義了一個基本框架,使用框架內的規范可以定義MIB,而SMI同時又是ASN.1的一個子集,它主要約定了使用到的語法、類型、宏、數據格式等。
本節知識相對來說有些枯燥,但是沒辦法,如果你要看懂mib的定義文件,并且能很靈活自如的對其進行擴展,那么這些基礎是必須夯實的。俗話說“磨刀不誤砍柴工”。
ASN.1語法
ASN.1(Abstract Syntax Notification 1),抽象語法描述語言,是一種獨立于機器的描述語言,用于描述在網絡上傳遞的消息。在SNMP中ANS.1主要用于MIB的定義,另一方面也用于協議的定義。所以理解ASN.1是理解協議、讀懂SNMP國際規范RFC、進行SNMP開發的前提。在SNMP開發中,不但要用ASN.1編寫MIB文件,還要使用ASN.1中的BER進行編解碼。
ASN.1 可分為兩個部分:
1)語法規則:從數據類型、內容順序或結構等方面來描述消息的內容
2)編碼規則:如何編碼、解碼實際消息中的數據
語法部分用于對數據結構、類型、順序進行描述。編碼則將語法部分描述的數據進行編碼,變為二進制比特流,以便在網絡上傳輸,或反方向地將接收到的數據流進行解碼。這使得編碼流可以跨平臺、跨設備進行傳輸。
ASN.1的記法規則,ASN.1的結構、類型和取值的表示方法和編程語言的表示法相似:
1)多個空格和空行都看作是一個空格。
2) 注釋用成對的連字符(--)在注釋的每行開始處表示,或者將一對連字符用在注釋的開始處和注釋行結束的結尾處。
3)標識符(取值和字段的名稱)、類型引用(類型的名稱)和模塊名稱由大寫字母、小寫字母、數字和連字符組成。
4)標識符、類型引用或模塊名以由大寫字母開始。
5) 內建類型都由大寫字母組成。內建類型一般用作標準表示法提供的類型。
6)Octet(字節)表示一個8bit的無符號整數。bit8表示最高位,bit1標識最低位。下列元語用于定義ASN.1符號:
BIT 類型和值用等寬字體表示。它通暢表示一個十六進制的字節值。
n1 粗斜體表示變量
?。郏?粗的方括號標示該值為可選項
{} 粗的大括號表示一組相關項。
| 粗體豎杠表示一組之中的內容可任選其一。
… 粗體省略號表示重復出現
= 粗體等號,用一個子項表示該項
一、ASN.1術語
1、抽象語法(Abstract Syntax)
2)描述通用數據結構
允許定義數據類型和值
2、數據類型(Data Type)
值的集合,可以是簡單類型或結構類型可以對數據類型命名
3)編碼(Encoding)
用于表示數據值的字節序列
4、編碼規則(Encoding Rules)
給出從一種語法到另一種的映射方法
5、傳輸語法(Transfer Syntax)
位模式(Bits pattern):描述數據是在傳輸時是如何表示的
二、ASN.1模塊定義
模塊(module)是ASN.1規范中的基本構造塊,定義一個名為modulereference的模塊,其格式如下:
其中:EXPORTS 這個模塊中的定義可能被其他模塊引入,用的比較少;IMPORTS 定義將要由其他模塊引入的對象或子模塊;AssignmentList 這個模塊中將定義類型分配、值分配及宏定義。
三、ASN.1數據類型
1、基本類型:
ASN.1語法中有六種基本類型,分別如下,基本已經做到見名知意了:
BOOLEAN,INTEGER,ENUMERATED,REAL,BIT STRING,OCTET STRING
2、字符串類型(ISO10646-1的子集):
3、對象類型:
OBJECT IDENTIFIER
ObjectDescriptor:一個任意長的非負整數序列,用于標記對象(如算法等)
4、其它類型:
NULL 空值
UTCTime: yymmdd hhmm[ss]
GeneralizedTime:yyyymmdd hhmm[ss] ,強制始于2050年
四、ASN.1類型定義
ASN.1靈活之處在于,除了它內置的一些數據類型外,用戶還可以自定義自己想要的任何類型,一般都是通過現有類型來組合來實現。
上面的定義過程中,INTEGER太常見了,就用Counter來作為它的一種別名,注意是一種,以后就可以用Counter來定義新變量了。同理,IpAddress就是OCTE STRING類型一種別名。
五、ASN.1子類型定義
子類型是在類型的定義基礎上增加更明確限制條件,如設定新類型的取值范圍,缺省值等等。
這樣定義過后,以后用Counter定義的任何變量都被限定大于0小于65536。IpAddress定義變量長度都是4字節,等等。
六、ASN.1賦值
賦值在MIB庫文件中的定義是最常見的一部分。
七、ASN.1的結構體類型
八、ANS.1標簽類型
標簽用于區分不同的類型,并且在結構類型SEQUENCE和SET中,組件類型可能引起混淆,可以為它們的組件(分量)指定Context-specific標簽,清晰指示組件的類型。除了CHOICE和ANY外,每種ASN.1類型都有一個標簽,由一個類和一個非負的標簽數組成。標簽值可以唯一區分ASN.1類型。也就是說,ASN.1類型的名字并不影響它的抽象含義,只有標簽才有這個作用。
標簽用在編碼中,可以唯一地標示類型,便于編碼。ASN.1提供了4中標簽:
1)Universal:標識ISO和ITU定義的類型,ASN.1定義的類型均有Universal值,該值在所有的程序里都一致。
2)Application:應用程序自定義類型。本標識可以唯一地標識自定義類型。類型名在ASN.1中可以相同,所以Application就成為唯一標識自定義類型的方法。類型的含義由制定者自己定義。例如:
Private:該類型的含義根據具體的企業而不同。Private標識不會被用在國際規范中。企業提供的程序一般經常使用application和context-specific標識。在特殊場合下,一個企業的技術規范想要擴展成為一個國際規范時,使用private標識在企業規范成為國際規范的過程中可以較好地保護該企業的規范。例如:
CompanyNumber ::=[PRIVATE 2] INTEGER
companyNumber CompanyNumber ::=5651
Context-specific:專用于結構類型中。該類型的含義根據給定的結構類型而不同。對于SET和SEQUENCE,為了避免里面的組件混淆,一般情況下給予不同的Context-specific標簽。如:
九、宏定義
ASN.1提供一種用戶可以將符號擴展為自己使用的或別人使用的符號的機制,這就允許設計者去擴展語言定義一個“對象”,比如定義一個調制解調器或定義一個交換機。這些對象有普通的ASN.1屬性和條件屬性,比如父母和物理位置等。例如一個一部的調制解調器可以以普通調制解調器作為父類,從父類處繼承屬性。使用ASN.1可以定義為:
PS:宏在1994年從ASN.1中移除,取而代之的是Information Object Class。2002年X.680和X.690系列標準中已經使用Information Object Class代替。SNMPv1在1990年發布,所以SNMPv1中使用ASN.1宏。而SNMPv2 SMI的RFC中明確指出,SNMPv2中使用1998版ASN.1,所以SNMPv2還是使用ASN.1中的宏定義管理對象和通告。
評論
查看更多