2010年07月22日

実践SNMP+Java - SNMPv2 Trap

SNMP4Jを利用したSNMPv2 Trapの送信について説明します。
 
SNMPv2トラップではv1に比較し、PDUフォーマットがGet/GetNext/Setリクエストと統一されています。

実際にJavaコードで違いを見てみましょう。
 
<Javaコード>
 
  1.     // SNMP通信パラメータを設定するクラス。
  2.     CommunityTarget comTgt = new CommunityTarget();
  3.     String managerUdpAddr = "localhost/162"; // SNMPマネージャのUDPアドレス
  4.     comTgt.setAddress( new UdpAddress(managerUdpAddr) );
  5.     comTgt.setCommunity( new OctetString("public") ); // SNMPコミュニティ名
  6.     comTgt.setVersion(SnmpConstants.version2c); // SNMPバージョン
  7.     final String sysObjectID = ".1.3.6.1.4.1.99999.1.1.100"; // sysObjectID
  8.     /*
  9.      * SNMPv2-MIB::snmpTrapOID(RFC1907)
  10.      *  The authoritative identification of the notification
  11.      *  currently being sent.  This variable occurs as the second
  12.      *  varbind in every SNMPv2-Trap-PDU and InformRequest-PDU.
  13.      *
  14.      *  <standard>
  15.      *   coldStart             -> .1.3.6.1.6.3.1.1.5.1
  16.      *   warmStart             -> .1.3.6.1.6.3.1.1.5.2
  17.      *   authenticationFailure -> .1.3.6.1.6.3.1.1.5.5
  18.      *
  19.      *  <private>
  20.      *   Generally, set the value that added '0' and specific trap type of SNMPv1 trap to sysObjectID.
  21.      */
  22.     final String mySnmpTrapOID = sysObjectID + ".0.1"; // dummy snmpTrapOID
  23.     final String varBindOID1 = ".1.3.6.1.4.1.99999.1.2.1.0"; // varbind 1
  24.     final String varBindOID2 = ".1.3.6.1.4.1.99999.1.2.2.0"; // varbind 2
  25.     // SNMPv2 Trap PDU
  26.     PDU v2pdu = new PDU();
  27.     // set trap type
  28.     v2pdu.setType(PDU.TRAP);
  29.     // add varbind1: sysUpTime default 0.
  30.     long sysUpTime = 8640000;
  31.     v2pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(sysUpTime)));
  32.     // add varbind 2: snmpTrapOID
  33.     // SnmpConstants.snmpTrapOID -> .1.3.6.1.6.3.1.1.4.1.0
  34.     v2pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, new OID(mySnmpTrapOID)));
  35.     // add varbind 3: my payload 1
  36.     v2pdu.add( new VariableBinding(new OID(varBindOID1), new OctetString("NETBUFFALO SNMPv2 trap - varbind 1")) );
  37.     // add varbind 4: my payload 2
  38.     v2pdu.add( new VariableBinding(new OID(varBindOID2), new OctetString("NETBUFFALO SNMPv2 trap - varbind 2")) );
  39.     // SNMP操作の基本になるクラス。
  40.     Snmp snmp = null;
  41.     // DefaultTcpTransportMappingクラスもあります
  42.     DefaultUdpTransportMapping utm = null;
  43.     try {
  44.       utm = new DefaultUdpTransportMapping();
  45.       snmp = new Snmp(utm);
  46.       // send snmp v2 trap
  47.       snmp.send(v2pdu, comTgt);
  48.       // closes the session and frees any allocated resources. Trap送信であれば必要無いかも?
  49.       snmp.close();
  50.     } catch (IOException e) {
  51.       e.printStackTrace();
  52.     }


<実行結果>
 
ここでもSNMPv1 Trapで紹介したOpUtilsを使って受信しています。

trap_receiver_v2trap


<説明>

1)送信準備
  5行目でSNMPマネージャのUDPアドレスを設定しています。
  ここでは、自分自身がマネージャも兼ねているので、localhost/162に
  設定しています。
  また、SNMPv2 Trapを送信するのでSNMPバージョンもv2cに設定しています(6行目)。
 
2)PDUの生成(8~45行目)
  SNMPv2 TrapのPDUフォーマットは次の通りです。
 
  | SNMP | SNMP         | PDU  | Request | Error   | Error   | Variable |
  | Ver    | Community  | Type | ID        | Status | Index | Bindings |
 
  Get/GetNext/SetリクエストPDUと同様(統一)なのですが、バーバインズに
  トラップ用のルールがあり、バーバインズの先頭にsysUpTime.0と
  snmpTrapOID.0のバーバインドを設定する仕様になっています。
  この仕様はRFC1905で定義されています。
 
  <RFC1905::4.2.6. The SNMPv2-Trap-PDU抜粋>
 
    The destination(s) to which a SNMPv2-Trap-PDU is sent is determined
    in an implementation-dependent fashion by the SNMPv2 entity.  The
    first two variable bindings in the variable binding list of an
    SNMPv2-Trap-PDU are sysUpTime.0 [9] and snmpTrapOID.0 [9]
 
  sysUpTime.0はSNMPv1トラップでも設定したエージェント起動経過時間を
  設定すれば良いのですが、snmpTrapOID.0は初めて聞く項目です。
  こちらはRFC1907に記載があるのですが、トラップを識別する為のIDです。
 
  <RFC1907(SNMPv2-MIB)>
 
    The authoritative identification of the notification
    currently being sent.  This variable occurs as the second
    varbind in every SNMPv2-Trap-PDU and InformRequest-PDU.
 
  javadocにも記載してありますが、RFC1907ではcoldStart、warmStart、
  authenticationFailureが標準として定義されており、これに該当するトラップを
  送信する場合には、そのOIDをsnmpTrapOID.0の値(value)として設定します。
 
  今回はプライベート(ベンダー固有)・トラップを送信する前提ですので、
  ’sysObjectIDに0とSNMPv1トラップにおけるspecific trap type相当加えたOIDを設定する’
  という基本ルールに従ってsnmpTrapOID.0の値(value)を作成しています(23行目)。
  33~45行目で実際のPDUにバーバインドを追加していますが、仕様に従い、
  sysUpTime.0、snmpTrapOID.0、付随して送信したいバーバインド(varBindOID1、
  varBindOID2)の順で追加しています。
 
3)SNMPv1トラップの送信
  56行目でトラップを送信しています。
  ここはSNMPv1トラップの送信と変わりありません。

 
入門SNMP
入門SNMP
posted with amazlet at 13.01.12
ダグラス・R. マウロ ケビン・J. シュミット
オライリー・ジャパン
売り上げランキング: 257,278

Java ネットワーク プログラミング 基礎からわかる 完全入門
永嶋 浩
技術評論社
売り上げランキング: 228,941

Posted by netbuffalo at 13:04│TrackBack(0) 実践SNMP+Java 


この記事へのトラックバックURL