SNMP TRAP報文解析


轉載地址: https://blog.csdn.net/eric_sunah/article/details/19557683

 

SNMP的報文格式

SNMP代理和管理站通過SNMP協議中的標准消息進行通信,每個消息都是一個單獨的數據報。SNMP使用UDP(用戶數據報協議)作為第四層協議(傳輸協議),進行無連接操作。SNMP消息報文包含兩個部分:SNMP報頭和協議數據單元PDU。

    在實際網絡傳輸環境下,SNMP報文的長度取決於其所采用的編碼方式。SNMP統一采用BER(Basic Encoding Rule)的編碼規則,同時在正式SNMP規范中使用的是ASN.1語法,AbastractSyntax 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類型

   名 稱

0

get-request

1

get-next-request

2

get-response

3

set-request

4

trap

    也就是說,trap的類型是4。但是在數據報文中,該字段一般表示為ax,其中x取[0,4],即a0~a3表示相應的get、set等操作,a4表示trap報文。這里除了類型字段意外,其他字段均采用BER編碼方式:

實戰演練之報文格式分析

    Trap報文格式和上述圖5所展示的結構有些差別,這里我們只分析SNMPv1和SNMPv2的Trap報文格式。trap報文前面的部分都一樣,區別在PDU協議數據單元部分。

 

SNMPv1 Trap報文

SNMPv1的Trap報文格式如下所示:

注意:除了PDU類型和PDU長度字段外,后面的每個字段都是BER編碼方式。

    trap類型”可以取以下值,其中0~6是已定義的特定trap,7及其以后的類型由供應商自定義。

表2 trap類型、名稱及描述信息

trap類型

名稱

描述信息

0

coldStart

代理進程對自己初始化

1

warmStart

代理進程對自己重新初始化

2

linkDown

一個接口已從工作狀態變為故障狀態(報文中的第一個變量標識此接口)

3

linkUp

一個接口已從故障狀態變為工作狀態(報文中的第一個變量標識此接口)

4

authenticationFailure

從SNMP管理進程收到無效共同體的報文

5

egpNeighborLoss

一個EGP鄰站已變為故障狀態(報文中的第一個變量包含鄰站IP地址)

6

enterpriseSpecific

在這個特定的代碼段中查找trap信息

 

通過wireshark抓包工具,捕獲一條如下的SNMP報文,接下來對其進行仔細分析。

SNMPv1原始報文內容:

00 23 5a 9e 58b9 00 4c 41 49 50 55 08 00 45 00 00 48 00 00 40 00 40 11 a5 4e c0 a80a 01 c0 a8  0a05 0c 00 00 a200 34 ff e0 30 2a 02 01 00 04 06 70 75 62 6c 69 63a4 1d 06 0a 2b 06 01 04 01 bf 08 03 02 0a 40 04 c0 a8 0a01 02 01 00 02 01 00 43 01 0e 30 00

 

目的MAC:00 23 5a 9e 58 b9

源MAC:00 4c 41 49 50 55

協議類型:08 00 ,為IP數據報

IP頭:45 00 00 48 00 00 40 00 40 11 a5 4e c0 a80a 01 c0 a80a 05 0c

UDP頭:0c 00 00 a2 00 34 ff e0

其余部分都為SNMP報文,接下來我們對照前面的報文結構體來逐個分析一下。

n  30 表示SNMP消息是ASN.1的SEQUENCE類型;

n  2a 表示該SNMP報文的總長度是42(0x2a)個字節,該字段所表示的報文長度起始於它后面的第一個字節直到報文結束;

02 01 00 表示版本號,可見其確實為BER編碼方式。02表示該字段是INTEGER類型;01表示該字段占1個字節;00表示版本號,該值為“版本號-1”;

04 06 70 75 62 6c 69 63 表示團體名,04表示該字段為OCTETSTRING類型;06表示該字段占6個字節;70 75 62 6c 69 63表示團體名的ANSII碼的十六進制形式,這里是“public”;

a4 1d 其中a4中的“4”表示這是一個trap報文,a4又叫報文的標簽標記;1d表示后面還有29(0x1d)個字節的數據;

