見出し画像

SNMPプロトコル操作

「実践SNMP教科書」の第4章の復刻版です。

この章では、SNMPプロトコル操作について説明します。SNMPプロトコル操作とは、SNMPのProcotol Data Unit(PDU)を使って、MIBオブジェクトのアクセス(読み出し、書き込み)、TRAPによるイベントの通知を行うものです。SNMPのPDUには、大きく分けて、SNMPv1とSNMPv2(v3を含む)があります。まず、これらのPDUについて説明し、続いてPDUを使った動作シーケンスについて説明します。最後に、SNMPアプリケーションについて説明します。

「実践SNMP教科書 原稿」

SNMPv1 PDU

SNMPv1のPDUは、RFC1157においてASN.1のモジュールとして定義されています。(第5章で説明するSNMPメッセージも同じモジュールで定義されています。)次のソースコードにSNMPv1のPDU定義の最初部分を示します。

「実践SNMP教科書 原稿」
    RFC1157-SNMP DEFINITIONS ::= BEGIN

      IMPORTS
          ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks
             FROM RFC1155-SMI;

-- SNMPメッセージの定義を省略

          -- PDU

          PDUs ::=
                  CHOICE {
                              get-request
                                  GetRequest-PDU,
                              get-next-request
                                  GetNextRequest-PDU,
                              get-response
                                  GetResponse-PDU,
                              set-request
                                  SetRequest-PDU,
                              trap
                                  Trap-PDU
                          }
          -- PDUs
          GetRequest-PDU ::=
              [0]
                  IMPLICIT PDU
          GetNextRequest-PDU ::=
              [1]
                  IMPLICIT PDU
          GetResponse-PDU ::=
              [2]
                  IMPLICIT PDU
          SetRequest-PDU ::=
              [3]
                  IMPLICIT PDU

まず、ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks等をRFC1155-SMI(SMIv1)からインポートしています。次にSNMPv1のPDUは、次の表に示す5種類であることを定義しています。さらに、PDUのうち、GetRequest-PDU、GetNextRequest-PDU、GetResponse-PDU、SetRequest-PDUの4種類は、PDUという形式で符号化時のTAGのみ違うと定義しています。Trap-PDUのみ別の形式であるということです。

「実践SNMP教科書 原稿」
SNMPv1 PDUの種類

次のソースコードにPDU形式についての定義を示します。

「実践SNMP教科書 原稿」
          PDU ::=
                  SEQUENCE {
                     request-id
                          INTEGER,
                      error-status      -- 無効な場合ある
                          INTEGER {
                              noError(0),
                              tooBig(1),
                              noSuchName(2),
                              badValue(3),
                              readOnly(4),
                              genErr(5)
                          },
                      error-index       -- 無効な場合がある。
                         INTEGER,
                      variable-bindings -- 値は無効な場合がある
                          VarBindList
                  }

次の図と表にPDUのフォーマットを示します。

「実践SNMP教科書 原稿」
PDUのフォーマット
PDUの項目

次のソースコードにTrap-PDU形式の定義を示します。

「実践SNMP教科書 原稿」
         Trap-PDU ::=
              [4]
                 IMPLICIT SEQUENCE {
                      enterprise        -- TRAP送信するオブジェクトの識別子
                          OBJECT IDENTIFIER,
                      agent-addr        -- TRAP送信者のアドレス
                          NetworkAddress,

                      generic-trap      -- 一般TRAP番号
                          INTEGER {
                              coldStart(0),
                              warmStart(1),
                              linkDown(2),
                              linkUp(3),
                              authenticationFailure(4),
                              egpNeighborLoss(5),
                              enterpriseSpecific(6)
                          },

                      specific-trap  -- 拡張TRAP番号
                          INTEGER,   -- 拡張TRAPでなくても存在

                      time-stamp     -- ノードが(再)起動されてから
                          TimeTicks, -- TRAPを送信するまでの
                                     -- 経過時間

                       variable-bindings -- "興味深い" 情報
                          VarBindList
                  }

次の図と表にTrap-PDUのフォーマットを示します。

「実践SNMP教科書 原稿」
Trap-PDUのフォーマット


Trap-PDUのフォーマット

最後に、RFC1155の定義では、PDU、Trap-PDUで転送する管理情報のデータタイプ(VarBind、VarBindList)について定義しています。

「実践SNMP教科書 原稿」
          -- 管理情報
          VarBind ::=
                  SEQUENCE {
                      name
                          ObjectName,
                      value
                          ObjectSyntax
                  }
         VarBindList ::=
                  SEQUENCE OF
                     VarBind

ここでは、VarBindは、オブジェクトの名前(ObjectName)とオブジェクト値(ObjectSyntax)を対にしたものと定義しています。オブジェクトの名前(ObjectName)は、RFC1155のSMIv1で定義されているOID型のデータです。オブジェクト値(ObjectSyntax)も同様に、SMIv1で定義されているデータタイプと値を組み合わせたものです。VarBindListは、複数のVarBindの配列と定義しています。つまり、1つのPDUで複数の管理情報を転送可能ということを表しています。

このように、SNMPv1のPDU(後述のSNMPメッセージを含めても)は、非常にシンプルなものです。しかし、これだけで強力な管理機能が実現できたため、今日の普及に至ったのです。

「実践SNMP教科書 原稿」

SNMPv2 PDU

SNMPv2形式のPDUはSTD 62, RFC 3416で定義されています。(SNMPv1とは違い、SNMPv3のメッセージ形式は別のRFCで定義されています。)この形式のPDUは、SNMPv2C形式または、SNMPv3形式のSNMPメッセージで転送することができます。
次のソースコードにSNMPv2形式のPDU定義の最初の部分を示します。

「実践SNMP教科書 原稿」

ここから先は

18,741字 / 11画像
SNMPの仕様について解説した本やサイトは、沢山あると思います。 独自の拡張MIBを自分で設計してMIBファイルやエージェントを作る方法を解説した教科書はないと思います。

20年近く前に書いた「実践SNMP教科書」を現在でも通用する部分だけ書き直して復刻するマガジンです。最近MIBの設計で困っている人に遭遇し…

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。