Ciscoルータのポート一覧をSNMPで取得する

ルータやスイッチなどのネットワーク機器のポート一覧を表示する方法です。
``snmpwalk``コマンドを利用して、ポート一覧を表示します。
この記事ではUbuntu15.04からSNMPでCisco1812Jのポート一覧を取得します。

## Ciscoルータの準備
中古のCisco1812Jに、最低限のIPアドレスとSNMPの設定をする。
SNMPのコミュニティ名は``public``で、アクセスリストの設定は省略します。

```zsh:Cisco
R1#show run | sec snmp|FastEthernet0
interface FastEthernet0
 description WAN
 ip address 192.168.88.101 255.255.255.0
 duplex auto
 speed auto
ip route 0.0.0.0 0.0.0.0 FastEthernet0 192.168.88.1
snmp-server community public RO
snmp-server ifindex persist
snmp-server chassis-id R1
```

## Ubuntu（Linux）側の準備
``snmpwalk``コマンドのパッケージ``snmp``とMIBをダウンロードする``snmp-mibs-downloader``をインストール。

```zsh:Ubuntu15.04
% sudo apt-get install snmp snmp-mibs-downloader
% sudo download-mibs
```

CISCOのプライベートMIBは下記の設定ファイルでダウンロードできます。

```zsh:/etc/snmp-mibs-downloader/cisco.conf
HOST=ftp://ftp.cisco.com
DIR=pub/mibs/v2/
CONF=ciscolist
DEST=cisco
```

必要なMIBを定義します。

```zsh:/etc/snmp-mibs-downloader/ciscolist 
CISCO-IMAGE-MIB.my CISCO-IMAGE-MIB
CISCO-SMI.my CISCO-SMI
MPLS-VPN-MIB.my MPLS-VPN-MIB
CISCO-BGP4-MIB.my CISCO-BGP4-MIB
CISCO-PING-MIB.my CISCO-PING-MIB
CISCO-TC.my CISCO-TC
```

```zsh:CiscoのプライベートMIBをダウンロード
% sudo download-mibs cisco
```


snmpwalkコマンドの実行時にMIBを参照させるために設定ファイルを記述する。

```zsh:/etc/snmp/snmp.conf
mibdirs /var/lib/mibs/iana:/var/lib/mibs/ietf:/var/lib/mibs/cisco
mibs all
showMibErrors no
mibWarningLevel 0
strictCommentTerm no
mibAllowUnderline no
```

試しに``snmpwalk``を実行すると、MIBのエラーを吐く。

```zsh:snmpwalk実行結果
% snmpwalk -v 2c -c public 192.168.88.101 system
Bad operator (INTEGER): At line 73 in /var/lib/mibs/ietf/SNMPv2-PDU
Unlinked OID in IPATM-IPMC-MIB: marsMIB ::= { mib-2 57 }
Undefined identifier: mib-2 near line 18 of /var/lib/mibs/ietf/IPATM-IPMC-MIB
Expected "::=" (RFC5644): At line 493 in /var/lib/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
Expected "{" (EOF): At line 651 in /var/lib/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
Bad object identifier: At line 651 in /var/lib/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
Bad parse of OBJECT-IDENTITY: At line 651 in /var/lib/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
SNMPv2-MIB::sysDescr.0 = STRING: Cisco IOS Software, C181X Software (C181X-ADVENTERPRISEK9-M), Version 15.1(4)M4, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2012 by Cisco Systems, Inc.
Compiled Tue 20-Mar-12 23:34 by prod_rel_team
SNMPv2-MIB::sysObjectID.0 = OID: CISCO-SMI::ciscoProducts.642
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (22380) 0:03:43.80
SNMPv2-MIB::sysContact.0 = STRING: 
SNMPv2-MIB::sysName.0 = STRING: R1.cisco.com
SNMPv2-MIB::sysLocation.0 = STRING: 
SNMPv2-MIB::sysServices.0 = INTEGER: 78
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
```

エラーを吐くMIBは不要なので場当たり的に削除する。

```
sudo rm /var/lib/mibs/ietf/SNMPv2-PDU
sudo rm /var/lib/mibs/ietf/IPATM-IPMC-MIB
sudo rm /var/lib/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
```

不要なMIBの削除後はエラーが消えました。これで準備が完了。

