ルーターの情報をSNMPで取得 by WSL2(Ubuntu)

業務用ネットワーク機器（ルーター・L2スイッチ等）ではSNMPプロトコルを使って、CPU・メモリ使用量・本体温度などのシステム情報からポートごとの通信量・アドレスまで様々な情報を取得できます。
今回はWindows PCのWLS2(Ubuntu)上でSNMPの情報を取得するためのか環境を整えていきたいと思います。

## SNMPとは
SNMPの情報は**MIB**という以下のようなツリー構造で管理されており、各パラメータにはオブジェクト識別子(**OID**)が割り振られています。

![mib_tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524454/287f6021-9369-6a2b-51f5-a3edaf8e7e9f.png)


各ベンダーが共通で使っている**標準MIB**とベンダー独自の**プライベートMIB**が存在します。プライベートMIBは各ベンダーにコードが割り当てられているためOIDが重複することはありません。

また、SNMPプロトコルにはSNMPv1、SNMPv2c、SNMPv3のバージョンがあります。v1、v2cは平文で通信する一方、v3には暗号化やユーザー認証機能がありセキュリティが向上しています。ここでは、設定が簡単なv2cを使っていきます。

# 検証環境
クライアントPC

- Windows11 Home (10でも同様に動くはずです）
- WSL2 (ディストリビューション: Ubuntu 20.04.3 LTS)


使用したネットワーク機器

- ルーター：NEC UNIVEGE IX2207 (FW ver.10.6.21)
- L2スイッチ：富士通 SR-S310TL2 (FW V14.04)

# ルーター・スイッチの設定

まずは、ネットワーク機器でSNMPを使えるように設定していきます。
各機器にはあらかじめ以下のIPアドレスを設定しています。

- ルーターLAN側アドレス：192.168.10.1/24
- L2スイッチ：192.168.10.4/24

今回は検証用ということで、設定の手軽さ優先でセキュリティ面はガバガバです。ご注意ください！

## NEC IX
とりあえずルーターのターミナルにて`configure`コマンドで構成定義モードに入り、以下のコンフィグを投入すればSNMPが使用可能になります。

```:IXコンフィグ
snmp-agent ip enable
snmp-agent ip community public

sysname IX2207
snmp-agent contact my-name
snmp-agent location my-room

#保存
write memory
```
簡単にコマンドの解説をしますと、1行目の`snmp-agent ip enable`でSNMPを有効にします。
2行目の`snmp-agent ip <コミュニティ名>`でコミュニティ名を設定します。このコミュニティ名がアクセス時に必要で、パスワードのような役割も果たします。ここではpublicと設定しています。

任意ですが`sysname <装置名>`や`snmp-agent contact <管理者の名前・連絡先>`、`snmp-agent location <設置場所>`のコマンドで設定した情報をSNMP上で確認することができます。この他にもアクセスリストでアクセス可能なIPアドレスを制限するなどのコマンド等もあり、[設定事例集やコマンドリファレンス](https://jpn.nec.com/univerge/ix/Manual/index.html)で確認していただければと思います。

## 富士通 SR-S
こちらも同様にターミナルで以下のコンフィグを投入します。コマンド表記は違いますが、設定内容はほぼ同等です。

```:SR-Sコンフィグ
snmp service on
snmp manager 0 0.0.0.0 public off disable

snmp agent sysname SR-S310TL2
snmp agent contact my-name
snmp agent location my-room

#保存
commit
save
```

1行目`snmp service on`でSNMPを有効にしています。
2行目は`snmp manager <定義番号> <アクセス可能なIPアドレス> <コミュニティ名> off disable`で、IPアドレスの制限をかけないことを表す0.0.0.0、コミュニティ名はpublicを指定しています。

# ツールのインストール

WSL(Ubuntu)上にSNMPを利用するためのソフトをインストールします。

```:インストール
$ sudo apt update
$ sudo apt install snmp
```

`snmpwalk -v <バージョン> -c <コミュニティ名> <機器のIPアドレス>`でSNMPの情報を一括取得できます。
試しにルーターの情報を取得してみますと、以下のようになります。
バージョンはv2c、コミュニティ名は先ほど設定した`public`、IPアドレスはルーターの`192.168.10.1`を指定しています。

```:一括取得
$ snmpwalk -v2c -c public 192.168.10.1
.1.3.6.1.2.1.1.1.0 = STRING: NEC Portable Internetwork ……(省略
.1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.119.1.84.18.1
.1.3.6.1.2.1.1.3.0 = Timeticks: (157059423) 18 days, 4:16:34.23
.1.3.6.1.2.1.1.4.0 = STRING: my-name
.1.3.6.1.2.1.1.5.0 = STRING: IX2207
.1.3.6.1.2.1.1.6.0 = STRING: my-room
.1.3.6.1.2.1.1.7.0 = INTEGER: 72
.1.3.6.1.2.1.2.1.0 = INTEGER: 13
---以下省略----
```

コマンド実行しますと、このように大量の情報が表示されます。先ほど機器に設定した文字列も取得できていますが、`.1.3.6.1.2.1.1.1.0 `のような表示では何を表しているのか理解が難しいです。初めの図にあったような文字列でOIDを表示してもらうためには**MIBファイル**というものが必要となります。

# MIBファイルの導入

標準のMIBファイルについては`snmp-mibs-downloader`のインストールで導入できます。

```bash:標準MIB導入
$ sudo apt install snmp-mibs-downloader

$ ls /usr/share/snmp/mibs
GNOME-SMI.txt              NET-SNMP-MIB.txt                  NET-SNMP-TC.txt        UCD-IPFILTER-MIB.txt  ietf
LM-SENSORS-MIB.txt         NET-SNMP-MONITOR-MIB.txt          NET-SNMP-VACM-MIB.txt  UCD-IPFWACC-MIB.txt
NET-SNMP-AGENT-MIB.txt     NET-SNMP-PASS-MIB.txt             UCD-DEMO-MIB.txt       UCD-SNMP-MIB-OLD.txt
NET-SNMP-EXAMPLES-MIB.txt  NET-SNMP-PERIODIC-NOTIFY-MIB.txt  UCD-DISKIO-MIB.txt     UCD-SNMP-MIB.txt
NET-SNMP-EXTEND-MIB.txt    NET-SNMP-SYSTEM-MIB.txt           UCD-DLMOD-MIB.txt      iana
```

インストールするとMIBファイルが自動でダウンロードせれてるはずです。
しかし、このままでは上手く動かないため、一部のファイルを直接ダウンロードしてくる必要があります。

```:追加ダウンロード
sudo wget http://www.iana.org/assignments/ianaippmmetricsregistry-mib/ianaippmmetricsregistry-mib -O /usr/share/snmp/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
sudo wget http://pastebin.com/raw.php?i=p3QyuXzZ -O /usr/share/snmp/mibs/ietf/SNMPv2-PDU
sudo wget http://pastebin.com/raw.php?i=gG7j8nyk -O /usr/share/snmp/mibs/ietf/IPATM-IPMC-MIB
```

設定ファイルを開き、以下の設定を追記します。

```config:/etc/snmp/snmp.conf
mibdirs /usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf
mibs all
```

## プライベートMIBファイル

プライベートMIBファイルは通常、各メーカーのホームページからダウンロードできます。
保存先はWindowsからのアクセス性も考え、ここではCドライブ直下にフォルダを作成し、そこに保存します。

```:フォルダ作成
$ cd /mnt/c
$ mkdir mib && cd mib
$ mkdir nec
$ mkdir fujitsu
```
### 設定追加

`/etc/snmp/snmp.conf`にプライベートMIBファイルの場所を追加してあげます。

```diff:/etc/snmp/snmp.conf
- mibdirs /usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf:
+ mibdirs /usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf:/mnt/c/mib/nec:/mnt/c/mib/fujitsu
```

### NEC

以下のサイトから3つファイルをダウンロードします。
https://jpn.nec.com/univerge/ix/Manual/index.html#mib

```:NECのMIBダウンロード
$ wget https://jpn.nec.com/univerge/ix/Manual/MIB/PICO-SMI-MIB.txt -O /mnt/c/mib/nec/PICO-SMI-MIB.txt
$ wget https://jpn.nec.com/univerge/ix/Manual/MIB/PICO-SMI-ID-MIB.txt -O /mnt/c/mib/nec/PICO-SMI-ID-MIB.txt
$ wget https://jpn.nec.com/univerge/ix/Manual/MIB/PICO-IPSEC-FLOW-MONITOR-MIB.txt -O /mnt/c/mib/nec/PICO-SMI-ID-MIB.txt

$ ls /mnt/c/mib/nec
PICO-IPSEC-FLOW-MONITOR-MIB.txt  PICO-SMI-ID-MIB.txt  PICO-SMI-MIB.txt
```

### 富士通

以下のサイトからzipファイルをダウンロードし、`srs.mib`をC:\mib\fujitsu内に保存します。
https://www.fujitsu.com/jp/products/network/download/sr-s/firm/mib/mibrev1.html

```
$ls /mnt/c/mib/fujitsu
srs.mib
```

### おまけ：YAMAHA

YAMAHAのルーター・スイッチは以下からダウンロードできます
http://www.rtpro.yamaha.co.jp/RT/FAQ/SNMP/private-mib.html

## MIBファイルの内容
MIBファイルの中身はテキストファイルになっていまして、OIDの数値と名前の対応関係やパラメータの形式などが記述されています。
DESCRIPTIONの項目にパラメータの説明が書かれていたりします。なお、プライベートMIBの説明は機器のマニュアルに説明が記述されていることが多いです。富士通製品の場合は説明が書かれたtxtファイルがzipファイル内に同梱されていたりもします。

```text:PICO-SMI-MIB.txt
(一部抜粋)
        picoIPv4CacheEntries OBJECT-TYPE
                SYNTAX  Gauge
                ACCESS  read-only
                STATUS  mandatory
                DESCRIPTION
                        "The number of current IPv4 cache."
                ::= { picoIPv4Cache 1 }
```

# snmpwalkコマンド

MIBファイルを導入したところで、先ほどの`snmpwalk`コマンドを実行すると数値ではなく名前で表示されることが確認できます。

```:systemwalk
$ snmpwalk -v2c -c public 192.168.10.1
RFC1213-MIB::sysDescr.0 = STRING: "NEC Portable Internetwork Core (省略
RFC1213-MIB::sysObjectID.0 = OID: PICO-SMI-ID::ix2207
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (173403378) 20 days, 1:40:33.78
RFC1213-MIB::sysContact.0 = STRING: "my-name"
RFC1213-MIB::sysName.0 = STRING: "IX2207"
RFC1213-MIB::sysLocation.0 = STRING: "my-room"
RFC1213-MIB::sysServices.0 = INTEGER: 72
(以下省略)
```

コマンドの後ろにOIDを指定すれば特定の要素を表示できます。
(せっかくなのでL2スイッチの情報も取得してみます)

```:OID指定
$ snmpwalk -v2c -c public 192.168.10.4 sysName.0
RFC1213-MIB::sysName.0 = STRING: "SR-S310TL2"

$ snmpwalk -v2c -c public 192.168.10.4 .1.3.6.1.2.1.1.4.0
RFC1213-MIB::sysContact.0 = STRING: "my-name"

$ snmpwalk -v2c -c public 192.168.10.4 enterprise
SRS-MIB::nosResetSystem.0 = INTEGER: none(1)
SRS-MIB::nosSystemErrorPoint.0 = Hex-STRING: 00 00 00 00
SRS-MIB::nosSystemErrorText1.0 = ""
(以下省略)
```

# snmptranslateコマンド

`snmptranslate`コマンドでOIDの名前・数値の変換が可能です。
`-On`オプションで名前から数値に変換可能です。

```:名前から数値(-On)
$ snmptranslate -On sysLocation.0
.1.3.6.1.2.1.1.6.0
```

`-Os`オプションで数値から名前に変換できます。

```:数値から名前(-Os)
$ snmptranslate -Os .1.3.6.1.2.1.1.6.0
sysLocation.0
```

`-Tp`オプションでツリー表示が可能です。

```:ツリー表示(-Tp)
$ snmptranslate -Tp
+--iso(1)
   |
   +--org(3)
      |
      +--dod(6)
         |
         +--internet(1)
            |
(以下省略)
```

`snmpwalk`と`snmptranslate`を組み合わせれば目的の情報を見つけられると思います。


# 参考文献

TCP/IP - SNMPとは - ネットワークエンジニアとして
https://www.infraexpert.com/study/tcpip21.html

UNIVERGE IXシリーズ　マニュアル
https://jpn.nec.com/univerge/ix/Manual/index.html

マニュアル セキュアスイッチ SR-Sシリーズ
https://www.fujitsu.com/jp/products/network/lan-switch/manual/sr-s/

Ubuntu 14.04, Ubuntu 16.04上のsnmpwalk,snmptranslateでエラーが出力される
https://mistymagich.wordpress.com/2016/07/19/ubuntu-14-04-ubuntu-16-04%E4%B8%8A%E3%81%AEsnmpwalksnmptranslate%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E5%8A%9B%E3%81%95%E3%82%8C%E3%82%8B/