良く分かるSNMPポーリング

# 概要
SNMPはSimple Network Management Protocolの略で、コンピュータネットワーク上のノードを管理するためのプロトコルです。管理と言っても様々なものがあります。SNMPを利用して具体的にどのような管理をするのか見てみましょう。

監視サーバが1台とCiscoスイッチが1台あり、監視サーバからSNMPを使ってスイッチのインターフェース状態を監視したいとします。SNMPの世界では管理する側を「SNMPマネージャ」、管理される側を「SNMPエージェント」と呼びます。通信の流れは以下のようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/126284/252e944a-a94f-cbd3-ef4e-a8c74a6029cd.png)
このように、SNMPマネージャ側から情報を取りに行くの動作を「SNMPポーリング」、SNMPエージェント側から自発的に情報を送る動作を「SNMPトラップ」と呼びます。今回は「SNMPポーリング」に絞って解説をします。

SNMPポーリングで取得できる情報は多岐に渡ります。先ほどのインターフェースの状態を一つとってもスイッチは多数のインターフェースを持っていますし、Link状態以外にも通過したパケット数やCPUの温度など、様々な情報を取得することができます。SNMPマネージャが何の情報を求めてポーリングをしているか、マネージャとエージェントで共通の規格を持つ必要があります。この為に使われるのが、OID (Object IDentifier）になります。OIDは以下のように、数字[0-9]とドット[.]の組み合わせで表現されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/126284/df52c47b-108f-3f50-6d58-48b577d279f9.png)

この例では.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が振られていますが、本筋とは関係ないため割愛します。
![image](https://qiita-image-store.s3.amazonaws.com/0/126284/d337164a-e4f1-84e6-ea14-f18b576e8232.png)

まずはインターフェース設定です。L2スイッチ扱いなのでVlanインターフェースにIPアドレスを振るだけで完了します。簡単ですね。

```Cisco:C3750
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で確認しましょう。

```CentOS:Bash
[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エージェントが動作していません。

```Cisco:C3750
Switch#show snmp
%SNMP agent not enabled
```

snmp関連のコマンドを何か一つでも入れることでエージェントが起動します。今回はsnmpポーリングを受けるエージェントを起動させるため、snmp-server communityコマンドを設定します。設定するパラメータはコミュニティ名だけです。今回はqiitaにしましょう。

```Cisco:C3750
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コマンドを先に叩いておきましょうか。

```Cisco:C3750
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コマンドで見ることができます。

```Cisco:C3750
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オプションで、バージョンとコミュニティ名を指定しましょう。

```CentOS:Bash
[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、実際にどのような動きをしているのか、少しでも理解が深まると幸いです。