Jの衝動書き日記

さらりーまんSEの日記でございます。

SNMP Trapの中身を覗いてみる

 お仕事でSNMP Trapをあれこれと扱ったので、復習としてメモを残しておく。

 

 

SNMP Trapのパケット構成

 SNMP Trap(Version v2c)は以下の構成をとる。

f:id:newWell:20130905134223j:plain

 

 また、上記の各項目は以下のように3つのフィールドで構成される。

f:id:newWell:20130905134222j:plain

 

なおデータ長は、

  1. 127バイト以下は1バイトで表し、
  2. 127バイト以上は『8|データフィールド数,データフィールド1,データフィールド2……』

で表す。

例)
     150 → 81 96
     500 → 82 01 F4 → データフィールド数は2で01 F4がデータフィールド

 パケットの中身を見てみる

以下のコマンドを実行し、SNMP Trapを送信してみる。

 snmptrap -v 2c -c test 192.168.1.10 '' .1.3.6.1.4.1.8072.99999 .1.3.6.1.4.1.8072.99999.1 s "Test Message"

それをパケットキャプチャし、SNMP Trapの部分を抜き出したのが以下になる。

  30 62 02 01 01 04 04 74 65 73 74 a7 57 02 04 3f
  ba 5a c0 02 01 00 02 01 00 30 49 30 10 06 08 2b
  06 01 02 01 01 03 00 43 04 10 f1 9e 47 30 18 06
  0a 2b 06 01 06 03 01 01 04 01 00 06 0a 2b 06 01
  04 01 bf 08 86 8d 1f 30 1b 06 0b 2b 06 01 04 01
  bf 08 86 8d 1f 01 04 0c 54 65 73 74 20 4d 65 73
  73 61 67 65

 

1.キャプチャしたデータの内容を確認

 先頭を見ると30とあるのでSequence型だとわかる。長さは62とあるため98バイト(98は16進数では62)だ。以下の赤い部分がその内容となる。

  30 62 02 01 01 04 04 74 65 73 74 a7 57 02 04 3f
  ba 5a c0 02 01 00 02 01 00 30 49 30 10 06 08 2b
  06 01 02 01 01 03 00 43 04 10 f1 9e 47 30 18 06
  0a 2b 06 01 06 03 01 01 04 01 00 06 0a 2b 06 01
  04 01 bf 08 86 8d 1f 30 1b 06 0b 2b 06 01 04 01
  bf 08 86 8d 1f 01 04 0c 54 65 73 74 20 4d 65 73
  73 61 67 65

  次に、データの内容を見る。

 

2. Trapのパケット構成

SNMP Trapはv2cの形式で送信されている。各フィールドを色付けすると以下のようになる。

  30 62 02 01 01 04 04 74 65 73 74 a7 57 02 04 3f
  ba 5a c0 02 01 00 02 01 00 30 49 30 10 06 08 2b
  06 01 02 01 01 03 00 43 04 10 f1 9e 47 30 18 06
  0a 2b 06 01 06 03 01 01 04 01 00 06 0a 2b 06 01
  04 01 bf 08 86 8d 1f 30 1b 06 0b 2b 06 01 04 01
  bf 08 86 8d 1f 01 04 0c 54 65 73 74 20 4d 65 73
  73 61 67 65

  1. SNMP Version 
    • Interger(02) | 長さ:1 | 値:1 → v2cを示す
  2. コミュニティ名
    • OCTET STRING(04) | 長さ:4 |値: 74(t) 65(e) 73(s) 74(t) →  test
  3. PDU Type
    • SNMPv2-Trap(a7) 長さ:87 ※形式の指定はない
  4. リクエストID
    • Integer(02) | 長さ:4 | 値:3fba5ac0(16進) → 1069177536
  5. エラーステータス
    •  Integer(02) | 長さ:1 | 値:0
  6. エラーインデックス
    • Integer(02) | 長さ:1 | 値:0
  7. Trapデータ
    • Sequence(30)| 長さ:73 |

TrapデータはSequence型なので、次にこの中身を見てみる。

 

3. Trapデータの内容

TrapはSequenceの形で複数存在する。OID:値の組で定義される。

また、最初の2件はsysupTime.0(赤字の部分)とsysTrapOID.0(青字の部分)となる。

  30 62 02 01 01 04 04 74 65 73 74 a7 57 02 04 3f
  ba 5a c0 02 01 00 02 01 00 30 49 30 10 06 08 2b
  06 01 02 01 01 03 00 43 04 10 f1 9e 47 30 18 06
  0a 2b 06 01 06 03 01 01 04 01 00 06 0a 2b 06 01
  04 01 bf 08 86 8d 1f 30 1b 06 0b 2b 06 01 04 01
  bf 08 86 8d 1f 01 04 0c 54 65 73 74 20 4d 65 73
  73 61 67 65

  1. sysupTime.0
    • Sequence(30)|長さ:16
      • OID(06) | 長さ:8 | 値:2b 06 01 02 01 01 03 00
        • 値は、OID 1.3.6.1.2.1.1.3.0(sysupTime.0) を示す
        • 先頭の1.3が2b となるのは、OIDの変換規則で40 x 1 + 3と最初は変換されるため
      • TimeTicks(43) | 長さ:4 | 値: 10f19e47(16進) → 284270151
  2. sysTrapOID.0
    • Sequence(30)|長さ:24
      • OID(06) | 長さ:10 | 値:2b 06 01 06 03 01 01 04 01 00
        • 値は、OID 1.3.6.1.6.3.1.1.4.1.0(sysTrapOID.0)を示す
      • OID(06) | 長さ:10 | 値:2b 06 01 04 01 bf 08 86 8d 1f
        • 値は、OID1.3.6.1.4.1.8072.99999(enterprises.8072.99999)を示す※送信したTrapのOID
        • bf 08 → 10111111 00001000 01111110001000 → 8072 ※先頭ビットを取り除き連結させる
        • 86 8d 1f → 10000110 10001101 00011111000011000011010011111 → 99999
  3. enterprises.8072.99999.1
    • Sequence(30)| 長さ:27
      • OID(06) | 長さ:11 | 値:2b 06 01 04 01 bf 08 86 8d 1f 01
        • 値は、OID 1.3.6.1.4.1.8072.99999.1(enterprises.8072.99999.1)を示す
      • OCTET STRING(04)| 長さ:12 | 値:54 65 73 74 20 4d 65 73 73 61 67 65 → TestMessage

 

結論

 Wiresharkという便利なツールがあるので、見るときはそっちで見ようね!

 お仕事ではSNMPパケットに独自にデータを付与していたため、Wiresharkでパケットを見てもSNMPパケットとしては表示できず手動でみる羽目になったけど・・・・。

 

参考元

http://www.webnms.jp/solutions/snmp.html

http://www.geocities.co.jp/SiliconValley-SanJose/3377/

なお、図は上記サイトから借用させていただきました。