とほほのSNMP入門
SNMPとは
SNMPの概要
- Simple Network Management Protocol の略です。
 - 管理する側(SNMP Manager) と 管理される側 (SNMP Agent) 間の管理プトロコルです。
 - SNMP-Get は Manager から Agent に対して入出力パケット数などの情報を要求し、Agent がこれに応答します。
 - SNMP-Set は Manager から Agent に対してポートをダウンさせろなどの値を設定します。
 - SNMP-Trap は Agent 側でポートがダウンしたなどの事象が発生した際に Agent が Manager に通知します。
 - SNMP-Get には 160番の UDP ポートを使用します。
 - SNMP-Trap には 161番の UDP ポートを使用します。
 
SNMPのバージョン
- SNMP の主なバージョンには v1, v2c, v3 があります。v2 もありますが殆ど使用されていません。
 - v1 は平文のコミュニティ名のみで認証を行います。メッセージも平文です。
 - v2c は v1 に対して
 - v3 は認証プロトコルを用いてメッセージも暗号化されます。
 
MIB と OID
- MIB(Management Information Base) は、機器名、稼働時間、入出力パケット数など、様々な情報を含みます。
 - MIB の名前は OID(Object IDentifier) で示されます。
 - 例えば「機器名」の OID は iso(1).org(3).dod(6).internet(1).mgmt(2).mib-2(1).system(1).sysName(5).0 となります。
 - 1.3.6.1.2.1.1.5.0 のように数値のみで表すこともあります。
 - 先頭に . をつけて .1.3.6.1.2.1.1.5.0 の様に表すこともあります。
 - 名前の重複が無ければ sysName.0 のように末尾の名前のみで指定することもあります。
 
インストール
# RHEL8系
# dnf -y install net-snmp net-snmp-utils
# systemctl start snmpd
# systemctl enable snmpd
snmpd.conf
/etc/snmp/snmpd.conf には下記のような設定項目があります。
# public というコミュニティ名に notConfigureUser というセキュリティ名をつける com2sec notConfigUser default public # SNMPv1 に対しては notConfigureUser を notConfigGroup に所属させる group notConfigGroup v1 notConfigUser # systemview というビューに MIB の 1.3.6.1.2.1.1 を加える view systemview included .1.3.6.1.2.1.1 # notConfigGroup に systemview へのアクセス権を与える access notConfigGroup "" any noauth exact systemview none none
snmpget
SNMPエージェントに対してMIB値を要求・取得するコマンドです。-v には SNMP のバージョン、-c にはコミュニティ名を指定します。snmpget では単一の MIB 値しか取得できません。
$ snmpget -v 2c -c public 192.168.100.101 1.3.6.1.2.1.1.1.0
snmpwalk
SNMPエージェントに対してMIB値を取得・要求するコマンドです。指定した MIB 配下の値をすべて取得することができます。
$ snmpwalk -v 2c -c public 192.168.100.101 1.3.6.1.2.1.1
snmptrapd
SNMPエージェントから SNMP-Trap を受け取り、ロギングします。161 番の UDP ポートで待ち受けし、デフォルトでは syslog に書き出します。
# RHEL8系
# dnf -y install rsyslog net-snmp net-snmp-utils
# echo "disableAuthorization yes" >> /etc/snmp/snmptrapd.conf
# systemctl start rsyslog
# systemctl enable rsyslog
# systemctl start snmptrapd
# systemctl enable snmptrapd
受信したトラップは /var/log/messages に出力されます。上記はすべてのコミュニティ名のトラップを受け付ける例です。特定のコミュニティ名(例:public)のみ受け付けるには /etc/snmp/snmptrapd.conf に下記の様に設定してください。
authCommunity log,execute,net public
snmptrap
SNMP Trapを疑似的に送信します。192.168.100.100 は送信先アドレス、'' は起動してからの経過時間ですが '' を指定すると自動的に補ってくれます。linkDown はネットワークインタフェースがダウンしたことを示すOID、ifIndex.3 は追加情報のOIDで、型はi(integer)、値は3(3番目のポート)がダウンしたことを示しています。
$ snmptrap -v 2c -c public 192.168.0.3 '' linkDown ifIndex.3 i 3 ifAdminStatus.3 i 1 ifOperStatus.3 i 2
MIB-Tree
MIB値を識別する識別子を OID(Object IDentifier) と呼びます。主な OID を下記に示します。
iso(1)
  org(3)
    dod(6)
      internet(1)
        mgmt(2)
        | mib-2(1) ... 標準MIB
        |   system(1) ... システム情報
        |     sysDescr(1)
        |     sysObjectID(2)
        |     sysUpTime(3) ... 起動してからの時間
        |     sysContact(4) ... コンタクト先
        |     sysName(5) ... システム名
        |     sysLocation(6) ... 設置場所
        |     sysServices(7)
        |     sysORLastChange(8)
        |     sysORTable(9)
        |   interfaces(2) ... ネットワークインタフェース情報
        |     ifTable(2)
        |       ifEntry(1)
        |         ifIndex(1) ... インタフェース番号
        |         ifAdminStatus(7) ... あるべき状態
        |         ifOperStatus(8) ... 現在の状態
        |         ifInOctets(10) ... 受信オクテット数
        |         ifOutOctets(16) ... 送信オクテット数
        |   at(3) ... ARPテーブル情報
        |   ip(4) ... IP情報
        |   icmp(5) ... ICMP情報
        |   tcp(6) ... TCP情報
        |   udp(7) ... UDP情報
        |   egp(8) ... EGP情報
        |   transmission(10) ... 送受信情報
        |   snmp(11) ... SNMP情報
        |   rmon(16) ... RMON情報
        |   host(25) ... ホスト情報
        |   ifMIB(31) ... インタフェースMIB
        experimental(3) ... 実験的なMIB
        private(4)
        | enterprise(1) ... ベンダ拡張MIB
        |   ibm(2)
        |   cisco(9)
        |   hp(11)
        |   hitach(116)
        |   nec(119)
        |   sony(120)
        |   fujitsu(211)
        snmpV2(6)
          snmpModules(3)
            snmpMIB(1)
              snmpMIBObjects(1)
                snmpTrap(4)
                  snmpTrapOID(1)
                snmpTraps(5)
                  coldStart(1)
                  warmStart(2)
                  linkDown(3)
                  linkUp(4)
                  authenticationFailure(5)
OID の末尾には、定義された OID の後にインスタンス番号をつけます。例えば 3番目のネットワークインタフェースのMIB値は iso(1).org(3)...(略)...ifInOctets(10).3 となります。1つしか無い値の場合は sysDescr(1).0 の様に 0 をつけます。