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