SNMP サービス導入
ネットワークは常時正常に動作していることが求められる。そのためには,構築後にも放置せず定期的にメンテナンスする必要がある。日々管理を行うための具体的な方法としては,サーバが書き出すログ情報を見たり,セキュリティホールを埋めるパッチを当てたりと,きめ細やかな配慮が必要だ。
しかしこれらの作業だけでなく,ハードウェアや回線のトラブルがなく,ネットワークに接続されている機器類が正常に動作しているのかどうかを調べることも,安定した動作を保つのに欠かせないことだ。このようなネットワーク機器の監視を行う場合に便利なのが,「SNMP(Simple Network Management Protocol)」の利用である。本稿では,SNMPを使い,MRTGと組み合わせてネットワークモニタリングを行う方法を解説しよう。
SNMPって何だ?
SNMPとは,ネットワークに接続された機器類をネットワーク経由で監視するためのプロトコルだ。このプロトコルはRFC1157で定義されている。
SNMPに対応する機器類には,その機器の情報を保持するための「管理情報領域」と呼ばれる領域が用意されている。たとえばルーターであれば,そのルーターを流れたデータのバイト数,ネットワークプリンタであれば,プリンタのステータス,用紙情報,トナー残量などが管理情報領域に格納されている。管理情報領域にどのような情報が保存されているのかは,機器によって異なる。
SNMPに対応する機器内には,ネットワークを通じて管理情報領域にアクセスするためのインタフェースが用意される。このインタフェースは「SNMPエージェント」と呼ばれる。SNMPエージェントはUDPを使ってネットワーク通信するモジュールだ。
SNMPに対応する機器――つまりSNMPエージェントが搭載された機器――の情報を得るには,サーバーやクライアントなどのホストに「SNMPマネージャ」と呼ばれるソフトをインストールする。SNMPマネージャは,SNMPエージェントと通信し,SNMPに対応する機器類内にある管理情報領域の情報を,取得したり設定する機能を持つ。つまりネットワーク管理者は,SNMPマネージャを使うことで,ネットワーク上に配置されたネットワーク機器の情報を1か所で管理できるようになる。
コミュニティの設定
まずは,コミュニティを設定する。コミュニティとは,SNMPにおけるネットワーク範囲のことをいう。コミュニティは,com2sec行で設定する。デフォルトの設定(EXAMPLE.confファイルをコピーしたsnmpd.confファイルの状態)は,次のようになっている。
# sec.name source community
com2sec local localhost COMMUNITY
com2sec mynetwork NETWORK/24 COMMUNITY |
このうちの“NETWORK/24”と書かれている部分を,SNMPマネージャを使いたいネットワーク範囲――いい換えれば管理者がSNMPマネージャを使って管理情報を見るホストが存在するネットワーク――に変更する。多くの場合,LANで使われているネットワークを設定する。
このうちの“NETWORK/24”と書かれている部分を,SNMPマネージャを使いたいネットワーク範囲――いい換えれば管理者がSNMPマネージャを使って管理情報を見るホストが存在するネットワーク――に変更する。多くの場合,LANで使われているネットワークを設定する。
そしてさらに,“COMMUNITY”の部分を,設定したいコミュニティ名に設定する。コミュニティ名とは,SNMPのパスワードにも該当する設定だ。多くの場合,ローカル環境で使うコミュニティ名には“private”,比較的グローバルな環境で使うコミュニティ名には“public”を使うことが多い。そこで本稿ではそれに倣い,localhost(自分自身)から接続できるコミュニティ名には“private”,LANから接続できるコミュニティ名には“public”と名付けることにする。
たとえば,192.168.0.0/24(192.168.0.0/255.255.255.0と同じ)のネットワークからSNMPマネージャを使って,このマシンを管理できるようにするには,設定を次のように変更する。
# sec.name source community
com2sec local localhost private
com2sec mynetwork 192.168.0.0/24 public |
もちろんネットワーク全体ではなく,特定のホストからしかSNMPマネージャを使った管理を行わせたくないこともあるだろう。その場合には,そのホストのアドレスを指定すればよい。たとえば次のようにすると,192.168.0.100というIPアドレスをもつホストもしくはlocalhost(SNMPエージェントが動作しているマシン自身)以外からは,SNMPエージェントに接続できなくなる。
# sec.name source community
com2sec local localhost private
com2sec mynetwork 192.168.0.100 public |
セキュリティグループの設定
次に,セキュリティグループを設定する。セキュリティグループは,group行で設定する。デフォルトは次のようになっている。
# sec.model sec.name
group MyRWGroup v1 local
group MyRWGroup v2c local
group MyRWGroup usm local
group MyROGroup v1 mynetwork
group MyROGroup v2c mynetwork
group MyROGroup usm mynetwork |
この設定は,MyRWGroupグループとMyROGroupグループの2つのセキュリティグループを作る設定になっている。すぐあとに説明するaccess行の設定にて,MyRWGroupグループには管理情報領域の読み書き権限が,MyROGroupグループには管理情報領域の読み取り権限のみが与えられる。
SNMPでは,SNMPマネージャを使ってSNMPエージェント側の管理情報領域を読み出すだけでなく,管理情報領域内を書き換えることもできる。しかしSNMPは基本的にコミュニティ名での簡単なパスワード識別しか行わないので,適切なセキュリティ対策をとらずにそのまま書き換え許可を与えると,第三者が不正な書き換えをする可能性がある。
そこで本稿では,より安全にSNMPを使うために,SNMPを使って情報を読み取ることができるが,情報を書き換えることはできないよう設定する。それにはMyRWGroupという部分の行の先頭に“#”を挿入し,次のようにコメントアウトすればよい。
# sec.model sec.name
#group MyRWGroup v1 local
#group MyRWGroup v2c local
#group MyRWGroup usm local
group MyROGroup v1 mynetwork
group MyROGroup v2c mynetwork
group MyROGroup usm mynetwork |
ビューの設定
次に,SNMPエージェント(snmpd)が保持する管理情報領域のうち,どの部分を公開するのかを設定する。その設定をするのがview行だ。デフォルトでは,次のようになっている。
# incl/excl subtree mask 80
view all include .1 80 |
この設定は,すべての情報を見せるという設定だ。詳しくは「SNMPにおける情報取得の基礎」にて説明するが,管理情報領域は階層構造をもつツリー構造になっている。この設定を変更すると,一部の階層以下しか公開しない設定にすることができる。
LANから利用する場合には,すべての管理情報領域を公開するというデフォルトの設定で問題ない。
アクセス権限の設定
次に,どのホストで動作しているSNMPマネージャから,どのような操作を許すのかを設定する。この設定はaccess行で指定する。デフォルトでは,次のようになっている。
# context sec.model sec.level match read write notif
access MyROGroup "" any noauth exact all none none
access MyRWGroup "" any noauth exact all all none |
この設定は,すでにgroup行にて設定したMyROGroupグループに読み取り権限を,MyRWGroupグループに書き込み権限を与える設定となっている(ただしgroup行の説明において,MyRWGroupグループを定義しているgroup行の行頭に“#”を挿入し,コメント行として無効化しているからMyRWGroupグループは存在しない。つまり読み書きできるグループそのものがない)。通常は,このままの設定でよい。
よりセキュリティを高めたいのであれば,“noauth”と書かれている部分を“auth”や“priv”に変更すると,コミュニティ名の一致だけでなく,別の認証方式を組み合わせて使うことができるのだが,その説明は本稿では割愛する。
システム情報の設定
システム情報を設定する。これは,syslocation行とsyscontact行に設定する。デフォルトでは,次のようになっている。
syslocation Right here, right now.
syscontact Me <me@somewhere.org> |
syslocation行には,このLinuxマシンの場所や用途など,syscontact行には管理者のメールアドレスの情報などをそれぞれ設定する。両者とも,任意の文字列を設定できる。たとえば,次のように変更する。
syslocation Red Hat Linux Server
syscontact Fumitaka Osawa<osawa@example.co.jp> |
syslocation行やsyscontact行そのものを省略したときには,configureコマンドを実行したときに入力した情報が設定されたものとみなされる。
OIDツリーの一覧を得る
オブジェクトのツリー構造を知るには,snmpdと接続して,snmpdがもっている管理情報領域内のオブジェクトの一覧を参照しておくとより理解が早いだろう。
ucd-snmpには,特定の階層ツリー以下のオブジェクトを一覧表示するsnmpwalkというコマンドが用意されている。snmpwalkコマンドは,次の書式で用いる
ホスト名には接続したいSNMPエージェントのホスト名またはIPアドレスを,コミュニティ名には接続に使うコミュニティ名を指定する。ここで指定するコミュニティ名は,snmpd.confファイル内のcom2sec行で指定したものだ。OIDには,取得したい階層ツリーとなるオブジェクトのOIDの先頭に“.”(ピリオド)を付けて指定する。すべてのオブジェクトを取得したければ,OIDとして単に“.”を指定すればよい。もし特定のツリー以下を表示したいのであれば,そのツリーのオブジェクトのOIDを指定する。たとえばFig.3に示したmib-2サブツリー以下を取得したいのであれば,“.1.3.6.1.2.1”というOIDを指定する。
たとえば,localhost(自分自身)に対して,コミュニティ名privateで接続し,全ツリーの一覧を取得するには,次のようにする。
$ snmpwalk localhost private . |
すると,次のように,全ツリーの一覧が表示される。
system.sysDescr.0 = Linux tiger.example.co.jp 2.2.14-5.0 #1 Tue Mar 7 21:07:39 EST 2000 i686
system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.linux
system.sysUpTime.0 = Timeticks: (40995719) 4 days, 17:52:37.19
system.sysContact.0 = Fumitaka Osawa <osawa@example.co.jp>
system.sysName.0 = tiger.example.co.jp
system.sysLocation.0 = Red Hat Linux Server
system.sysORLastChange.0 = Timeticks: (0) 0:00:00.00
system.sysORTable.sysOREntry.sysORID.1 = OID: ifMIB
system.sysORTable.sysOREntry.sysORID.2 = OID: .iso.org.dod.internet.snmpV2.snmpM
odules.snmpMIB
system.sysORTable.sysOREntry.sysORID.3 = OID: tcpMIB
system.sysORTable.sysOREntry.sysORID.4 = OID: ip
system.sysORTable.sysOREntry.sysORID.5 = OID: udpMIB
…以下略… |
mib-2サブツリー
mib-2サブツリー以下には,IPプロトコルにおける汎用的な管理情報を保持するオブジェクトが含まれている。mib-2サブツリーの構造はRFC1213で定義されており,SNMPに対応するほとんどのネットワーク機器は,mib-2サブツリーをサポートしている。
mib-2サブツリーには,OID“1.3.6.1.2.1”が割り当てられている。そしてその配下には,Table 1に示す10個のサブツリーが存在する(Fig.5)。たとえば,systemサブツリーのOIDは“1.3.6.1.2.1.1”,interfacesサブツリーのOIDは“1.3.6.1.2.1.2”のようになる。
以下,各サブツリーを解説する。
Table 1 mib-2サブツリー(1.3.6.1.2.1)
OID |
1.3.6.1.2.1.1 |
サブツリー名 |
system |
用途 |
システム(SNMPエージェント)に関する情報が格納される |
OID |
1.3.6.1.2.1.2 |
サブツリー名 |
interfaces |
用途 |
インタフェース情報に関する情報が格納される |
OID |
1.3.6.1.2.1.3 |
サブツリー名 |
at |
用途 |
IPアドレスと物理的なアドレスとの変換テーブルが格納される。現在は,同じ内容の情報が,ipサブツリーやtransmissionサブツリーのほうに存在するので,atサブツリーの使用は推奨されない |
OID |
1.3.6.1.2.1.4 |
サブツリー名 |
ip |
用途 |
IPに関する情報が格納される |
OID |
1.3.6.1.2.1.5 |
サブツリー名 |
icmp |
用途 |
ICMPに関する情報が格納される |
OID |
1.3.6.1.2.1.6 |
サブツリー名 |
tcp |
用途 |
TCPに関する情報が格納される |
OID |
1.3.6.1.2.1.7 |
サブツリー名 |
udp |
用途 |
UDPに関する情報が格納される |
OID |
1.3.6.1.2.1.8 |
サブツリー名 |
egp |
用途 |
EGP(Exteior Gateway Protocol)に関する情報が格納される |
OID |
1.3.6.1.2.1.9 |
サブツリー名 |
transmission |
用途 |
ネットワークの送受信をするモジュール(トランスミッタ)に関する情報が格納される。snmpdでは未サポート |
OID |
1.3.6.1.2.1.11 |
サブツリー名 |
snmp |
用途 |
SNMPに関する情報が格納される |
|
systemサブツリー(1.3.6.1.2.1.1)
systemサブツリーの配下には,システム情報を保持するオブジェクトが含まれる(
Table 2)。
Table 2 systemサブツリー(1.3.6.1.2.1.1)
OID |
1.3.6.1.2.1.1.1 |
サブツリー名 |
sysDescr |
用途 |
機器に関する説明文字。uname -aコマンドの実行結果が格納される |
OID |
1.3.6.1.2.1.1.2 |
サブツリー名 |
sysObjectID |
用途 |
機器の開発会社固有のOID |
OID |
1.3.6.1.2.1.1.3 |
サブツリー名 |
sysUpTime |
用途 |
SNMPエージェントが起動してからの時間が100分の1秒単位で格納される |
OID |
1.3.6.1.2.1.1.4 |
サブツリー名 |
sysContact |
用途 |
機器の管理者のメールアドレス。snmpd.confファイルのsyscontact行での設定値 |
OID |
1.3.6.1.2.1.1.5 |
サブツリー名 |
sysName |
用途 |
機器のFQDN(完全修飾ドメイン名) |
OID |
1.3.6.1.2.1.1.6 |
サブツリー名 |
sysLocation |
用途 |
機器の場所。snmpd.confファイルのsyslocation行での設定値 |
OID |
1.3.6.1.2.1.1.7 |
サブツリー名 |
sysServices |
用途 |
機器がサポートする設定フラグ。デフォルトでは存在しない。snmpd.confファイルのsysservices行で設定できる。snmpdの場合のsysServicesの推奨値は72。詳細はRFC1213を参照 |
|
○snmpgetコマンドを使って情報を取得する
それでは,Table 2に示したsystemサブツリーの各情報を取得してみよう。ucd-snmpには,特定のOIDが割り当てられたオブジェクトの値を取得するためのsnmpgetというコマンドが用意されている。snmpgetコマンドは,次の書式で使う。
書式を見るとわかるように,使い方は先に説明したsnmpwalkコマンドと同じだ。OIDにはオブジェクトに割り当てられたOIDを指定する。ただし,snmpwalkコマンドと同様,OIDの先頭には“.”を付ける。
しかしここで指定するOIDは,Table 2に示した値をそのまま利用するのではない。というのは,Table 2に指定したものは,階層ツリーのOIDであって,オブジェクトそのもののOIDではないのだ。
SNMPでは,1つの項目に複数の値が設定されることがある。たとえばネットワークの受信バイト数を保持するということを考えてみる。ネットワーク機器に1つのネットワークインタフェース(ネットワークカード)しか装着されていなければ,その情報の保存場所は1つでよい。つまり1つのオブジェクトで足りる。しかし複数のネットワークインタフェースをもつ場合には,そのネットワークインタフェースの数だけ保存場所――すなわちオブジェクト――が必要になる。
そこでSNMPでは,OIDの後ろにピリオドで区切って,そのインデックス番号を指定する決まりになっている。つまり,1枚目のネットワークカードであれば“.1”,2枚目のネットワークカードであれば“.2”といった数値を付けてオブジェクトそのものを差すのだ。
このような決まりは,値が1つしか格納されないオブジェクトに関しても例外ではない。値が1つしか格納されないオブジェクトの場合には,後ろに“.0”を付けてオブジェクト自身を示すことになっている。
Table 2に示したsystemサブツリー内に含まれるオブジェクトは,すべて値を1つしか含まない(つまりインデックスをもたない)。よって,たとえばsysDescrオブジェクトの値を取得したいのであれば,“1.3.6.1.2.1.1.1”に“.0”を加えた“1.3.6.1.2.1.1.1.0”というOIDを,sysObjectIDオブジェクトの値を取得したいのであれば同様に“1.3.6.1.2.1.1.2.0”というOIDをそれぞれ指定することになる。
では,実際にsnmpgetコマンドを使って,情報を取得してみよう。ここでは,sysDescrオブジェクトの値を取得してみる。その場合,次のようにsnmpgetコマンドを実行すればよい。
$ snmpget localhost private .1.3.6.1.2.1.1.1.0
system.sysDescr.0 = Linux tiger.example.co.jp 2.2.14-5.0 #1 Tue Mar 7 21:07:39 EST 2000 i686 |
実行結果を見るとわかるように,確かに,sysDescrオブジェクトにはOSの情報が格納されていることがわかる。
同様にして別のOIDを指定すれば,Table 2に示した各オブジェクトの値を取得することもできる。各自試していただきたい
interfacesサブツリー(1.3.6.1.2.1.2)
インタフェースの情報を保持するサブツリーだ。このサブツリーには,Table 3に示す各サブツリーが含まれる。
Table 3 interfacesサブツリー(1.3.6.1.2.1.2)
OID |
1.3.6.1.2.1.2.1 |
サブツリー名 |
ifNumber |
用途 |
ネットワークインタフェースの数。ループバック(lo:127.0.0.1)も含まれるので,1枚のネットワークカードを装着している場合,値は2となる |
OID |
1.3.6.1.2.1.2.2 |
サブツリー名 |
ifTable |
用途 |
配下にifEntryサブツリーを含むための階層ツリー。値はない |
OID |
1.3.6.1.2.1.2.2.1 |
サブツリー名 |
ifEntry |
用途 |
配下に各インタフェースの情報(下に示すifIndex,ifDescrなど)を含むための階層ツリー。値はない |
OID |
1.3.6.1.2.1.2.2.1.1.x |
サブツリー名 |
ifIndex |
用途 |
各インタフェースに割り当てられる固有の値。インデックス番号。1~ifNumberまでのいずれかの値。xと同じ値である |
OID |
1.3.6.1.2.1.2.2.1.2.x |
サブツリー名 |
ifDescr |
用途 |
各インタフェースの説明文。“eth0”,“lo”など |
OID |
1.3.6.1.2.1.2.2.1.3.x |
サブツリー名 |
ifType |
用途 |
各インタフェースの種類。Ethernetの場合には6,ループバックの場合は24,PPPの場合は23など。すべての値についてはRFC1213を参照 |
OID |
1.3.6.1.2.1.2.2.1.4.x |
サブツリー名 |
ifMtu |
用途 |
各インタフェースのMTUの値 |
OID |
1.3.6.1.2.1.2.2.1.5.x |
サブツリー名 |
ifSpeed |
用途 |
各インタフェースがサポートする帯域速度(bps) |
OID |
1.3.6.1.2.1.2.2.1.6.x |
サブツリー名 |
ifPhysAddress |
用途 |
各インタフェースの物理アドレス。たとえばインタフェースカードのMACアドレスなど |
OID |
1.3.6.1.2.1.2.2.1.7.x |
サブツリー名 |
ifAdminStatus |
用途 |
各インタフェースの設定情報。アップリンク(1),ダウンリンク(2),テスト中(3)のいずれかの値 |
OID |
1.3.6.1.2.1.2.2.1.8.x |
サブツリー名 |
ifOperStatus |
用途 |
各インタフェースの現在の情報。アップリンク(1),ダウンリンク(2),テスト中(3)のいずれか |
OID |
1.3.6.1.2.1.2.2.1.9.x |
サブツリー名 |
ifLastChange |
用途 |
各インタフェースがifOperStatusで示された状態に入ったときのsysUpTimeオブジェクト(systemサブツリー以下にある)の値 |
OID |
1.3.6.1.2.1.2.2.1.10.x |
サブツリー名 |
ifInOctets |
用途 |
各インタフェースが受信した総バイト数 |
OID |
1.3.6.1.2.1.2.2.1.11.x |
サブツリー名 |
ifInUcastPkts |
用途 |
各インタフェースが受信したユニキャストパケットのパケット総数 |
OID |
1.3.6.1.2.1.2.2.1.12.x |
サブツリー名 |
ifInNUcastPkts |
用途 |
各インタフェースが受信したユニキャストではないパケット(ブロードキャストパケットなど複数のホストに同時に転送するパケット)のパケット総数 |
OID |
1.3.6.1.2.1.2.2.1.13.x |
サブツリー名 |
ifInDiscards |
用途 |
各インタフェースが受信時に破棄したパケットの総数(エラーパケットは除く) |
OID |
1.3.6.1.2.1.2.2.1.14.x |
サブツリー名 |
ifInErrors |
用途 |
各インタフェースが受信したエラーパケットの総数 |
OID |
1.3.6.1.2.1.2.2.1.15.x |
サブツリー名 |
ifInUnknownProtos |
用途 |
各インタフェースが受信したパケットのうちプロトコル不明で破棄したパケットの総数 |
OID |
1.3.6.1.2.1.2.2.1.16.x |
サブツリー名 |
ifOutOctets |
用途 |
各インタフェースが送信した総バイト数 |
OID |
1.3.6.1.2.1.2.2.1.17.x |
サブツリー名 |
ifOutUcastPkts |
用途 |
各インタフェースが送信したユニキャストパケットのパケット総数 |
OID |
1.3.6.1.2.1.2.2.1.18.x |
サブツリー名 |
ifOutNUcastPkts |
用途 |
各インタフェースが送信したユニキャストではないパケット(ブロードキャストパケットなど)のパケット総数 |
OID |
1.3.6.1.2.1.2.2.1.19.x |
サブツリー名 |
ifOutDiscards |
用途 |
各インタフェースが送信時に破棄したパケットの総数(エラーパケットは除く) |
OID |
1.3.6.1.2.1.2.2.1.20.x |
サブツリー名 |
ifOutErrors |
用途 |
各インタフェースが送信したエラーパケットの総数 |
OID |
1.3.6.1.2.1.2.2.1.21.x |
サブツリー名 |
ifOutQLen |
用途 |
各インタフェースの出力バッファに溜まっている出力待ちパケットの数 |
OID |
1.3.6.1.2.1.2.2.1.22.x |
サブツリー名 |
ifSpecific |
用途 |
各インタフェースの追加情報を保存しているオブジェクトのOID。追加情報がない場合,“0.0”が設定される |
|
※xはインタフェースのインデックス番号。最初のインタフェースから順に,1,2,…となる。
interfacesサブツリーの配下には,ネットワークの情報を保持するオブジェクトが含まれるので,SNMPを使ってネットワークの帯域情報を調べる場合には,頻繁に利用される。
interfacesサブツリーは,オブジェクトが配列のような階層構造になっていて,少々わかりにくい。そこで少し具体例を挙げて説明する。
まず装着されているインタフェースの総数は,ifNumberオブジェクト(1.3.6.1.2.1.2.1)に格納されている。この値は,snmpgetコマンドを次のように使えば取得できる。
$ snmpget localhost private .1.3.6.1.2.1.2.1.0
interfaces.ifNumber.0 = 2 |
取得できるインタフェースの数には,ループバックインタフェース(lo)も含まれるので,実際に装着しているインタフェースの数よりも1つ多い数になる。もちろんPPPやSLIPをインストールしていれば,それも数として数えられる。
各インタフェースの情報は,“1.3.6.1.2.1.2.2.1.情報番号.インタフェース番号”となる(Table 3を参照)。たとえば,1番目のインタフェースの送信バイト数(情報番号16:“1.3.6.1.2.1.2.1.16.インタフェース番号”)を得るには,次のようにする。
$ snmpget localhost private .1.3.6.1.2.1.2.2.1.16.1
interfaces.ifTable.ifEntry.ifOutOctets.1 = Counter32: 1446493 |
もちろん表示される値(送信バイト数)は,そのインタフェースが実際に送信したバイト数だから,上に表記した値になるとは限らない。上の結果は,1番目のインタフェースが,1446493バイトを送信したという統計情報を表示しただけに過ぎない。
同様にして,2番目のインタフェースの送信バイト数を取得したいのであれば,次のようにすればよい。
$ snmpget localhost private .1.3.6.1.2.1.2.2.1.16.2
interfaces.ifTable.ifEntry.ifOutOctets.2 = Counter32: 235041 |
このように,interfacesサブツリーは,最後にインタフェース番号を“.”で区切って付けることにより,それぞれのインタフェースに関する情報を取得することができるようになっている。
しかしこのような配列のように構成されている情報を1つ1つ取得してゆくのは面倒なので,snmpgetコマンドを使うよりも,snmpwalkコマンドを使ってinterfacesサブツリー以下の一覧をすべて取得してしまったほうが簡単だろう。それには,snmpwatlkコマンドで,interfacesサブツリーのOIDである“1.3.6.1.2.1.2”を指定すればよい(List 1)。
ipサブツリー(1.3.6.1.2.1.4)
ipサブツリーは,IP情報を保持する階層ツリーだ。interfacesサブツリー(1.3.6.1.2.1.3)と同じく,ネットワークを流れるパケット数のほか,各インタフェースに割り当てられたIPアドレスや物理アドレス,そして,ルーティング情報なども保存されている。ipサブツリーはTable 4に示すように,多大なオブジェクトを含む。
Table 4 ipサブツリー(1.3.6.1.2.1.4)
OID |
1.3.6.1.2.1.4.1 |
サブツリー名 |
ipForwarding |
用途 |
ゲートウェイとして動作し,パケット中継がされているかどうかのフラグ。1で中継していることを,0で中継していないことを示す。たとえば2枚のネットワークカードを装着し,ゲートウェイとして動作させている場合には,1となる |
OID |
1.3.6.1.2.1.4.2 |
サブツリー名 |
ipDefaultTTL |
用途 |
IPパケットのTTL(生存時間)に設定されるデフォルト値 |
OID |
1.3.6.1.2.1.4.3 |
サブツリー名 |
ipInReceives |
用途 |
全インタフェースを通じて取得したパケットの総数(エラーパケットも含む) |
OID |
1.3.6.1.2.1.4.4 |
サブツリー名 |
ipInHdrErrors |
用途 |
全インタフェースを通じて取得したパケットのうち,ヘッダにエラーがあったために破棄したパケット数 |
OID |
1.3.6.1.2.1.4.5 |
サブツリー名 |
ipInAddrErrors |
用途 |
全インタフェースを通じて取得したパケットのうち,宛先のIPアドレスが無効であったために破棄したパケット数 |
OID |
1.3.6.1.2.1.4.6 |
サブツリー名 |
ipForwDatagrams |
用途 |
(ゲートウェイとして動作しているときに)中継したパケットの総数 |
OID |
1.3.6.1.2.1.4.7 |
サブツリー名 |
ipInUnknownProtos |
用途 |
全インタフェースを通じて取得したパケットのうち,プロトコルが不明であったため破棄したパケット数 |
OID |
1.3.6.1.2.1.4.8 |
サブツリー名 |
ipInDiscards |
用途 |
パケットを受信したものの,受信バッファ不足などで破棄してしまったパケット数 |
OID |
1.3.6.1.2.1.4.9 |
サブツリー名 |
ipInDelivers |
用途 |
正常に受け取ったIPパケット(ICMP含む)の総数 |
OID |
1.3.6.1.2.1.4.10 |
サブツリー名 |
ipOutRequests |
用途 |
送信を試みたIPパケット(ICMP)の総数(中継パケットは含まない) |
OID |
1.3.6.1.2.1.4.11 |
サブツリー名 |
ipOutDiscards |
用途 |
送信バッファ不足などで送信できなかったパケットの総数 |
OID |
1.3.6.1.2.1.4.12 |
サブツリー名 |
ipOutNoRoutes |
用途 |
送信先への経路(ルーティング情報)が不明であるため送信できなかったパケットの総数 |
OID |
1.3.6.1.2.1.4.13 |
サブツリー名 |
ipReasmTimeout |
用途 |
フラグメントされたパケットを再構築するためにバッファに保持しておく最大秒数 |
OID |
1.3.6.1.2.1.4.14 |
サブツリー名 |
ipReasmReqds |
用途 |
フラグメントの再構築が必要とされたパケット数 |
OID |
1.3.6.1.2.1.4.15 |
サブツリー名 |
ipReasmOKs |
用途 |
フラグメントが正しく再構築できたパケット数 |
OID |
1.3.6.1.2.1.4.16 |
サブツリー名 |
ipReasmFails |
用途 |
フラグメントが正しく再構築できなかったパケット数 |
OID |
1.3.6.1.2.1.4.17 |
サブツリー名 |
ipFragOKs |
用途 |
正しくフラグメントされたパケット数 |
OID |
1.3.6.1.2.1.4.18 |
サブツリー名 |
ipFragFails |
用途 |
正しくフラグメントできなかったパケット数 |
OID |
1.3.6.1.2.1.4.19 |
サブツリー名 |
ipFragCreates |
用途 |
作成されたフラグメントパケット数 |
OID |
1.3.6.1.2.1.4.20 |
サブツリー名 |
ipAddrTable |
用途 |
IPアドレス情報を含む階層ツリー。下位にipAddrEntryサブツリーを含む。値はない。機器に設定されているIPアドレスの数だけ配列状に構成される |
OID |
1.3.6.1.2.1.4.20.1 |
サブツリー名 |
ipAddrEntry |
用途 |
下位にIPアドレス情報を含むための階層ツリー。値はない |
OID |
1.3.6.1.2.1.4.20.1.aaa.bbb.ccc.ddd |
サブツリー名 |
ipAdEntAddr |
用途 |
それぞれのIPアドレス。値はaaa.bbb.ccc.ddd。これが配列のインデックス値になる |
OID |
1.3.6.1.2.1.4.20.2.aaa.bbb.ccc.ddd |
サブツリー名 |
ipAdEntIfIndex |
用途 |
このIPアドレスに割り当てられているインタフェースのインデックス番号。interfacesサブツリー下にあるifIndexの値と同じ |
OID |
1.3.6.1.2.1.4.20.3.aaa.bbb.ccc.ddd |
サブツリー名 |
ipAdEntNetMask |
用途 |
このIPアドレスに設定されたサブネットマスク値 |
OID |
1.3.6.1.2.1.4.20.4.aaa.bbb.ccc.ddd |
サブツリー名 |
ipAdEntBcastAddr |
用途 |
このIPアドレスに設定されたブロードキャストアドレスの値 |
OID |
1.3.6.1.2.1.4.20.5.aaa.bbb.ccc.ddd |
サブツリー名 |
ipAdEntReasmMaxSize |
用途 |
このIPアドレスを通じて送受信できるIPデータグラムの最大バイト数(フラグメントが必要とされる限界バイト数) |
OID |
1.3.6.1.2.1.4.21 |
サブツリー名 |
ipRouteTable |
用途 |
IPルーティング情報を含む階層ツリー。下位にipRouteTableサブツリーを含む。値はない。機器に設定されているルーティング情報の数だけ配列状に構成される |
OID |
1.3.6.1.2.1.4.21.1 |
サブツリー名 |
ipRouteEntry |
用途 |
下位にルーティング情報を含むための階層ツリー。値はない |
OID |
1.3.6.1.2.1.4.21.1.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteDest |
用途 |
ルーティング情報の到達先のIPアドレス。値はaaa.bbb.ccc.ddd。デフォルトゲートウェイの場合,0.0.0.0。これが配列のインデックス値になる |
OID |
1.3.6.1.2.1.4.21.2.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteIfIndex |
用途 |
このルーティング情報に関連するインタフェースのインデックス番号。interfacesサブツリー下にあるifIndexの値と同じ |
OID |
1.3.6.1.2.1.4.21.3.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteMetric1 |
用途 |
このルーティング情報のメトリック値(優先順位) |
OID |
1.3.6.1.2.1.4.21.4.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteMetric2 |
用途 |
このルーティング情報の代替メトリック値その1 |
OID |
1.3.6.1.2.1.4.21.5.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteMetric3 |
用途 |
このルーティング情報の代替メトリック値その2 |
OID |
1.3.6.1.2.1.4.21.6.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteMetric4 |
用途 |
このルーティング情報の代替メトリック値その3 |
OID |
1.3.6.1.2.1.4.21.7.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteNextHop |
用途 |
このルーティング情報の次の到達先となるIPアドレス。いい換えればゲートウェイのIPアドレス |
OID |
1.3.6.1.2.1.4.21.8.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteType |
用途 |
このルーティング情報のルーティングタイプ。1(その他)2(ルートなし),3(直接),4(非直接。ゲートウェイを経由する場合など)のいずれかの値 |
OID |
1.3.6.1.2.1.4.21.9.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteProto |
用途 |
このルーティング情報のルーティングプロトコル。1(その他),2(ローカル,静的なルーティング),5(EGP),6(GGP),8(RIP)など。取りうるすべての値についてはRFC1213を参照のこと |
OID |
1.3.6.1.2.1.4.21.10.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteAge |
用途 |
このルーティング情報が有効になってから経過した秒数 |
OID |
1.3.6.1.2.1.4.21.11.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteMask |
用途 |
このルーティング情報のサブネットマスク値。デフォルトゲートウェイの場合,0.0.0.0 |
OID |
1.3.6.1.2.1.4.21.12.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteMetric5 |
用途 |
このルーティング情報の代替メトリック値その4 |
OID |
1.3.6.1.2.1.4.21.13.aaa.bbb.ccc.ddd |
サブツリー名 |
ipRouteInfo |
用途 |
このルーティング情報の追加情報を示すオブジェクトのOID。追加情報がない場合には0.0 |
OID |
1.3.6.1.2.1.4.22 |
サブツリー名 |
ipNetToMediaTable |
用途 |
IPアドレスから物理アドレスに変換するためのマッピングテーブルを含む階層ツリー。下位にipNetToMediaEntry階層ツリーを含む。値はない |
OID |
1.3.6.1.2.1.4.22.1 |
サブツリー名 |
ipNetToMediaEntry |
用途 |
下位にIPアドレスから物理アドレスに変換するための情報を含むための階層ツリー。値はない |
OID |
1.3.6.1.2.1.4.22.1.1.x.aaa.bbb.ccc.ddd |
サブツリー名 |
ipNetToMediaIfIndex |
用途 |
この変換テーブルに関連するインタフェースのインデックス番号。interfacesサブツリー下にあるifIndexの値と同じ。xの値とも同じ |
OID |
1.3.6.1.2.1.4.22.1.2.x.aaa.bbb.ccc.ddd |
サブツリー名 |
ipNetToMediaPhysAddress |
用途 |
このIPアドレスに関連付けられる物理アドレス(MACアドレスなど) |
OID |
1.3.6.1.2.1.4.22.1.3.x.aaa.bbb.ccc.ddd |
サブツリー名 |
ipNetToMediaNetAddress |
用途 |
このIPアドレス自身。aaa.bbb.ccc.dddと同じ |
OID |
1.3.6.1.2.1.4.22.1.4.x.aaa.bbb.ccc.ddd |
サブツリー名 |
ipNetToMediaType |
用途 |
IPアドレスと物理アドレスとの対応設定方法。1(その他),2(無効),3(動的割り当て),4(静的割り当て)のいずれか |
OID |
1.3.6.1.2.1.4.23 |
サブツリー名 |
ipRoutingDiscards |
用途 |
(動的なルーティングプロトコルを使っている場合に)有効だったが破棄されてしまったルーティングテーブルの総数。 |
|
※xはインタフェースのインデックス番号。aaa.bbb.ccc.dddはIPアドレス
ipサブツリーはinterfacesサブツリーと同様に,いくつかの項目がインデックスの付いた階層構造になっている。階層構造をとっているのは,IPアドレス情報が格納されているipAddrTableサブツリー,ルーティング情報が格納されているipRouteTableサブツリー,IPアドレスと物理アドレスとの変換情報が格納されているipNetToMediaTypeサブツリーだ。
ここでは,ルーティング情報が格納されているipRouteTableサブツリーを見てみよう。ipRouteTableサブツリーには,1.3.6.1.2.1.4.21というOIDが割り当てられている。そこでsnmpwalkコマンドを使って,その一覧を取得してみる。
$ snmpwalk localhost private .1.3.6.1.2.1.4.21 ip.ipRouteTable.ipRouteEntry.ipRouteDest.0.0.0.0 = IpAddress: 0.0.0.0
ip.ipRouteTable.ipRouteEntry.ipRouteDest.127.0.0.0 = IpAddress: 127.0.0.0
ip.ipRouteTable.ipRouteEntry.ipRouteDest.192.168.0.0 = IpAddress: 192.168.0.0
ip.ipRouteTable.ipRouteEntry.ipRouteIfIndex.0.0.0.0 = 2
ip.ipRouteTable.ipRouteEntry.ipRouteIfIndex.127.0.0.0 = 2
ip.ipRouteTable.ipRouteEntry.ipRouteIfIndex.192.168.0.0 = 2
ip.ipRouteTable.ipRouteEntry.ipRouteMetric1.0.0.0.0 = 1
ip.ipRouteTable.ipRouteEntry.ipRouteMetric1.127.0.0.0 = 0
ip.ipRouteTable.ipRouteEntry.ipRouteMetric1.192.168.0.0 = 0
ip.ipRouteTable.ipRouteEntry.ipRouteNextHop.0.0.0.0 = IpAddress: 192.168.0.1
ip.ipRouteTable.ipRouteEntry.ipRouteNextHop.127.0.0.0 = IpAddress: 0.0.0.0
ip.ipRouteTable.ipRouteEntry.ipRouteNextHop.192.168.0.0 = IpAddress: 0.0.0.0
ip.ipRouteTable.ipRouteEntry.ipRouteType.0.0.0.0 = indirect(4)
ip.ipRouteTable.ipRouteEntry.ipRouteType.127.0.0.0 = direct(3)
ip.ipRouteTable.ipRouteEntry.ipRouteType.192.168.0.0 = direct(3)
ip.ipRouteTable.ipRouteEntry.ipRouteProto.0.0.0.0 = local(2)
ip.ipRouteTable.ipRouteEntry.ipRouteProto.127.0.0.0 = local(2)
ip.ipRouteTable.ipRouteEntry.ipRouteProto.192.168.0.0 = local(2)
ip.ipRouteTable.ipRouteEntry.ipRouteMask.0.0.0.0 = IpAddress: 0.0.0.0
ip.ipRouteTable.ipRouteEntry.ipRouteMask.127.0.0.0 = IpAddress: 255.0.0.0
ip.ipRouteTable.ipRouteEntry.ipRouteMask.192.168.0.0 = IpAddress: 255.255.255.0
ip.ipRouteTable.ipRouteEntry.ipRouteInfo.0.0.0.0 = OID: .ccitt.zeroDotZero.0
ip.ipRouteTable.ipRouteEntry.ipRouteInfo.127.0.0.0 = OID: .ccitt.zeroDotZero.0
ip.ipRouteTable.ipRouteEntry.ipRouteInfo.192.168.0.0 = OID: .ccitt.zeroDotZero. |
上は,ネットワークカードを1枚装着していて,そのネットワーク番号が192.168.0.0/24(192.168.0.0/255.255.255.255),デフォルトゲートウェイが192.168.0.1の環境でsnmpwalkコマンドを実行した結果だ。
この結果を見ると,“0.0.0.0”,“192.168.0.0”,“127.0.0.0”という3つの配列要素があることがわかる。これらはそれぞれデフォルトゲートウェイ,192.168.0.0/24のネットワーク,ループバックインタフェースに相当する。このように,ipサブツリーには,それぞれの値が,配列状に保存されている。
ここではsnmpwalkコマンドを使って,ipサブツリーの下にあるipRouteTableサブツリーを参照したが,もちろん,snmpgetコマンドを使って特定のOIDを指定すれば,その特定のオブジェクトに保存されている値を取得することもできる。
たとえば,デフォルトゲートウェイとなっているIPアドレスを取得したいとしよう。各ルーティング情報のゲートウェイ情報は,“1.3.6.1.2.1.4.21.1.7.aaa.bbb.ccc.ddd”というOIDをもつオブジェクトに格納されている。aaa.bbb.ccc.dddは,ルーティング情報の到着先となるIPアドレスで,デフォルトゲートウェイの場合には,“0.0.0.0”だ。よって,次のようにsnmpgetコマンドを実行すればよい。
$ snmpget localhost private .1.3.6.1.2.1.4.21.1.7.0.0.0.0
ip.ipRouteTable.ipRouteEntry.ipRouteNextHop.0.0.0.0 = IpAddress: 192.168.0.1 |
この結果を見ると,このホストのデフォルトゲートウェイは,192.168.0.1に設定されているということがわかる。
などといろいろ説明してきたが,小規模なシステムでは,静的なルーティングが設定されることが多く,あまりルーティング情報を監視したい場面はないだろう。
それよりネットワーク監視として重要なのは,ipInHdrErrors(1.3.6.1.2.1.4.4)やipInAddrErrors(1.3.6.1.2.1.4.5)といった壊れたり宛先不明となっているパケット数だ。あまりにこれらの数が多いようだと,ネットワークがハードウェア的に不安定であったり,第三者があえて壊れたIPパケットを送信して攻撃を仕掛けているといった状況が考えられるからだ。
icmpサブツリー(1.3.6.1.2.1.5)
icmpサブツリーには,ICMPの情報が含まれる(Table 5)。icmpサブツリーのうち,ネットワーク監視という面から見て,あまり有用なものはない。
とはいえ,あまりにもICMPメッセージの到着数が多い場合,何者かによってDoS攻撃やDDoS攻撃(分散DOS攻撃)を仕掛けられている可能性がある。よって,インターネットに接続されているサーバーを監視するのであれば,ICMPメッセージの数を定期的に記録しておき,いつもよりも格段と多いICMPメッセージが届いていないかを監視するとよい。
icmpサブツリーは,配列状に階層化されているわけではなく単なるオブジェクトになっている。よって,すべての値は,各OIDの後ろに“.0”を指定したものをsnmpgetコマンドで指定すれば取得できる。たとえば,受信したICMPメッセージの総数を取得するには,icmpInMsgsオブジェクト(1.3.6.1.2.1.5.1)の値を取得すればよく,次のようにすればよい。
$ snmpget localhost private .1.3.6.1.2.1.5.1.0
icmp.icmpInMsgs.0 = Counter32: 11 |
Table 5 icmpサブツリー(1.3.6.1.2.1.5)
OID |
1.3.6.1.2.1.5.1 |
サブツリー名 |
icmpInMsgs |
用途 |
受信したICMPメッセージの総数 |
OID |
1.3.6.1.2.1.5.2 |
サブツリー名 |
icmpInErrors |
用途 |
受信したICMPメッセージのうちエラーがあったメッセージの総数 |
OID |
1.3.6.1.2.1.5.3 |
サブツリー名 |
icmpInDestUnreachs |
用途 |
受信した「Destination Unreachable」メッセージの総数 |
OID |
1.3.6.1.2.1.5.4 |
サブツリー名 |
icmpInTimeExcds |
用途 |
受信した「Time Exceeded」メッセージの総数 |
OID |
1.3.6.1.2.1.5.5 |
サブツリー名 |
icmpInParmProbs |
用途 |
受信した「Parameter Problem」メッセージの総数 |
OID |
1.3.6.1.2.1.5.6 |
サブツリー名 |
icmpInSrcQuenchs |
用途 |
受信した「Source Quench」メッセージの総数 |
OID |
1.3.6.1.2.1.5.7 |
サブツリー名 |
icmpInRedirects |
用途 |
受信した「Redirect」メッセージの総数 |
OID |
1.3.6.1.2.1.5.8 |
サブツリー名 |
icmpInEchos |
用途 |
受信した「Echo」メッセージの総数 |
OID |
1.3.6.1.2.1.5.9 |
サブツリー名 |
icmpInEchoReps |
用途 |
受信した「Echo Reply」メッセージの総数 |
OID |
1.3.6.1.2.1.5.10 |
サブツリー名 |
icmpInTimestamps |
用途 |
受信した「Timestamp」メッセージの総数 |
OID |
1.3.6.1.2.1.5.11 |
サブツリー名 |
icmpInTimestampReps |
用途 |
受信した「Timestamp Reply」メッセージの総数 |
OID |
1.3.6.1.2.1.6.12 |
サブツリー名 |
icmpInAddrMasks |
用途 |
受信した「Address Mask Request」メッセージの総数 |
OID |
1.3.6.1.2.1.6.13 |
サブツリー名 |
icmpInAddrMaskReps |
用途 |
受信した「Address Mask Reply」メッセージの総数 |
OID |
1.3.6.1.2.1.6.14 |
サブツリー名 |
icmpOutMsgs |
用途 |
送信したICMPメッセージの総数 |
OID |
1.3.6.1.2.1.6.15 |
サブツリー名 |
icmpOutErrors |
用途 |
送信したICMPメッセージのうちエラーがあったメッセージの総数 |
OID |
1.3.6.1.2.1.6.16 |
サブツリー名 |
icmpOutDestUnreachs |
用途 |
送信した「Destination Unreachable」メッセージの総数 |
OID |
1.3.6.1.2.1.6.17 |
サブツリー名 |
icmpOutTimeExcds |
用途 |
送信した「Time Exceeded」メッセージの総数 |
OID |
1.3.6.1.2.1.6.18 |
サブツリー名 |
icmpOutParmProbs |
用途 |
送信した「Parameter Problem」メッセージの総数 |
OID |
1.3.6.1.2.1.6.19 |
サブツリー名 |
icmpOutSrcQuenchs |
用途 |
送信した「Source Quench」メッセージの総数 |
OID |
1.3.6.1.2.1.6.20 |
サブツリー名 |
icmpOutRedirects |
用途 |
送信した「Reditect」メッセージの総数 |
OID |
1.3.6.1.2.1.6.21 |
サブツリー名 |
icmpOutEchos |
用途 |
送信した「Echo」メッセージの総数 |
OID |
1.3.6.1.2.1.6.22 |
サブツリー名 |
icmpOutEchoReps |
用途 |
送信した「Echo Reply」メッセージの総数 |
OID |
1.3.6.1.2.1.6.23 |
サブツリー名 |
icmpOutTimestamps |
用途 |
送信した「Timestamp」メッセージの総数 |
OID |
1.3.6.1.2.1.6.24 |
サブツリー名 |
icmpOutTimestampReps |
用途 |
送信した「Timestamp Reply」メッセージの総数 |
OID |
1.3.6.1.2.1.6.25 |
サブツリー名 |
icmpOutAddrMasks |
用途 |
送信した「Address Mask Request」メッセージの総数 |
OID |
1.3.6.1.2.1.6.26 |
サブツリー名 |
icmpOutAddrMaskReps |
用途 |
送信した「Address Mask Reply」メッセージの総数 |
|
tcpサブツリー(1.3.6.1.2.1.6)
tcpサブツリーにはTCP接続に関する情報が格納されている(Table 6)。
Table 6 tcpサブツリー(1.3.6.1.2.1.6)
OID |
1.3.6.1.2.1.6.1 |
サブツリー名 |
tcpRtoAlgorithm |
用途 |
応答が確認できなかったとき,再送までのタイミングを決めるアリゴリズムの種類。詳細はRFC1213を参照 |
OID |
1.3.6.1.2.1.6.2 |
サブツリー名 |
tcpRtoMin |
用途 |
再送時に使うタイムアウト時間の最小値(ミリ秒) |
OID |
1.3.6.1.2.1.6.3 |
サブツリー名 |
tcpRtoMax |
用途 |
再送時に使うタイムアウト時間の最大値(ミリ秒) |
OID |
1.3.6.1.2.1.6.4 |
サブツリー名 |
tcpMaxConn |
用途 |
サポートする最大TCPコネクション数 |
OID |
1.3.6.1.2.1.6.5 |
サブツリー名 |
tcpActiveOpens |
用途 |
アクティブオープン(CLOSE状態からSYN-SENT状態になった。つまりこちら側から別のホストにコネクションを張った)TCPコネクションの総計 |
OID |
1.3.6.1.2.1.6.6 |
サブツリー名 |
tcpPassiveOpens |
用途 |
パッシブオープン(LISTEN状態からSYN-REVD状態になった。つまりこちらが待ち受け状態になっていてほかのホストが接続してきた)TCPコネクションの総計 |
OID |
1.3.6.1.2.1.6.7 |
サブツリー名 |
tcpAttemptFails |
用途 |
接続に失敗した総数 |
OID |
1.3.6.1.2.1.6.8 |
サブツリー名 |
tcpEstabResets |
用途 |
リセットされた総数 |
OID |
1.3.6.1.2.1.6.9 |
サブツリー名 |
tcpCurrEstab |
用途 |
現在の状態がESTABLISHED(接続中)またはCLOSE-WAIT(切断待ち)であるコネクションの総数 |
OID |
1.3.6.1.2.1.6.10 |
サブツリー名 |
tcpInSegs |
用途 |
受信したセグメントの総数 |
OID |
1.3.6.1.2.1.6.11 |
サブツリー名 |
tcpOutSegs |
用途 |
送信したセグメントの総数 |
OID |
1.3.6.1.2.1.6.12 |
サブツリー名 |
tcpRetransSegs |
用途 |
再送したセグメントの総数 |
OID |
1.3.6.1.2.1.6.13 |
サブツリー名 |
tcpConnTable |
用途 |
現在張られているTCPコネクションを保持する階層ツリー。下位にtcpConnEntryサブツリーを含む。値はない |
OID |
1.3.6.1.2.1.6.13.1 |
サブツリー名 |
tcpConnEntry |
用途 |
TCPコネクションの状態を保持する階層ツリー。値はない |
OID |
1.3.6.1.2.1.6.13.1.1.aaa.bbb.
ccc.ddd.ppp.AAA.BBB.CCC.DDD.PPP |
サブツリー名 |
tcpConnState |
用途 |
このコネクションの状態。取りうる値についてはRFC1213を参照 |
OID |
1.3.6.1.2.1.6.13.1.2.aaa.bbb.
ccc.ddd.ppp.AAA.BBB.CCC.DDD.PPP |
サブツリー名 |
tcpConnLocalAddress |
用途 |
このコネクションのローカル側のIPアドレス。aaa.bbb.ccc.dddと同じ |
OID |
1.3.6.1.2.1.6.13.1.3.aaa.bbb.
ccc.ddd.ppp.AAA.BBB.CCC.DDD.PPP |
サブツリー名 |
tcpConnLocalPort |
用途 |
このコネクションのローカル側のポート番号。pppと同じ |
OID |
1.3.6.1.2.1.6.13.1.4.aaa.bbb.
ccc.ddd.ppp.AAA.BBB.CCC.DDD.PPP |
サブツリー名 |
tcpConnRemAddress |
用途 |
このコネクションのリモート側のIPアドレス。AAA.BBB.CCC.DDDと同じ |
OID |
1.3.6.1.2.1.6.13.1.5.aaa.bbb.
ccc.ddd.ppp.AAA.BBB.CCC.DDD.PPP |
サブツリー名 |
tcpConnRemPort |
用途 |
このコネクションのリモート側のポート番号。PPPと同じ |
OID |
1.3.6.1.2.1.6.14 |
サブツリー名 |
tcpInErrs |
用途 |
受信したエラーセグメントの総数 |
OID |
1.3.6.1.2.1.6.15 |
サブツリー名 |
tcpOutRsts |
用途 |
送信したセグメントのうちRSTフラグを設定したもの(コネクションをリセットした)の総数 |
|
※aaa.bbb.ccc.dddはローカル側のIPアドレス。pppはローカル側のポート番号。AAA.BBB.CCC.DDDはリモート側のIPアドレス。PPPはリモート側のポート番号。
tcpサブツリーには,TCPでの送受信セグメント数だけでなく,現在のTCPコネクションの情報も含まれている。現在のTCPコネクションの情報が含まれているのは,tcpConnTableサブツリー(1.3.6.1.2.1.6.13)の配下だ。snmpwalkコマンドを使ってtcpConnTableサブツリーの配下の値を取り出してみるとわかるが,ここにはifconfigコマンドで取得できるような,TCPコネクションの状態が格納されている(List 2)。
List 2の実行結果では,次のコネクションが用意されていることを示している。
- ポート25で待ち受け(listen)
- ポート111で待ち受け(listen)
- ポート113で待ち受け(listen)
- ポート5680で待ち受け(listen)
- ポート6000で待ち受け(listen)
- 127.0.0.1のポート1169と127.0.0.1のポート5680とが接続中(established)
実際に稼働しているホストでは,この程度の情報では済まず,もっと多数のコネクション情報が表示される。
このようにtcpConnTableサブツリー(1.3.6.1.2.1.6.13)以下は,次のようなOIDのオブジェクトとして示される。
1.3.6.1.2.1.6.13.1.y.aaa.bbb.ccc.ddd.ppp.
AAA.BBB.CCC.DDD.PPP
y=情報の種別を示す番号
aaa.bbb.ccc.ddd=ローカル側のIPアドレス
ppp=ローカル側のポート番号
AAA.BBB.CCC.DDD=リモート側のIPアドレス
PPP=リモート側のポート番号 |
SNMPでは,あらかじめどのようなコネクションが張られているかを知るすべはないから,tcpConnTableサブツリーに対してsnmpgetコマンドを使い,直接オブジェクトのデータを取得することは無意味だ。そのためここで示したように,snmpwalkコマンドなどを使い,tcpConnTableサブツリーの配下に含まれるオブジェクトの一覧を取得することで,現在のコネクションの一覧を得るという方法がとられるのが一般的だ。snmpgetコマンドを使って,1つのオブジェクトの値を取得するという方法は,あまりとられない。
udpサブツリー(1.3.6.1.2.7)
udpサブツリーには,UDPの情報が格納される。構成はtcpサブツリーとよく似ている(Table 7)。ただしUDPは非接続型のプロトコルなので,リモートアドレスという概念はなく,どのポートで待ち受けをしているのかがわかるだけだ。参考までに,snmpwalkコマンドを使ってudpサブツリーを参照したものを以下に記す。
$ snmpwalk localhost private .1.3.6.1.2.1.7
udp.udpInDatagrams.0 = Counter32: 17515
udp.udpNoPorts.0 = Counter32: 5
udp.udpInErrors.0 = Counter32: 0
udp.udpOutDatagrams.0 = Counter32: 17520
udp.udpTable.udpEntry.udpLocalAddress.0.0.0.0.111 = IpAddress: 0.0.0.0
udp.udpTable.udpEntry.udpLocalAddress.0.0.0.0.161 = IpAddress: 0.0.0.0
udp.udpTable.udpEntry.udpLocalAddress.0.0.0.0.162 = IpAddress: 0.0.0.0
udp.udpTable.udpEntry.udpLocalAddress.0.0.0.0.960 = IpAddress: 0.0.0.0
udp.udpTable.udpEntry.udpLocalAddress.0.0.0.0.1024 = IpAddress: 0.0.0.0
udp.udpTable.udpEntry.udpLocalAddress.0.0.0.0.1041 = IpAddress: 0.0.0.0
udp.udpTable.udpEntry.udpLocalPort.0.0.0.0.111 = 111
udp.udpTable.udpEntry.udpLocalPort.0.0.0.0.161 = 161
udp.udpTable.udpEntry.udpLocalPort.0.0.0.0.162 = 162
udp.udpTable.udpEntry.udpLocalPort.0.0.0.0.960 = 960
udp.udpTable.udpEntry.udpLocalPort.0.0.0.0.1024 = 1024
udp.udpTable.udpEntry.udpLocalPort.0.0.0.0.1041 = 1041 |
Table 7 udpサブツリー(1.3.6.1.7.1)
OID |
1.3.6.1.6.1.7.1 |
サブツリー名 |
udpInDatagrams |
用途 |
受信したUDPデータグラムの総数 |
OID |
1.3.6.1.6.1.7.2 |
サブツリー名 |
udpNoPorts |
用途 |
受信したUDPデータグラムのうち,待ち受けていなかったために破棄したデータグラムの総数 |
OID |
1.3.6.1.6.1.7.3 |
サブツリー名 |
udpInErrors |
用途 |
受信したUDPデータグラムのうちエラーがあったもののの総数 |
OID |
1.3.6.1.6.1.7.4 |
サブツリー名 |
udpOutDatagrams |
用途 |
送信したUDPデータグラムの総数 |
OID |
1.3.6.1.6.1.7.5 |
サブツリー名 |
udpTable |
用途 |
UDPデータグラムの待ち受け情報を保持するテーブルを含む階層ツリー。値はない。下位にudpEntryサブツリーを含む |
OID |
1.3.7.1.6.1.7.5.1 |
サブツリー名 |
udpEntry |
用途 |
待ち受けているUDPデータグラムの一覧を含む階層ツリー。値はない |
OID |
1.3.7.1.6.1.7.5.1.aaa.bbb.
ccc.ddd.ppp |
サブツリー名 |
udpLocalAddress |
用途 |
このUDPデータグラムの待ち受けしているローカル側のIPアドレス。aaa.bbb.ccc.dddと同じ。すべてIPアドレスにおいて待ち受けているならば0.0.0.0 |
OID |
1.3.7.1.6.1.7.5.1.aaa.bbb.
ccc.ddd.ppp |
サブツリー名 |
udpLocalPort |
用途 |
このUDPデータグラムの待ち受けをしているローカル側のポート番号。pppと同じ |
|
※aaa.bbb.ccc.dddはローカル側のIPアドレス。pppはローカル側のポート番号
snmpサブツリー(1.3.6.1.6.1.11)
snmpサブツリーには,SNMPに関する情報を保持するオブジェクトが含まれる(Table 8)。snmpサブツリーの情報を使えば,SNMPマネージャを使って,SNMPエージェント自身の情報を調べることができる。具体的には,認証に失敗した回数やエラーが発生した数などが得られる。これらの情報を利用すると,第三者がSNMPを悪用していないかどうかを調べることができる。
snmpサブツリーの配下にあるオブジェクトは配列状にはなっていない単一のオブジェクトで構成される。よってTable 8に示したOIDの後ろに“.0”を指定すれば,その値を取得できる。たとえば,コミュニティ名が異なるSNMPメッセージが届いた総数――いい換えれば認証に失敗したメッセージ――を取得したいのであれば,snmpInBadCommunityNames(1.3.6.1.2.1.4.11.4)オブジェクトの値を調べればよく,snmpgetコマンドを使って,次のようにすればよい。
$ snmpget localhost private .1.3.6.1.2.1.11.4.0
snmp.snmpInBadCommunityNames.0 = Counter32: 0 |
Table 8 snmpサブツリー(1.3.6.1.6.1.11)
OID |
1.3.6.1.2.1.11.1 |
サブツリー名 |
snmpInPkts |
用途 |
受信したSNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.2 |
サブツリー名 |
snmpOutPkts |
用途 |
送信したSNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.3 |
サブツリー名 |
snmpInBadVersions |
用途 |
サポートしていないバージョンのSNMPメッセージが届いた総数 |
OID |
1.3.6.1.2.1.11.4 |
サブツリー名 |
snmpInBadCommunityNames |
用途 |
コミュニティ名が異なっていたSNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.5 |
サブツリー名 |
snmpInBadCommunityUses |
用途 |
権限がないのに操作しようとしたSNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.6 |
サブツリー名 |
snmpInASNParseErrs |
用途 |
OIDの形式が間違っていたSNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.7 |
サブツリー名 |
欠番 |
用途 |
― |
OID |
1.3.6.1.2.1.11.8 |
サブツリー名 |
snmpInTooBigs |
用途 |
「tooBig」エラーがあった受信SNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.9 |
サブツリー名 |
snmpInNoSuchNames |
用途 |
「noSuchName」エラーがあった受信SNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.10 |
サブツリー名 |
snmpInBadValues |
用途 |
「badValue」エラーがあったSNMP受信メッセージの総数 |
OID |
1.3.6.1.2.1.11.11 |
サブツリー名 |
snmpInReadOnlys |
用途 |
「readOnly」エラーがあったSNMP受信メッセージの総数 |
OID |
1.3.6.1.2.1.11.12 |
サブツリー名 |
snmpInGenErrs |
用途 |
「getErr」があった受信SNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.13 |
サブツリー名 |
snmpInTotalReqVars |
用途 |
値を取り出されたオブジェクトの総数 |
OID |
1.3.6.1.2.1.11.14 |
サブツリー名 |
snmpInTotalSetVars |
用途 |
値を変更されたオブジェクトの総数 |
OID |
1.3.6.1.2.1.11.15 |
サブツリー名 |
snmpInGetRequests |
用途 |
処理したGet-Requestの総数(snmpgetコマンドやsnmpwalkコマンドによるデータの取り出しなど) |
OID |
1.3.6.1.2.1.11.16 |
サブツリー名 |
snmpInGetNexts |
用途 |
処理したGet-Nextの総数(snmpwalkコマンドにより階層ツリーを辿ったときなど) |
OID |
1.3.6.1.2.1.11.17 |
サブツリー名 |
snmpInSetRequests |
用途 |
処理したSet-Requestの総数(snmpsetコマンドによるデータの設定など) |
OID |
1.3.6.1.2.1.11.18 |
サブツリー名 |
snmpInGetResponses |
用途 |
処理したGet-Responseの総数 |
OID |
1.3.6.1.2.1.11.19 |
サブツリー名 |
snmpInTraps |
用途 |
処理したTrapの総数 |
OID |
1.3.6.1.2.1.11.20 |
サブツリー名 |
snmpOutTooBigs |
用途 |
「tooBig」エラーがあった送信SNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.21 |
サブツリー名 |
snmpOutNoSuchNames |
用途 |
「noSuchName」エラーがあった送信SNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.22 |
サブツリー名 |
snmpOutBadValues |
用途 |
「badValue」エラーがあった送信SNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.23 |
サブツリー名 |
欠番 |
用途 |
― |
OID |
1.3.6.1.2.1.11.24 |
サブツリー名 |
snmpOutGetErrs |
用途 |
「getErr」があった送信SNMPメッセージの総数 |
OID |
1.3.6.1.2.1.11.25 |
サブツリー名 |
snmpOutGetRequests |
用途 |
送信したGet-Requestの総数 |
OID |
1.3.6.1.2.1.11.26 |
サブツリー名 |
snmpOutGetNexts |
用途 |
送信したGet-Nextの総数 |
OID |
1.3.6.1.2.1.11.27 |
サブツリー名 |
snmpOutSetRequests |
用途 |
送信したSet-Requestの総数 |
OID |
1.3.6.1.2.1.11.28 |
サブツリー名 |
snmpOutGetResponses |
用途 |
送信したGetResponseの総数 |
OID |
1.3.6.1.2.1.11.29 |
サブツリー名 |
snmpOutTraps |
用途 |
送信したTrapの総数 |
OID |
1.3.6.1.2.1.11.30 |
サブツリー名 |
snmpEnableAuthenTraps |
用途 |
認証失敗Trapが許されているかどうか。1のとき許されている,0のとき許されていないことを示す |
|
ucdavisサブツリー
以上で説明してきたmib-2サブツリーは,ネットワーク機器の汎用的な情報を保持する管理情報領域だ。mib-2サブツリーの配下にあるオブジェクトを参照すれば,ネットワークの回線断やトラフィック情報を得ることができるが,snmpdでは,さらに独自の管理情報領域をもっている。それがこれから説明するucdavisサブツリー(1.3.6.1.4.1.2021)だ。ucdavisサブツリーの配下には,Table 9に示すサブツリーが格納されている。
Table 9 ucdavisサブツリー(1.3.6.1.4.1.2021)
OID |
1.3.6.1.4.1.2021.2 |
サブツリー名 |
prTable |
用途 |
プロセスの状態が格納される |
OID |
1.3.6.1.4.1.2021.4 |
サブツリー名 |
memory |
用途 |
メモリの状態が格納される |
OID |
1.3.6.1.4.1.2021.8 |
サブツリー名 |
extTable |
用途 |
システム上であらかじめ指定しておいたコマンドを実行し,その結果が格納される |
OID |
1.3.6.1.4.1.2021.9 |
サブツリー名 |
dskTable |
用途 |
ディスクの状態が格納される |
OID |
1.3.6.1.4.1.2021.10 |
サブツリー名 |
laTable |
用途 |
システムのロードアベレージ情報が格納される |
OID |
1.3.6.1.4.1.2021.11 |
サブツリー名 |
systemStats |
用途 |
システムの状態が格納される |
OID |
1.3.6.1.4.1.2021.14 |
サブツリー名 |
ucdDemoMIB |
用途 |
ucd-snmpのサンプル |
OID |
1.3.6.1.4.1.2021.15 |
サブツリー名 |
fileTable |
用途 |
あらかじめ指定しておいたファイルのファイルサイズなどが格納される |
OID |
1.3.6.1.4.1.2021.100 |
サブツリー名 |
version |
用途 |
snmpdのバージョン情報が格納される |
OID |
1.3.6.1.4.1.2021.101 |
サブツリー名 |
snmperrs |
用途 |
エラーが発生したときの情報が格納される |
OID |
1.3.6.1.4.1.2021.102 |
サブツリー名 |
mrTable |
用途 |
snmpdにモジュールを組み込んで機能を追加したとき,そのモジュールに関する情報が格納される |
|
Table 9に示した各サブツリーには,Linux上で動作しているプロセスの情報やメモリ,ディスクの状態,そして特定のコマンドを実行したときの結果を格納することができる。
どのような情報が取得できるのかは,snmpd.confファイルの設定にも依存する。デフォルトの(EXAMPLE.confファイルをコピーして編集した)snmpd.confファイルの設定は,次のようになっている(一部のコメントなどは省き,必要箇所のみ抜粋した)。
procmountd
procntalkd 4
procsendmail 10 1
execechotest /bin/echo hello world
disk/ 10000
load12 14 14 |
以下,snmpd.confファイルの設定方法と,ucdavisサブツリーで得られる情報との関係を説明する。