Raspberry PiでCiscoルータをSNMP監視する方法|OID調査と取得コマンド

ネットワーク

ネットワーク機器を運用していると、「ルータが正常に動いているか」「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 IOS12.4(15)T8
ルータの監視IP192.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%未満
WARNING80%以上が5回連続
CRITICAL90%以上が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 1101,049,268 B205,526,544 B約33.0%
Pool 25,664,432 B34,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
FastEthernet01
FastEthernet26
FastEthernet48
Tunnel116
Vlan2021
Vlan4023

注意したいのは、インターフェース番号と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で自動実行します。

タイトルとURLをコピーしました