概要
SNMPはSimple Network Management Protocolの略で、コンピュータネットワーク上のノードを管理するためのプロトコルです。管理と言っても様々なものがあります。SNMPを利用して具体的にどのような管理をするのか見てみましょう。
監視サーバが1台とCiscoスイッチが1台あり、監視サーバからSNMPを使ってスイッチのインターフェース状態を監視したいとします。SNMPの世界では管理する側を「SNMPマネージャ」、管理される側を「SNMPエージェント」と呼びます。通信の流れは以下のようになります。
このように、SNMPマネージャ側から情報を取りに行くの動作を「SNMPポーリング」、SNMPエージェント側から自発的に情報を送る動作を「SNMPトラップ」と呼びます。今回は「SNMPポーリング」に絞って解説をします。
SNMPポーリングで取得できる情報は多岐に渡ります。先ほどのインターフェースの状態を一つとってもスイッチは多数のインターフェースを持っていますし、Link状態以外にも通過したパケット数やCPUの温度など、様々な情報を取得することができます。SNMPマネージャが何の情報を求めてポーリングをしているか、マネージャとエージェントで共通の規格を持つ必要があります。この為に使われるのが、OID (Object IDentifier)になります。OIDは以下のように、数字[0-9]とドット[.]の組み合わせで表現されます。
この例では.1.3.6.1.2.1.2.2.1.8がifOperStatusと言ってインターフェースのリンク状態を格納している場所、最後の.10001がFa1/0/1を指定する値になります。OIDは無数にあるため、覚える必要はありません。どのOIDが何の値を格納しているかについては、OID repositoryで検索することができます。
http://oid-info.com/get/1.3.6.1.2.1.2.2.1.8
コマンドで確かめてみる
使用した環境は下記の通りです。実際にはデスクトップPC側はVirtualBoxでCentOS7を動かしているためゲストOSのIPが振られていますが、本筋とは関係ないため割愛します。
まずはインターフェース設定です。L2スイッチ扱いなのでVlanインターフェースにIPアドレスを振るだけで完了します。簡単ですね。
Switch#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Switch(config)#int vlan 1
Switch(config-if)#ip add 192.168.1.1 255.255.255.0
Switch(config-if)#no shut
Switch(config-if)#end
Switch#
設定したらLANケーブルを繋いでサーバからPingで確認しましょう。
[root@localhost ~]# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=254 time=5.65 ms
できました。
続いて、スイッチ上でsnmpエージェントを動作する設定です。Catalystスイッチはデフォルトではsnmpエージェントが動作していません。
Switch#show snmp
%SNMP agent not enabled
snmp関連のコマンドを何か一つでも入れることでエージェントが起動します。今回はsnmpポーリングを受けるエージェントを起動させるため、snmp-server communityコマンドを設定します。設定するパラメータはコミュニティ名だけです。今回はqiitaにしましょう。
Switch#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Switch(config)#snmp-server community qiita
Switch(config)#end
Switch#show snmp
Chassis: CAT0949Z0E1
6883 SNMP packets input
0 Bad SNMP version errors
(途中省略)
SNMP global trap: disabled
SNMP logging: disabled
SNMP agent enabled
できました。
いよいよサーバからSNMPポーリングをしてみます。比較のため、スイッチのshow int statusコマンドを先に叩いておきましょうか。
Switch#sh int status | i Fa1/0/1 |Fa1/0/2
Fa1/0/1 connected 1 a-full a-100 10/100BaseTX
Fa1/0/2 notconnect 1 auto auto 10/100BaseTX
Fa1/0/1はup、1/0/2はdownになっていますね。インターフェースのリンク状態に対応するOIDは.1.3.6.1.2.1.2.2.1.8ですが、個別のインターフェースの指定はどうやって確認するのでしょうか。これはCiscoスイッチ上からshow snmp mib ifmib ifindexコマンドで見ることができます。
Switch#show snmp mib ifmib ifindex | i 1/0/1: |1/0/2:
FastEthernet1/0/1: Ifindex = 10001
FastEthernet1/0/2: Ifindex = 10002
それぞれ10001と10002でした。従って、確認したいOIDは.1.3.6.1.2.1.2.2.1.8.10001と.1.3.6.1.2.1.2.2.1.8.10002になります。(長い。。。)
サーバからSNMPポーリングを行うコマンドはsnmpgetコマンドになります。-vオプションと-cオプションで、バージョンとコミュニティ名を指定しましょう。
[root@localhost ~]# snmpget -v2c -c qiita 192.168.1.1 .1.3.6.1.2.1.2.2.1.8.10001
IF-MIB::ifOperStatus.10001 = INTEGER: up(1)
[root@localhost ~]# snmpget -v2c -c qiita 192.168.1.1 .1.3.6.1.2.1.2.2.1.8.10002
IF-MIB::ifOperStatus.10002 = INTEGER: down(2)
できました!
おわりに
ネットワーク機器の監視で使われているSNMP、実際にどのような動きをしているのか、少しでも理解が深まると幸いです。