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コマンドは,次の書式で用いる

snmpwalk ホスト名コミュニティ名OID

ホスト名には接続したい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コマンドは,次の書式で使う。

snmpget ホスト名コミュニティ名OID

 書式を見るとわかるように,使い方は先に説明した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サブツリーで得られる情報との関係を説明する。







パートナー



ニュースリリース | 会社概要 | プライバシーポリシー | リンク | ©2002-2008 Integrated Systems Co. Ltd. All Rights Reserved.