2010年07月21日

実践SNMP+Java - SNMPv1 Trap

SNMP4Jを利用したSNMPv1 Trapの送信について説明します。

<Javaコード>
 
  1.     final String enterprise = ".1.3.6.1.4.1.99999.1.1.100"; // dummy system.sysObjectID object
  2.     final String varBindOID1 = ".1.3.6.1.4.1.99999.1.2.1.0"; // varbind 1
  3.     final String varBindOID2 = ".1.3.6.1.4.1.99999.1.2.2.0"; // varbind 2
  4.     // SNMP通信パラメータを設定するクラス。
  5.     CommunityTarget comTgt = new CommunityTarget();
  6.     String managerUdpAddr = "localhost/162"; // SNMPマネージャのUDPアドレス
  7.     comTgt.setAddress( new UdpAddress(managerUdpAddr) );
  8.     comTgt.setCommunity( new OctetString("public") ); // SNMPコミュニティ名
  9.     comTgt.setVersion(SnmpConstants.version1); // SNMPバージョン
  10.     PDUv1 v1pdu = new PDUv1();
  11.     v1pdu.setType(PDU.V1TRAP);
  12.     v1pdu.setAgentAddress( new IpAddress("127.0.0.1") );
  13.     /*
  14.      * Enterprise
  15.      * sysObjectID of a device sending trap
  16.      */
  17.     v1pdu.setEnterprise( new OID(enterprise) );
  18.     /*
  19.      * Generic Trap Type
  20.      *  0: coldStart
  21.      *  1: warmStart
  22.      *  2: linkDown
  23.      *  3: linkUp
  24.      *  4: authenticationFailure
  25.      *  5: egpNeighborLoss
  26.      *  6: other (not 0..5)
  27.      */
  28.     v1pdu.setGenericTrap(6);
  29.      // Specific Trap Type
  30.     int specificTrapType = 3;
  31.     v1pdu.setSpecificTrap(specificTrapType);
  32.      // Timestamp default 0.
  33.     long sysUpTime = 8640000; // static. 1day
  34.     v1pdu.setTimestamp(sysUpTime);
  35.     // add varbinds(index:1)
  36.     v1pdu.add( new VariableBinding(new OID(varBindOID1), new OctetString("NETBUFFALO SNMPv1 trap")) );
  37.     // add varbinds(index:2)
  38.     v1pdu.add( new VariableBinding(new OID(varBindOID2), new OctetString("sample v1 trap")) );
  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 v1 trap
  47.       snmp.send(v1pdu, comTgt);
  48.       // closes the session and frees any allocated resources. Trap送信であれば必要無いかも?
  49.       snmp.close();
  50.     } catch (IOException e) {
  51.       e.printStackTrace();
  52.     }
 
 
<実行結果>

実行結果を見るにはTrapレシーバが必要です。
何でも良いのですが幾つかご紹介します。
 
  ・Trap Receiver(簡単でよければ)
    http://jp.downpanda.com/Download-metro-snmp-trap-receiver-27482.html
    簡単に利用できますが、機能はトラップ受信だけです。
    あと、僕の環境では一度起動すると162ポートを使い続けてしまいました。
    (他のアプリで162ポートにbind、トラップ受信が出来なくなる)
 
  ・manage engine OpUtils(リッチです)
    http://www.manageengine.com/products/oputils/download.html
    トラップ受信に利用するだけであれば大掛かりなアプリにはなりますが、
    MIBブラウザも入っているので、これをこれを機会に如何でしょうか?
    インストール、ログイン後、SNMP ToolsメニューからTrap receiverを選択します。
    もし、162ポートでサービスが開始(Listening)していなければ、Snmp Trap Settingsより
    startします。
 
 
<説明>

1)送信準備
  6行目で送信先SNMPマネージャのUDPアドレスを設定しています。
  コミュニティ名もマネージャ側で認証に利用する可能性があるので設定します。
  その後、10~38行目でSNMPv1 TrapのPDUを生成しています。
    ・SNMPv1 PDUフォーマット
    |SNMP|SNMP         |PDU |Enter |Agent   |Generic   |Specific   |Time  |Variable|
    |Ver   |Community |Type |prise |Address|Trap Type|Trap Type|stamp|Bindings|
 
  <Enterprise>
    トラップ生成するエージェント(管理対象オブジェクト)を表すオブジェクトを
    設定します。簡単に言うとSNMPv1トラップを送信するエージェントの
    sysObjectIDを設定します。sysObjectIDはそのエージェントが何者か(ベンダー名、
    型式情報)を表すIDですから、受け取った側(SNMPマネージャ)は、この時点で
    ある程度のハンドリングを行うことも出来ます。
    例ですが、CISCO-PRODUCTS-MIBを見るとsysObjectIDの管理単位が分かります。
    この例では、".1.3.6.1.4.1.99999.1.1.100"; ダミーの値に設定しています。
    ちなみに、.1.3.6.1.4.1がIANA-registered Private Enterprisesを表していて、
    そこから先はPEN(Private Enterprise Number)で、99999にしています。
    Private Enterprise Numberの申し込み・取得方法は後ほど。
 
  <Agent Address>
    トラップ送信元アドレスです。今回はエージェントとマネージャが同じPC上で
    動作しているのでlocalhost(127.0.0.1)にしています。
 
  <Generic Trap Type>
    RFC1157で標準(事前定義)タイプとして0~6が定義されています。
      ・coldStart(0)
      ・warmStart(1)
      ・linkDown(2)
      ・linkUp(3)
      ・authenticationFailure(4)
      ・egpNeighborLoss(5)
      ・enterpriseSpecific(6)
    0~5に該当しない独自トラップは6を設定します。
    ここでは6を設定しています。
 
  <Specific Trap Type>
    ベンダー特有のより詳細なID(識別子)を設定出来ます。
    この値はGeneric Trap Typeが0~5の場合は0になります。
 
  <TimeStamp>
    エージェント側のsysUpTime(エージェント起動経過時間)になるんですが、
    ここでは固定で24時間(8640000)にしています。
    ※sysUpTimeの単位は1/100秒です。
 
  <バーバインドの生成>
    ここでは".1.3.6.1.4.1.99999.1.2.1.0"; // varbind 1と
    ".1.3.6.1.4.1.99999.1.2.2.0";// varbind 2を作成し、その値として
    OctetStringオブジェクトを設定しています。
    
2)SNMPv1 Trapの送信

  47行目でトラップの送信を行っています。
  トラップではレスポンスを待つ必要は無いので、Get/GetNext/GetBulkで
  説明したようなsnmp.listen(); // ローカルUDPポートの用意・待機は行いません。
  マネージャ側が受信したか否かを知りたい場合、Informを使います。
 
<Private Enterprise Number (PEN)の申し込み>
正式なプライベートMIBを用意する場合には、PENが必要になります。
PENを取得する場合、IANAの申請ページから必要な情報を入力し、
1,2週間待つとメールで返信があります。
  http://pen.iana.org/pen/PenApplication.page
認定されると以下のサイトにPENが追加されます。
  http://www.iana.org/assignments/enterprise-numbers

 

Posted by netbuffalo at 18:36│TrackBack(0) 実践SNMP+Java 


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