Linux SNMP クライアントサイド 超簡易まとめ

# まえがき
snmpなんてcommunityやtrapの設定するだけで、それ以降はzabbixなどの監視ツールにおまかせ！って感じだったので、正直自分で手動でsnmp getごにょごにょする機会があまりなかった。
あったとしても、数日後にほぼ忘れている。
今後もsnmpに造詣が深くなることはなさそうだが、簡単なことなら覚えておいて損はないので(というか結構面白い)、簡単にメモをとっておきます。

# 前提
* あくまでクライアントサイドの話なのでsnmpd.confの中身とかは範囲外
* CentOS7.x上にnet-snmpをインストールし、snmpdがローカルで既に動作している状況を想定

# SNMPって何よ？
私も詳しくはないのだけれど、わかっている範囲で簡単に・・・
リモートでシステムの状態を取得したり管理するための超便利プロトコル。
運用・保守シーンで大活躍の監視ツールさんたちによく使われている。

基本的な使い方としてはRead OnlyでCPU使用率やNIC状態、ハードウェア障害などの状態を取得するものだけど、Write権限があれば、リモートからシステムシャットダウンやコンフィグ書換なんてこともできる(やったことはない)

それぞれのシステム情報にはObject ID(OID)と呼ばれる値が付与されていて、そのOIDを持ってどんな情報を取得するか、というやり取りを行う。
OIDはツリー構造になっていて、これをMIBと呼ぶ。
よくあるCPUやメモリ使用率、NICのup/downなど、大体どの機器にもこれは言えるよねっていう内容は標準MIBという形でまとめられ、まぁ大体の機器やOSはこれに対応している。
とはいえ、NW機器やストレージ、WindowsにLinux、HPサーバにDellサーバなど、世の中には色んなハードウェアやソフトウェアがあり、全て共通したMIBは使えないし、独自に取得したい情報だってある。

NW機器で言えば、OSPFのネイバーテーブルを見たいという需要はあるかもしれないが、当然Windowsにそんな需要はない。
こういった場合は、その機器特有のMIBファイルっていうのがメーカから公式に配布されているので、それを監視ツール(SNMPクライアント)にインポートしてあげる。
そうすると、そのMIBファイルを基に、あーこのOIDはxxのyyを取得するものなんだなっていうのをツールが理解してくれる。
面倒くさいけど非常に便利な仕様。

つまり、OIDさえわかれば、SNMPサーバに対してこのOIDの情報ちょうだい、と言えば、SNMPサーバが値を返してくれる。
値は数字かもしれないし、ただの文字列かもしれないし、単位はsecかもしれなければ、%かもしれない。
中身の値が何を表しているのか、というのは基本的にはMIBの中身を見れば書いている。

OID配下が配列になっている場合もある。
具体的には、例えばOID: .1.3.6.1.2.1.2.2.1.7 はNICの名前(eth0とかens192とか)の一覧が格納されている。NICの1つ目の情報が欲しいなら、末尾にindexとして、.1をつける必要がある。
というか、基本的にはこの形が多い。

正確には何て言うのかわからないが、本記事の中では、このSNMPサーバに対して情報取得をすることをgetと呼ぶことにします。


## snmp get コマンド
**snmpwalk**あるいは**snmpget**コマンドを使用する
上記コマンドが存在しない場合は、**net-snmp-utils**をインストールしよう
個人的には**snmpwalk**のほうが好み
ちなみに、細かいオプションは違うんだけど、基本的なgetの方法はsnmpwalkもsnmpgetも全く同じ構文でいける。
なので、ここではsnmpwalkのみ紹介します。

```
コマンド構文
snmpwalk -v [snmp_version] -c [community_name] [host] [oid]

ex)
snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.9.1.2.1
```

なぜsnmpwalkのほうが好きかというと、snmpgetの場合、指定したOIDがばっちり存在しないと値が返ってこない。
snmpwalkの場合、配下に存在する全てを引っ張ってくるので、色々情報を見たり探したりするときはsnmpwalkのほうが捗る。

```
[root@localhost ~]# snmpget -v 2c -c public localhost .1.3.6.1.2.1.1.5
SNMPv2-MIB::sysName = No Such Instance currently exists at this OID
[root@localhost ~]# 
[root@localhost ~]# snmpget -v 2c -c public localhost .1.3.6.1.2.1.1.5.0
SNMPv2-MIB::sysName.0 = STRING: sso.test.co.jp
[root@localhost ~]# 
[root@localhost ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.1.5
SNMPv2-MIB::sysName.0 = STRING: sso.test.co.jp
```


### 全部ひっぱりたいとき
OIDなしで実行すると、全てgetできそうな気がするが、実はそうではない

**.** をつけてルート配下全部！みたいな書き方をする必要がある

```
[root@localhost ~]# snmpwalk -v 2c -c public localhost | wc -l
4455
[root@localhost ~]# snmpwalk -v 2c -c public localhost .1 | wc -l
5994
[root@localhost ~]# snmpwalk -v 2c -c public localhost . | wc -l
5989
```