```zsh:snmpwalk実行結果
% snmpwalk -v 2c -c public 192.168.88.101 system
SNMPv2-MIB::sysDescr.0 = STRING: Cisco IOS Software, C181X Software (C181X-ADVENTERPRISEK9-M), Version 15.1(4)M4, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2012 by Cisco Systems, Inc.
Compiled Tue 20-Mar-12 23:34 by prod_rel_team
SNMPv2-MIB::sysObjectID.0 = OID: CISCO-SMI::ciscoProducts.642
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (54935) 0:09:09.35
SNMPv2-MIB::sysContact.0 = STRING: 
SNMPv2-MIB::sysName.0 = STRING: R1.cisco.com
SNMPv2-MIB::sysLocation.0 = STRING: 
SNMPv2-MIB::sysServices.0 = INTEGER: 78
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
```

## SNMPのOID
SNMPでポート一覧を表示するMIBのObjectID（OID）です。
詳細は[Cisco SNMP オブジェクトナビゲータ](http://tools.cisco.com/Support/SNMP/do/BrowseOID.do?local=ja)で確認することができます。

- ポートの名前
  - ifDescr（1.3.6.1.2.1.2.2.1.2）：インタフェース名（FastEthernet0）
  - ifName（1.3.6.1.2.1.31.1.1.1.1：インタフェース名（上記の省略形、Fa0）
  - ifAlias(1.3.6.1.2.1.31.1.1.1.18)：Ciscoルータの場合、descriptionの文字列を取得できる
- ポートの状態
  - ifAdminStatus（1.3.6.1.2.1.2.2.1.7）：設定の状態（shutdown / no shutdown）
  - ifOperStatus（1.3.6.1.2.1.2.2.1.8）：現在の状態（LinkDown / LinkUp）


## SNMP実行例


### インタフェース名の一覧
ifDescr（1.3.6.1.2.1.2.2.1.2）：インタフェース名（FastEthernet0）

```zsh:snmpwalk実行結果
% snmpwalk -v 2c -c public 192.168.88.101 ifDescr
IF-MIB::ifDescr.1 = STRING: FastEthernet0
IF-MIB::ifDescr.2 = STRING: FastEthernet1
IF-MIB::ifDescr.3 = STRING: BRI0
IF-MIB::ifDescr.4 = STRING: BRI0:1
IF-MIB::ifDescr.5 = STRING: BRI0:2
IF-MIB::ifDescr.6 = STRING: FastEthernet2
IF-MIB::ifDescr.7 = STRING: FastEthernet3
IF-MIB::ifDescr.8 = STRING: FastEthernet4
IF-MIB::ifDescr.9 = STRING: FastEthernet5
IF-MIB::ifDescr.10 = STRING: FastEthernet6
IF-MIB::ifDescr.11 = STRING: FastEthernet7
IF-MIB::ifDescr.12 = STRING: FastEthernet8
IF-MIB::ifDescr.13 = STRING: FastEthernet9
IF-MIB::ifDescr.14 = STRING: Null0
IF-MIB::ifDescr.15 = STRING: Vlan1
IF-MIB::ifDescr.16 = STRING: BRI0-Physical
IF-MIB::ifDescr.17 = STRING: BRI0-Signaling
IF-MIB::ifDescr.18 = STRING: BRI0:1-Bearer Channel
IF-MIB::ifDescr.19 = STRING: BRI0:2-Bearer Channel
```

### インタフェース名（省略形）の一覧
ifName（1.3.6.1.2.1.31.1.1.1.1：インタフェース名（上記の省略形、Fa0）

```zsh:snmpwalk実行結果
% snmpwalk -v 2c -c public 192.168.88.101 ifName
IF-MIB::ifName.1 = STRING: Fa0
IF-MIB::ifName.2 = STRING: Fa1
IF-MIB::ifName.3 = STRING: BR0
IF-MIB::ifName.4 = STRING: BR0:1
IF-MIB::ifName.5 = STRING: BR0:2
IF-MIB::ifName.6 = STRING: Fa2
IF-MIB::ifName.7 = STRING: Fa3
IF-MIB::ifName.8 = STRING: Fa4
IF-MIB::ifName.9 = STRING: Fa5
IF-MIB::ifName.10 = STRING: Fa6
IF-MIB::ifName.11 = STRING: Fa7
IF-MIB::ifName.12 = STRING: Fa8
IF-MIB::ifName.13 = STRING: Fa9
IF-MIB::ifName.14 = STRING: Nu0
IF-MIB::ifName.15 = STRING: Vl1
IF-MIB::ifName.16 = STRING: BR0
IF-MIB::ifName.17 = STRING: BR0
IF-MIB::ifName.18 = STRING: BR0:1
IF-MIB::ifName.19 = STRING: BR0:2
```

### descriptionの一覧
ifAlias(1.3.6.1.2.1.31.1.1.1.18)：Ciscoルータの場合、descriptionの文字列を取得できる

```zsh:snmpwalk実行結果
% snmpwalk -v 2c -c public 192.168.88.101 ifAlias
IF-MIB::ifAlias.1 = STRING: WAN
IF-MIB::ifAlias.2 = STRING: LAN
IF-MIB::ifAlias.3 = STRING: 
IF-MIB::ifAlias.4 = STRING: 
IF-MIB::ifAlias.5 = STRING: 
IF-MIB::ifAlias.6 = STRING: SW1
IF-MIB::ifAlias.7 = STRING: SW2
IF-MIB::ifAlias.8 = STRING: 
IF-MIB::ifAlias.9 = STRING: 
IF-MIB::ifAlias.10 = STRING: 
IF-MIB::ifAlias.11 = STRING: 
IF-MIB::ifAlias.12 = STRING: 
IF-MIB::ifAlias.13 = STRING: 
IF-MIB::ifAlias.14 = STRING: 
IF-MIB::ifAlias.15 = STRING: 
IF-MIB::ifAlias.16 = STRING: 
IF-MIB::ifAlias.17 = STRING: 
IF-MIB::ifAlias.18 = STRING: 
IF-MIB::ifAlias.19 = STRING: 
```

### インタフェースの設定状態一覧
ifAdminStatus（1.3.6.1.2.1.2.2.1.7）：設定の状態（shutdown / no shutdown）

```zsh:snmpwalk実行結果
% snmpwalk -v 2c -c public 192.168.88.101 ifAdminStatus
IF-MIB::ifAdminStatus.1 = INTEGER: up(1)
IF-MIB::ifAdminStatus.2 = INTEGER: down(2)
IF-MIB::ifAdminStatus.3 = INTEGER: down(2)
IF-MIB::ifAdminStatus.4 = INTEGER: down(2)
IF-MIB::ifAdminStatus.5 = INTEGER: down(2)
IF-MIB::ifAdminStatus.6 = INTEGER: up(1)
IF-MIB::ifAdminStatus.7 = INTEGER: up(1)
IF-MIB::ifAdminStatus.8 = INTEGER: up(1)
IF-MIB::ifAdminStatus.9 = INTEGER: up(1)
IF-MIB::ifAdminStatus.10 = INTEGER: up(1)
IF-MIB::ifAdminStatus.11 = INTEGER: up(1)
IF-MIB::ifAdminStatus.12 = INTEGER: up(1)
IF-MIB::ifAdminStatus.13 = INTEGER: up(1)
IF-MIB::ifAdminStatus.14 = INTEGER: up(1)
IF-MIB::ifAdminStatus.15 = INTEGER: up(1)
IF-MIB::ifAdminStatus.16 = INTEGER: down(2)
IF-MIB::ifAdminStatus.17 = INTEGER: down(2)
IF-MIB::ifAdminStatus.18 = INTEGER: down(2)
IF-MIB::ifAdminStatus.19 = INTEGER: down(2)
```

### インタフェースの現在の状態一覧
ifOperStatus（1.3.6.1.2.1.2.2.1.8）：現在の状態（LinkDown / LinkUp）

```zsh:snmpwalk実行結果
% snmpwalk -v 2c -c public 192.168.88.101 ifOperStatus
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
IF-MIB::ifOperStatus.2 = INTEGER: down(2)
IF-MIB::ifOperStatus.3 = INTEGER: down(2)
IF-MIB::ifOperStatus.4 = INTEGER: down(2)
IF-MIB::ifOperStatus.5 = INTEGER: down(2)
IF-MIB::ifOperStatus.6 = INTEGER: down(2)
IF-MIB::ifOperStatus.7 = INTEGER: down(2)
IF-MIB::ifOperStatus.8 = INTEGER: down(2)
IF-MIB::ifOperStatus.9 = INTEGER: down(2)
IF-MIB::ifOperStatus.10 = INTEGER: down(2)
IF-MIB::ifOperStatus.11 = INTEGER: down(2)
IF-MIB::ifOperStatus.12 = INTEGER: down(2)
IF-MIB::ifOperStatus.13 = INTEGER: down(2)
IF-MIB::ifOperStatus.14 = INTEGER: up(1)
IF-MIB::ifOperStatus.15 = INTEGER: down(2)
IF-MIB::ifOperStatus.16 = INTEGER: down(2)
IF-MIB::ifOperStatus.17 = INTEGER: down(2)
IF-MIB::ifOperStatus.18 = INTEGER: down(2)
IF-MIB::ifOperStatus.19 = INTEGER: down(2)
```