SNMP初心者のためのSNMPプロトコル概要
SNMP とは、Simple Network Management Protocol の略で、IP を持つ様々な機器がきちんと働いているか、もしくは働く上で問題が無いか、といった観点で機器を監視するためのプロトコルです。
監視とは具体的には『CPU やメモリ、インタフェースでのパケット受信がどのくらい使われているか?筐体内の温度は何℃か?』といった状態監視や、『HDD や電源、ファン等の部品が壊れていないか?』といったハードウェア監視、『L2 ループが発生していないか?』といったソフトウェア監視など、多岐に渡ります。
これらの監視は『SNMP マネージャから SNMP エージェントへのポーリングによる情報取得』と『SNMP エージェントから SNMP マネージャへのトラップ/インフォーム通知』の 2 種類の仕組みにより実現します。
具体的な構成例を以下に示します。以下の例では、Linux OS 上に「Nagios」というフリーの監視ソフトをインストールしており、その Nagios の中に SNMP Manager の機能が含まれています。また、監視対象のサーバや NW 機器上では SNMP エージェントが動作しています。
SNMPマネージャ (SNMPサービス) とは
SNMP マネージャとは、SNMP エージェントからの情報を受信するプログラムを指します。Windows だと SNMP サービスとも呼びます。
製品としては、CPU 利用率などの時系列をグラフィカルに表示する仕組みも内包されるものが多く、そこまで含めて SNMP マネージャと呼ぶことがあります。
情報の集め方は主に2種類あります。
- SNMP ポーリング (能動的)
- SNMP トラップ/インフォーム (受動的)
SNMP マネージャは SNMP エージェントに対して udp の 161 番ポートを使ってポーリング (SNMP Get-Request の送信と SNMP Get-Response の受信) を定期的 (例えば 3 分間隔) に行います。ポーリングにはどういう情報が欲しいかを記載します。そして SNMP エージェントは要求された情報をマネージャに返信します。
また、それとは別に、SNMP エージェント側の機器に何か障害が発生したときは、速やかに SNMP エージェントから能動的にトラップ/インフォーム Request を送信します。
SNMP マネージャはWindows サーバや Linux サーバの上にインストールするもので、Windows/Linux 標準の SNMP マネージャ (サービス) を流用したり、監視ソフトに内包されたライブラリを使うのが一般的ですが、監視ソフトとしては、SNMP による情報を取得するだけでなく、それ以外にもサービス監視、プロセス監視といった機能を持つことが多いです。それらは場合によっては SNMP エージェント以外のエージェントにより実現します。(先程の図の例であれば、Nagios エージェント)
各監視の説明については下記ページをご参照下さい。
また、監視ソフトには例えば以下があります。
・有償ソフト:OP Manager, PRTG, 等
SNMPエージェントとは
SNMP エージェントは、ネットワーク機器であれば大抵初期インストールされており、設定で有効にするだけで使えるようになります。
例えば Cisco であれば以下コマンドで使えるようになります。
Router(config)# snmp-server community public RO
また、Windows も同様に、「SNMP Service」というサービスを設定・起動するだけで使えるようになります。
⇒『ファイル名を指定して実行』の名前欄に services.msc と押下しEnter
⇒以下画面の該当箇所をダブルクリックし、「起動」ボタンをクリック
Linux は net-snmp というパッケージをインストールし、設定・有効化することで使えるようになります。
SNMPのバージョン
SNMP は一般にバージョン 1 及びバージョン 2 は利用されません。
バージョン 2c かバージョン 3 が使われます。
バージョン 2c まではセキュリティが甘く、コミュニティと呼ばれる文字列が平文でやり取りされるため、パケットキャプチャをすればコミュニティが分かり、結果、第三者が簡単に MIB 情報取得を出来てしまいます。
例えば先程の Cisco のコマンドの例では、コミュニティは "public" となります。
バージョン 3 からは暗号化がサポートされ、その問題を回避できます。
SNMPでTCPでは無くUDPを使う理由、ポート番号について
SNMP ではポーリングは UDP/161 番ポート、トラップ/インフォームは UDP/162 番ポートが使われます。
SNMP は一度にたくさんの機器を監視するケースが多いため、TCP だとマネージャにたくさんのコネクションが張られ、負荷が大きいです。
また、小さいデータしか扱わないため、例えば実容量が 96 Bytes 程度のやり取りをする場合は、3way Handshake や FIN/ACK の処理も含めると、UDP で扱う場合に比べて通信量が約 2.8 倍にもなります。
なので SNMP ではUDP を使い、ポーリングに 3 回連続応答しない場合は異常があったと見做す、というような設定が一般的です。
ポーリングは往復が前提であるため、応答が無ければ異常だと検知できますが、トラップはエージェントから一方的に送られるだけです。なので万が一マネージャがそのパケットを取りこぼした場合は検知できません。
そのため、バージョン 2 からはトラップだけでなく、インフォームという方式も使えるようになりました。SNMP エージェントがインフォームリクエストで SNMP マネージャに通知した場合、SNMP マネージャは SNMP エージェントにインフォームレスポンスを返さなければなりません。
もし SNMP マネージャがインフォームリクエストを取りこぼした場合、レスポンスが返されませんので、SNMP エージェントはタイムアウトの後、リクエストの再送を試みます。
MIBとは
MIB とは、機器の監視に使えるような情報を含んだ軽量のデータベースです。oid と呼ばれる一意な識別子により、どのような情報が含まれているかが決まっています。
例えば CPU 使用率の情報は oid ="1.3.6.1.2.1.25.3.3.1.2" です。
SNMP ポーリングではマネージャ側が oid を指定し、その MIB 情報を取りに行っています。また、トラップ/インフォームでは、エージェント側がどのようなトラップ/インフォームを出すかを設定しておき、それに対応する oid の情報が変わった際にトラップ/インフォームを送信します。
MIB は大きく 2 種類に分かれます。
1 つはすべての機器に共通のもので、MIB-2と呼ばれています。もう 1 つはベンダ独自のもので、ベンダー MIB (プライベートMIB) と呼ばれています。
MIB-2 の oid は 1.3.6.1.2.1 で始まるものです。例えば先程の CPU 負荷は MIB-2 です。その他、ホスト名やインタフェースのユニキャストパケット受信量など、汎用的なものが含まれています。
一方、ベンダー MIB の oid は 1.3.6.1.4.1 です。この次の値はベンダを識別するものです。例えば Alaxala であれば "21839" ですので、"1.3.6.1.4.1.21839." と続いていきます。
これらにはベンダ独自の情報が含まれています。例えば、Alaxala のリングプロトコルに関連する情報なども存在し、リングプロトコルのステータス (リングが保たれているか否か) 等の情報も取得できます。
各メーカ、SNMP ベンダー MIB は公開されているか、購入後にベンダから提供されますので、必要に応じて調べ、監視項目として設定していくのが良いでしょう。
oid は以下サイト等から調べられます。
SNMP writeの実装例
SNMP には Read モードと Write モードの 2 種類がありますが、基本的に Read モードのみが使われることが多いです。監視では情報を読み取るだけなので、監視のみが目的であれば、Read だけで事足りるからです。
では Write モードではどのようなことが出来て、どのような実装があるのでしょうか。
SNMP Writeモードで出来ること
まず、Write モードでは機器の MIB 値の変更が出来ます。これにより、特定インタフェースを Down させたり、機器自体をリブートしたりと、MIB が持っている内容に応じて、様々な連携が可能になります。
SNMP Writeモードの実装例
例えば IPS と連携して、事後検疫システムの実装が出来ます。
具体的には、{UTM = Fortinet FortiGate}, {コア L3 スイッチ =Alcatel-Lucent OmniSwitch} で、Alcatel-Lucent が提供するソフトウェア "OmniVista" をインストールした Windows サーバで以下のような構成を組みます。
FortiGate の IPS 機能で不正通信ログを OmniVista へ syslog で飛ばし、その syslog に含まれる IP 情報を OmniSwitch へ Alcatel 独自 MIB を SNMP write で変更することで、その IP に紐づく MAC アドレスの通信を禁止する、といった連携が可能です。
コメント
いつも分かりやすい記事をありがとうございます。
仕事でトラブル対応していく中で、SNMPとOIDの関係性がイマイチ理解しておらず、言葉だけを知っていた状態でしたが、こちらの記事で理解が出来ました!ありがとうございますm(_ _)m
また、引き続き記事を読ませてください。よろしくお願いいたします。