## MIBについて
snmpwalkが使用するMIBについては、**/usr/share/snmp/mibs/** 配下に存在する

拡張子の通り、ただのテキストファイルなので、細かいことは中身を見ると良い

MIBファイルちょうだいって誰かに言われたら、このファイルを渡せば良いはず

```
[root@localhost ~]# ls -l /usr/share/snmp/mibs/
total 1816
-rw-r--r-- 1 root root  17455 May 12  2016 AGENTX-MIB.txt
-rw-r--r-- 1 root root  50948 May 12  2016 BRIDGE-MIB.txt
-rw-r--r-- 1 root root   6331 Nov  7 05:09 COROSYNC-MIB.txt
-rw-r--r-- 1 root root  68104 May 12  2016 DISMAN-EVENT-MIB.txt
-rw-r--r-- 1 root root  24613 May 12  2016 DISMAN-SCHEDULE-MIB.txt
※以下略
```

### OIDではなくMIBに書かれている項目名でもgetできる
```
[root@localhost ~]# snmpwalk -v 2c -c public localhost IP-MIB::ipAdEntAddr
IP-MIB::ipAdEntAddr.127.0.0.1 = IpAddress: 127.0.0.1
IP-MIB::ipAdEntAddr.172.16.1.130 = IpAddress: 172.16.1.130
```

### OIDはわかるけど項目名がわからない
OIDでgetすれば項目名は表示される

あるいは、**snmptranslate** を使用する

```
[root@localhost ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.25.2.3.1.5.1
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 2049252
[root@localhost ~]# 
[root@localhost ~]# snmptranslate .1.3.6.1.2.1.25.2.3.1.5.1
HOST-RESOURCES-MIB::hrStorageSize.1
```

### 項目の詳細情報が知りたい
**snmptranslate -Td [oid]** を使用する

```
[root@localhost ~]# snmptranslate -Td HOST-RESOURCES-MIB::hrStorageUsed
HOST-RESOURCES-MIB::hrStorageUsed
hrStorageUsed OBJECT-TYPE
  -- FROM       HOST-RESOURCES-MIB
  SYNTAX        Integer32 (0..2147483647)
  MAX-ACCESS    read-only
  STATUS        current
  DESCRIPTION   "The amount of the storage represented by this entry
        that is allocated, in units of
        hrStorageAllocationUnits."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) host(25) hrStorage(2) hrStorageTable(3) hrStorageEntry(1) 6 }
```

## 主要なOIDと監視項目
正直間違っているかも・・・
今後何か使ったら追記していきます。

### CPU使用率

* 項目名: HOST-RESOURCES-MIB::hrProcessorLoad
* OID: .1.3.6.1.2.1.25.3.3.1.2
* 注意: コア数分indexが存在するので全体のCPU使用率を割り出すためには和をとって平均値を算出する必要がある

---

### メモリ使用率

* 項目名: UCD-SNMP-MIB::memTotalReal, UCD-SNMP-MIB::memAvailReal
* OID: .1.3.6.1.4.1.2021.4.6, .1.3.6.1.4.1.2021.4.6
* 注意: memTotalRealはメモリの総容量、memAvailRealはメモリの空き容量なので、使用率を求めるにはmemAvailReal / memTotalReal * 100 とする必要がある

---

### NICのup/down

* 項目名: IF-MIB::ifAdminStatus
* OID: .1.3.6.1.2.1.2.2.1.7
* 注意: これだと全NICの状態が表示されるので、単体のNICの状態を調べる際はindexを指定する必要がある。indexとNIC名のマッピングを知りたい場合は、.1.3.6.1.2.1.2.2.1.2を使用

---

### IPアドレス

* 項目名: IP-MIB::ipAdEntAddr
* OID: .1.3.6.1.2.1.4.20.1.1
* 注意: 全てのIPアドレスが得られるので、その中に仮想IPアドレスが存在するかどうか

---

### プロセス

* 項目名: HOST-RESOURCES-MIB::hrSWRunName
* OID: .1.3.6.1.2.1.25.4.2.1.4
* 注意: 全てのプロセスが得られるので、その中に必要なプロセスが存在するかどうか

---

### ストレージ使用率(/パーティションのみ)

* 項目名: HOST-RESOURCES-MIB::hrStorageUsed.31, HOST-RESOURCES-MIB::hrStorageSize.31
* OID: .1.3.6.1.2.1.25.2.3.1.6.31, .1.3.6.1.2.1.25.2.3.1.5.31
* 注意: hrStorageUsed.31は/パーティションの使用量、hrStorageSize.31は/パーティションの容量なので、
/パーティションの使用率を求めるにはhrStorageUsed.31 / hrStorageSize.31 * 100 とする必要がある

---


## 参考

* http://www.drk7.jp/MT/archives/001604.html
* http://www.debianhelp.co.uk/linuxoids.htm
* http://hogem.hatenablog.com/entry/2015/09/26/233000