ネットワーク機器を運用していると、「ルータが正常に動いているか」「CPUやメモリの使用率が高くなっていないか」「インターフェースがDOWNしていないか」といった状態を継続的に把握したくなることがあります。
SNMPコマンドを使えば機器の状態を確認できますが、毎回手動でsnmpwalkを実行するのは手間がかかります。特に、夜間や外出中に障害が発生した場合、手動監視では異常に気づくのが遅れてしまいます。
そこで今回は、Raspberry Piを監視サーバとして利用し、Cisco C1812Jを24時間自動監視するシステムを構築しました。
PythonでSNMP情報を取得し、systemd timerで定期実行。CPU・メモリ・インターフェース状態などが設定した閾値を超えた場合は、Gmailを使って障害メールを送信します。
実際にWARNING・CRITICAL・RECOVERYのメール通知テストまで実施したので、構成や設定方法、ディレクトリ階層、動作確認の流れをまとめます。
今回構築するSNMP監視システムの概要
今回の構成では、Raspberry Piを監視サーバとして使用します。
監視対象はCiscoのサービス統合型ルータ「C1812J」です。
Raspberry PiからSNMPでルータの情報を取得し、取得した値をPythonで評価します。正常時はCSVファイルへ監視履歴を保存し、異常を検知した場合はGmail経由で通知メールを送信する仕組みです。
システム構成図
+------------------------+
| Cisco C1812J |
| 192.168.20.1 |
| |
| ・CPU使用率 |
| ・メモリ使用率 |
| ・インターフェース状態 |
| ・送受信トラフィック |
+-----------+------------+
|
| SNMPv2c
| UDP 161
|
+-----------v------------+
| Raspberry Pi |
| |
| Python 3 |
| Net-SNMP |
| systemd timer |
| |
| ・1分ごとに監視 |
| ・閾値判定 |
| ・連続障害判定 |
| ・監視履歴保存 |
+-----------+------------+
|
+--------+--------+
| |
v v
+---------------+ +----------------+
| CSV / JSON | | Gmail SMTP |
| ローカル保存 | | 障害メール通知 |
+---------------+ +----------------+
今回のシステムでは、専用の監視ソフトウェアを導入せず、PythonとLinuxの標準的な仕組みを組み合わせています。
そのため、監視処理を自分でカスタマイズしやすく、監視対象や閾値を柔軟に変更できる点が特徴です。
今回の検証環境
| 項目 | 使用環境 |
|---|---|
| 監視サーバ | Raspberry Pi |
| 監視対象 | Cisco C1812J |
| Cisco IOS | 12.4(15)T8 |
| ルータの監視IP | 192.168.20.1 |
| 監視プロトコル | SNMPv2c |
| 監視プログラム | Python 3 |
| SNMPコマンド | Net-SNMP |
| 自動実行 | systemd timer |
| 監視間隔 | 1分 |
| メール通知 | Gmail SMTP |
| SMTPポート | TCP 587(STARTTLS) |
| 監視データ保存 | CSV・JSON |
なお、IPアドレスやSNMPコミュニティ文字列は、自分のネットワーク環境に合わせて変更してください。
SNMP監視で取得する項目
今回の監視システムでは、Ciscoルータの死活監視だけでなく、CPU・メモリ・インターフェース状態・トラフィックを取得します。
また、監視サーバであるRaspberry Pi自身の状態も確認します。
Cisco C1812Jの監視項目
| 監視項目 | 監視内容 |
|---|---|
| SNMP応答 | ルータからSNMP応答が返るか |
| CPU使用率 | CPUの5分平均使用率 |
| メモリ使用率 | メモリプールごとの使用率 |
| インターフェース状態 | UP / DOWN |
| 受信トラフィック | 受信通信量からbpsを計算 |
| 送信トラフィック | 送信通信量からbpsを計算 |
単純なPing監視だけでは、ルータのCPU負荷やインターフェースの異常まで把握することはできません。
SNMPを利用することで、ネットワーク機器の内部状態をより詳しく監視できます。
Raspberry Pi自身の監視項目
Raspberry Pi側では、以下の項目を監視します。
- CPU負荷(ロードアベレージ)
- メモリ使用率
- ディスク使用率
- CPU温度
- 対応環境での低電圧状態
Raspberry PiのCPU負荷は、CPU使用率とは異なる指標です。今回の構成では、1分間ロードアベレージをCPUコア数で正規化した値を使用しています。
監視サーバ自身のリソース不足も検知することで、監視処理が不安定になる兆候を把握しやすくなります。
ただし、Raspberry Piそのものが停止すると監視処理もメール送信も停止するため、完全な死活監視には別の監視元が必要です。
Raspberry PiにSNMP監視環境を準備する
まずは、Raspberry Piに必要なパッケージをインストールします。
今回使用するのは、Python 3とNet-SNMPです。
必要なパッケージをインストール
sudo apt update
sudo apt install -y snmp python3
Net-SNMPをインストールすると、snmpwalkやsnmpgetなどのコマンドを利用できるようになります。
CiscoルータへのSNMP接続を確認
まず、Raspberry PiからC1812JへSNMPでアクセスできるか確認します。
snmpwalk -v2c -c COMMUNITY \
192.168.20.1 \
1.3.6.1.2.1.1.3.0
COMMUNITYには、Ciscoルータ側で設定しているSNMPコミュニティ文字列を指定します。
正常に取得できれば、ルータの稼働時間に関する値が返ってきます。

SNMP応答がない場合は、ルータ側のSNMP設定、アクセス制御リスト、Raspberry Piからの到達性などを確認してください。
SNMPv2cではコミュニティ文字列が暗号化されないため、監視元IPをACLで制限し、信頼できる管理ネットワーク内で使用することを推奨します。
Cisco C1812JのCPU使用率をSNMPで取得する
CPU監視には、Cisco独自のMIBを使用します。
今回のC1812Jでは、次のOIDからCPUの5分平均使用率を取得できました。
1.3.6.1.4.1.9.9.109.1.1.1.1.8
実行コマンドは以下のとおりです。
snmpwalk -v2c -c COMMUNITY \
192.168.20.1 \
1.3.6.1.4.1.9.9.109.1.1.1.1.8
実際の取得結果は次のようになりました。

iso.3.6.1.4.1.9.9.109.1.1.1.1.8.1 = Gauge32: 26
この結果から、CPUの5分平均使用率が26%であることが分かります。
CPU使用率が高い状態が継続すると、ルーティング処理や管理アクセスに影響が出る可能性があります。
今回の監視システムでは、CPU使用率の閾値を以下のように設定しました。
| 判定 | 条件 |
|---|---|
| 正常 | 80%未満 |
| WARNING | 80%以上が5回連続 |
| CRITICAL | 90%以上が5回連続 |
1分ごとの監視で5回連続判定するため、短時間の一時的な負荷上昇では通知しにくい構成になっています。
なお、取得しているCPU値自体が5分平均なので、瞬間的なCPU使用率とは異なります。
Cisco C1812Jのメモリ使用率をSNMPで取得する
次にメモリ使用率を取得します。
Ciscoルータでは、メモリの使用量と空き容量を別々のOIDから取得できます。
メモリ使用量を取得
snmpwalk -v2c -c COMMUNITY \
192.168.20.1 \
1.3.6.1.4.1.9.9.48.1.1.1.5
取得結果:
...1.5.1 = Gauge32: 101049268
...1.5.2 = Gauge32: 5664432
メモリ空き容量を取得
snmpwalk -v2c -c COMMUNITY \
192.168.20.1 \
1.3.6.1.4.1.9.9.48.1.1.1.6
取得結果:
...1.6.1 = Gauge32: 205526544
...1.6.2 = Gauge32: 34181456
今回の機器では、2つのメモリプールが取得できました。
メモリ使用率の計算方法
メモリ使用率は次の式で計算します。
メモリ使用率(%)
= 使用量 ÷(使用量 + 空き容量)× 100
実際の取得結果を計算すると、以下のようになります。
| メモリプール | 使用量 | 空き容量 | 使用率 |
|---|---|---|---|
| Pool 1 | 101,049,268 B | 205,526,544 B | 約33.0% |
| Pool 2 | 5,664,432 B | 34,181,456 B | 約14.2% |
この時点では、両方のメモリプールに十分な空き容量がありました。
監視では各プールを個別に判定し、85%以上でWARNING、95%以上でCRITICALとしています。
インターフェースのUP・DOWNをSNMPで監視する
ネットワーク監視で重要なのが、インターフェースの状態監視です。
Ciscoルータでは、SNMPのifOperStatusを使用して、インターフェースがUPしているかDOWNしているかを取得できます。
ただし、インターフェースごとに異なるifIndexを指定する必要があります。
ifIndexを確認する
まず、次のOIDで監視対象のインターフェース名を取得します。
snmpwalk -v2c -c COMMUNITY \
192.168.20.1 \
1.3.6.1.2.1.31.1.1.1.1
今回のC1812Jでは、以下のifIndexを確認できました。
| インターフェース | ifIndex |
|---|---|
| FastEthernet0 | 1 |
| FastEthernet2 | 6 |
| FastEthernet4 | 8 |
| Tunnel1 | 16 |
| Vlan20 | 21 |
| Vlan40 | 23 |
注意したいのは、インターフェース番号とifIndexは必ずしも一致しないという点です。
例えば、FastEthernet2のifIndexは6です。

そのため、FastEthernet2の状態を取得する場合は、次のOIDを使用します。
snmpget -v2c -c COMMUNITY \
192.168.20.1 \
1.3.6.1.2.1.2.2.1.8.6
ifOperStatusでは、代表的な値として1がUP、2がDOWNを意味します。

64bitカウンタでインターフェースの通信量を取得する
インターフェースの状態だけでなく、送受信トラフィックも監視します。
今回のC1812Jでは、64bitカウンタであるifHCInOctetsとifHCOutOctetsが取得できました。
受信通信量のOID
1.3.6.1.2.1.31.1.1.1.6
送信通信量のOID
1.3.6.1.2.1.31.1.1.1.10
実行例:
# 受信通信量
snmpwalk -v2c -c COMMUNITY \
192.168.20.1 \
1.3.6.1.2.1.31.1.1.1.6
# 送信通信量
snmpwalk -v2c -c COMMUNITY \
192.168.20.1 \
1.3.6.1.2.1.31.1.1.1.10
これらの値は、インターフェースで送受信した累積バイト数です。
そのままでは現在の通信速度を表していません。
通信速度をbpsで計算する
通信速度は、前回取得値と今回取得値の差分から計算します。
通信速度(bps)
=(今回のOctets - 前回のOctets)× 8 ÷ 経過秒数
例えば、60秒間で7,500,000バイト増加した場合は、次のようになります。
7,500,000 × 8 ÷ 60
= 1,000,000 bps
= 1 Mbps
Pythonの監視プログラムでは、前回取得したカウンタをJSONファイルへ保存し、次回実行時に差分を計算します。
なお、ルータ再起動やカウンタリセットが発生すると、単純な差分計算では正しい通信速度を算出できません。
そのため、再起動やカウンタの不連続を考慮した処理が必要です。
まとめ
Cisco C1812JからSNMPでCPU使用率、メモリ使用率、インターフェース状態、64bitトラフィックカウンタを取得できました。次回は、これらのOIDを使ってPython監視プログラムを作成し、systemdで自動実行します。
