2010年07月22日
実践SNMP+Java - SNMPv2 Trap
SNMP4Jを利用したSNMPv2 Trapの送信について説明します。
SNMPv2トラップではv1に比較し、PDUフォーマットがGet/GetNext/Setリクエストと統一されています。
実際にJavaコードで違いを見てみましょう。
<Javaコード>
- // SNMP通信パラメータを設定するクラス。
- CommunityTarget comTgt = new CommunityTarget();
- String managerUdpAddr = "localhost/162"; // SNMPマネージャのUDPアドレス
- comTgt.setAddress( new UdpAddress(managerUdpAddr) );
- comTgt.setCommunity( new OctetString("public") ); // SNMPコミュニティ名
- comTgt.setVersion(SnmpConstants.version2c); // SNMPバージョン
- final String sysObjectID = ".1.3.6.1.4.1.99999.1.1.100"; // sysObjectID
- /*
- * SNMPv2-MIB::snmpTrapOID(RFC1907)
- * The authoritative identification of the notification
- * currently being sent. This variable occurs as the second
- * varbind in every SNMPv2-Trap-PDU and InformRequest-PDU.
- *
- * <standard>
- * coldStart -> .1.3.6.1.6.3.1.1.5.1
- * warmStart -> .1.3.6.1.6.3.1.1.5.2
- * authenticationFailure -> .1.3.6.1.6.3.1.1.5.5
- *
- * <private>
- * Generally, set the value that added '0' and specific trap type of SNMPv1 trap to sysObjectID.
- */
- final String mySnmpTrapOID = sysObjectID + ".0.1"; // dummy snmpTrapOID
- final String varBindOID1 = ".1.3.6.1.4.1.99999.1.2.1.0"; // varbind 1
- final String varBindOID2 = ".1.3.6.1.4.1.99999.1.2.2.0"; // varbind 2
- // SNMPv2 Trap PDU
- PDU v2pdu = new PDU();
- // set trap type
- v2pdu.setType(PDU.TRAP);
- // add varbind1: sysUpTime default 0.
- long sysUpTime = 8640000;
- v2pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(sysUpTime)));
- // add varbind 2: snmpTrapOID
- // SnmpConstants.snmpTrapOID -> .1.3.6.1.6.3.1.1.4.1.0
- v2pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, new OID(mySnmpTrapOID)));
- // add varbind 3: my payload 1
- v2pdu.add( new VariableBinding(new OID(varBindOID1), new OctetString("NETBUFFALO SNMPv2 trap - varbind 1")) );
- // add varbind 4: my payload 2
- v2pdu.add( new VariableBinding(new OID(varBindOID2), new OctetString("NETBUFFALO SNMPv2 trap - varbind 2")) );
- // SNMP操作の基本になるクラス。
- Snmp snmp = null;
- // DefaultTcpTransportMappingクラスもあります
- DefaultUdpTransportMapping utm = null;
- try {
- utm = new DefaultUdpTransportMapping();
- snmp = new Snmp(utm);
- // send snmp v2 trap
- snmp.send(v2pdu, comTgt);
- // closes the session and frees any allocated resources. Trap送信であれば必要無いかも?
- snmp.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
<実行結果>
<説明>
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 determinedin an implementation-dependent fashion by the SNMPv2 entity. Thefirst two variable bindings in the variable binding list of anSNMPv2-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 notificationcurrently being sent. This variable occurs as the secondvarbind 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行目でトラップを送信しています。
ダグラス・R. マウロ ケビン・J. シュミット
オライリー・ジャパン
売り上げランキング: 257,278
オライリー・ジャパン
売り上げランキング: 257,278
Java ネットワーク プログラミング 基礎からわかる 完全入門
posted with amazlet at 13.01.12
永嶋 浩
技術評論社
売り上げランキング: 228,941
技術評論社
売り上げランキング: 228,941
Posted by netbuffalo at 13:04│TrackBack(0)│
│実践SNMP+Java