06 0a 2b 06 01 04 01 bf 08 03 02 0a 企業OID標識。06表示該字段是個對象標識符,OBJECTIDENTIFIER;0a表示該字段占10(0x0a)個字節;關於SNMP的OID的編碼方式有些奇特:例如1.3.6.1.2…. 取前兩個數字分別記為x和y。編碼時40*x+y,這里x=1,y=3,因此結果為40*1+3=43,即表示十六進制的2b。因此,這里的企業OID編碼即為1.3.6.1.4.1.8072.3.2.10;

40 04 c0 a80a 01 同樣40表示該字段為OCTET STRING 類型;04表示IP地址占4個字節;IP地址為192.168.10.1;

02 01 00 其中00表示trap類型為coldStart;

02 01 00 其中00表示我們指定的trap即specific-trap也為coldStart類型;

43 01 0e 43表示為TimeTicks類型;01表示該字段占1個字節;0e即十進制的14表示時間標簽為0.14秒,這里時間計數器以0.01秒遞增;

30 00 30表示“鍵-值”值對的編碼類型為SEQUENCE;00表示該字段占0個字節,即沒有該字段。

 

SNMPv2 Trap報文 SNMPv2的Trap報文格式如圖8所示:

同樣的,這里除了trap類型和報文長度是標准網絡字節序之外,其余協議字段也均為BER編碼方式。可以看到v2版的trap報文正在向統一的報文格式發展,已經非常類似普通的SNMP請求、響應報文了。

SNMPv2原始報文內容:

00 23 5a 9e 58b9 00 4c 41 49 50 55 08 00 45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a8 0a01 c0 a8 0a05 0c 01 00 a2 0067 04 bb 305d 02 01 01 04 06 70 75 62 6c 69 63a7 50 02 04 1773 2c fb 02 01 00 02 01 00 30 42 30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e 30 17 060a 2b 06 01 06 03 01 01 04 01 00 06 09 2b 06 01 0603 01 01 05 01 3018 06 0a2b 06 01 06 03 01 01 04 0300 06 0a2b 06 01 04 01 bf 08 03 02 0a

 

目的MAC:00 23 5a 9e 58 b9

源MAC:00 4c 41 49 50 55

協議類型:08 00,IP報文

IP頭:45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a80a 01 c0 a80a 05

UDP頭:0c 01 00 a2 00 67 04 bb

余下部分全為SNMP報文內容,這里我們做一下簡單的約定:

xx 標注類型;xx 標注長度;xx 標注真正的數據。

這樣一來上面這串原始數據就好分析多了J

30 5d 整個SNMP報文的編碼方式為30,即SEQUENCE類型,報文長度93(0x5d)字節;

02 01 01 版本號01即v2版本;

04 06 70 75 62 6c 69 63 團體名70 75 62 6c69 63  即英文的“public”;

a7 50 a7表示trap類型為7,即廠商自定義trap;50表示PDU區段占80(0x50)字節;

02 04 17 73 2c fb 請求ID為17 73 2c fb 十進制的393424123;

02 01 00 錯誤狀態0;

02 01 00 錯誤索引0;

30 42 “變量名-值”對編碼類型30 即SEQUENCE類型;“變量名-值”所占總字節0x42,即66字節;

30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e 第一個“名-值”對區段編碼方式30 即SEQUENCE類型;第一個“名-值”對總長度0x0d,13字節;第一個變量名的編碼類型0x06,時間標簽;第一個變量名占0x08個字節;第一個變量名2b 06 01 02 01 01 03 00,為1.3.6.1.2.1.1.3.0;第一個變量值為0x0e,即14;

30 17 06 0a2b 06 01 06 03 01 01 04 0100 06 09 2b 06 01 06 03 01 01 05 01 第二個“名-值”對;變量名1.3.6.1.6.3.1.1.4.1.0;變量值1.3.6.1.6.3.1.1.5.1;

30 18 06 0a2b 06 01 06 03 01 01 04 0300 06 0a2b 06 01 04 01 bf 08 03 02 0a 第三個“名-值”對;變量名1.3.6.1.6.3.1.1.4.3.0;變量值1.3.6.1.4.1.8072.3.2.10;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM