【SNMP】Net-SNMPで機器監視

SNMPとは

SNMP は機器監視プロトコルで UDP(161, 162 port) のサービスです。 現在, 多くのソフトウェアは SNMP v3 をサポートしています。
SNMP で取得できる情報は、接続機器上で動いているプロセス、システムリソース(CPU,メモリ)、ネットワークトラフィック、システムログに記録される特定のメッセージ等です。

snmp

SNMP用語

SNMP用語の中には独特の表現があります。よく使う用語は以下です。

マネージャ

クライアントに近い役割。エージェントに情報を要求。

エージェント

サーバに近い役割。エージェントは要求された情報を取得してマネージャに応答。状態変化をマネージャに通知。

MIB(Management Information Base)

エージェントは監視対象機器の情報をMIBから取得。 MIBの構造はツリー構造でrootから各ノードの数字を順番にたどって番号を付けることで個々のMIB情報を一意に識別可能。

OID(Object ID)

MIBに格納されている情報の1つ1つのこと。OIDは 「1.3.6.1.2.1.1.6」 のような数字。

OID OID(文字) 説明
.1.3.6.1.2.1.1 system システムに関する情報
.1.3.6.1.2.1.2 interfaces インタフェース情報に関する情報
.1.3.6.1.2.1.3 at IPアドレスと物理的なアドレスとの変換テーブルが格納
.1.3.6.1.2.1.4 ip IPに関する情報
.1.3.6.1.2.1.5 icmp ICMPに関する情報
.1.3.6.1.2.1.6 tcp TCPに関する情報
.1.3.6.1.2.1.7 udp UDPに関する情報
.1.3.6.1.2.1.8 egp EGP(Exteior Gateway Protocol)に関する情報
.1.3.6.1.2.1.9 transmission ネットワーク送受信モジュール(トランスミッタ)に関する情報
.1.3.6.1.2.1.11 snmp SNMPに関する情報

Trap

エージェントによる自発的な監視機能。エージェントは事前に指定された機器の情報(温度や再起動ログ)を定期的に取得し、ある一定の条件を検知した時に通知。

SNMPメソッド

GetRequest、GetNextRequest、SetRequest、GetResponse、Trapの5種類。

コミュニティネーム

情報を取得するための所謂パスワード。

Net-SNMPの使い方

OSS では Net-SNMP が有名です。single requestコマンドの snmpget, snmpgetnext や multiple requestコマンドの snmpwalk, snmptable, snmpdelta という機能を持っています。

Ubuntu にエージェント機能, ARMボードにマネージャ機能をインストールして動作確認してみます。

# on Ubuntu
$ sudo apt-get install libperl-dev
$ sudo apt-get install snmpd
$ sudo service snmpd start

/etc/snmp/snmpd.conf でエージェントの設定を行います。(Pathは環境によって異なります)
デフォルトではpublicがコミュニティネームで設定されています。 他の機器からのアクセスを許可するには agentAddress udp:127.0.0.1:161 の設定を変更します。

続いて ARM用 にコンパイルします。prefixを指定しないと /usr/local にインストールされます。

# クロスコンパイル (設定は ./configure --help で要確認)
$ ./configure --build=i386-linux --host=arm-none-linux-gnueabi --prefix=/path/to/your/install
$ make
$ make install

エージェントの監視対象機器のプロセスを取得します。snmpwalk, snmpgetがマネージャの主要コマンドです。

snmpwalk -c public -v 1 [IP] .1.3.6.1.2.1.25.4.2.1.2

CPU使用率は以下の場合, 100 – 98 = 2%になります。

$ snmpwalk -c private -v 1 [IP] .1.3.6.1.4.1.2021.11.11.0
iso.3.6.1.4.1.2021.11.11.0 = INTEGER: 98

ネットワークインターフェイス (NIC) を取得します。以下のように prefix でOIDを文字で指定することもできます。

$ snmpwalk -c public -v 1 [IP] interfaces.2.1.2
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: eth1

ネットワーク使用率も以下のコマンドを使って計算できます。

# fInOctets 受信した総バイト数
$ snmpwalk -c public -v 1 [IP] .1.3.6.1.2.1.2.2.1.10
# ifOutOctets   送信した総バイト数
$ snmpwalk -c public -v 1 [IP] .1.3.6.1.2.1.2.2.1.16
# インターフェイスの理論bps
$ snmpwalk -c public -v 1 [IP] .1.3.6.1.2.1.2.2.1.10

トラブルシューティング

存在しない OID にアクセスしようとした場合、以下のエラーが出力されます。

Error building ASN.1 representation (Can't build OID for variable)

ASN.1 は SNMP以外にも S/MIME, SSL, Kerberos などで使わているデータ構造を定義する言語です。

また以下の場合 MIB の Path を確認してください。
(MIB search path: /root/.snmp/mibs:/usr/local/share/snmp/mibs)

Cannot find module (xxx)