SNMPについて
SNMP(Simple Network Management Protocol)はネットワーク上の各種機器(ルータやサーバなど)の各種情報を取得できるプロトコルで、それ単体でも有用な情報ですが、視覚化できるMRTGのようなツールを使うと推移などが観察できます。
機器によってはデフォルトの状態で「標準MIB」に対応しており、そのままデータが取得できますが、メーカー提供のMIBが存在する場合は導入することで、「拡張MIB(プライベートMIB)」というもう少し踏み込んだ情報が取得できるようになります。
SNMP関連パッケージのインストール
net-snmpのインストール
パッケージ「net-snmp」には自分のサーバからSNMPの情報を返すsnmpdなどが含まれており、自分自身からデータを取るのにも使うため必要です。
yum search net-snmp
net-snmp.x86_64 : A collection of SNMP protocol tools and libraries
使っているパッケージ管理ツールでインストールします。
設定は省略しますが、コミュニティ名などを設定するだけなので簡単です。
yum install net-snmp
net-snmp-utilsのインストール
OIDを指定して現在の値を取得するsnmpwalkや、OIDと名前の変換をするsnmptranslateなどは「net-snmp-utils」パッケージに含まれています。
視覚化するツールでデータを取得するのには必須ではありませんが、実際に返ってくる値の確認などテストをするのに便利なので入れておきます。
yum search net-snmp-utils
net-snmp-utils.x86_64 : Network management utilities using SNMP, from the NET-SNMP project
インストールすればすぐコマンドが使えます。
yum install net-snmp-utils
プライベートMIB(拡張MIB)の導入
MIBリストのダウンロード
少し古いですが、マネージドL2スイッチの「HP J9279A ProCurve Switch」を例に導入してみます。
新品だと10万超えでしたが、中古で7000円ほどで購入できます。
「HP J9279A ProCurve Switch」の場合は以下からダウンロードします。
中身はテキストファイルで、上記の場合は拡張子が「.mib」ですが「.txt」の場合もあります。
必要なものだけダウンロードすれば良いですが、わからない場合は全部ダウンロードしておきます。
ディレクトリを作成してMIBリストをコピー
ダウンロードしたMIBリストは新しいディレクトリを作成し、そこへまとめて置いておきます。
今回は以下に保存しました。
/etc/snmp/HP-ProCurve-J9279A
拡張MIBを読み込むよう設定
以下のファイルを編集します(無ければ作成します)
/etc/snmp/snmp.conf
「MIBDIRS」で先程MIBを保存したディレクトリを指定します。
MIBDIRS /etc/snmp/HP-ProCurve-J9279A MIBS all
他の機器もある場合はコロン(:)で区切って列挙します。
以下の例は /etc/snmp/HP-ProCurve-J9279A と /etc/snmp/RTX1200 の2つを指定した例です。
MIBDIRS /etc/snmp/HP-ProCurve-J9279A:/etc/snmp/RTX1200 MIBS all
こんな感じで増やせます。
MIBDIRS /etc/snmp/HP-ProCurve-J9279A:/etc/snmp/RTX1200:/etc/snmp/AlliedTelesis-GS924MV2 MIBS all
OIDと名前の相互変換
MIBリストにはMIBの「名前」が記載されていますが、MRTGなどのツールではOID(オブジェクトID)で指定するので変換が必要です。
ダウンロードしたMIBリストから目的の「名前」を探しますが、複数のファイルに分かれているのでGrepツールなどで検索すると良いと思います。
例えば「mem」で検索すると、「HP J9279A ProCurve Switch」の場合は以下のような行がヒットします。
hpLocalMemAllocBytes INTEGER
この行のうち以下の「hpLocalMemAllocBytes」がMIBの名前なので、これをOIDに変換してみます。
hpLocalMemAllocBytes
名前からOIDへ変換
名前からOIDへの変換は「snmptranslate」コマンドを使います。
書式は以下のとおりです。
snmptranslate -m all -TB -Td -On -Ln [名前]
例の「hpLocalMemAllocBytes」を変換する場合は以下のようにします。
snmptranslate -m all -TB -Td -On -Ln hpLocalMemAllocBytes
実行結果は以下のとおりです。
変換されたOID「.1.3.6.1.4.1.11.2.14.11.5.1.1.2.1.1.1.7」が返ってきました。
[root@sakue ~]# snmptranslate -m all -TB -Td -On -Ln hpLocalMemAllocBytes .1.3.6.1.4.1.11.2.14.11.5.1.1.2.1.1.1.7 hpLocalMemAllocBytes OBJECT-TYPE -- FROM NETSWITCH-MIB SYNTAX INTEGER MAX-ACCESS read-only STATUS mandatory DESCRIPTION "The number of currently allocated bytes." ::= { iso(1) org(3) dod(6) internet(1) private(4) enterprises(1) hp(11) nm(2) icf(14) hpicfObjects(11) hpicfSwitch(5) hpSwitch(1) hpOpSystem(1) hpMem(2) hpLocalMem(1) hpLocalMemTable(1) hpLocalMemEntry(1) 7 }
OIDから名前へ変換
OIDから名前への変換は「snmptranslate」コマンドにOIDを渡すだけです。
snmptranslate [OID]
先程変換したOIDを戻す場合は以下のように実行します。
snmptranslate .1.3.6.1.4.1.11.2.14.11.5.1.1.2.1.1.1.7
実行結果は以下のとおりです。
指定OIDに対応する名前の「hpSwitchFddiSystemMemoryFree」が返ってきました。
[root@sakue ~]# snmptranslate .1.3.6.1.4.1.11.2.14.11.5.1.1.2.1.1.1.7 NETSWITCH-MIB::hpLocalMemAllocBytes
対象機器にデータを取得できるよう設定する
SNMPで取得できるデータには見られては困るようなものも含まれる場合があるため、デフォルトでは値が取得できないようになっている場合がほとんどなので許可設定をします。
例えば「HP J9279A ProCurve Switch」の場合は以下のようにコミュニティ名まで確認できます。
SNMP-COMMUNITY-MIB::snmpCommunityName.'1' = STRING: "sakue"
HP J9279A ProCurve Switchの設定例
詳細は省略しますが、「HP J9279A ProCurve Switch」の場合はコンソールから以下のように設定します。
snmpを有効にする
snmpv3 enable
読み取り専用にするか聞かれるので「n」
Would you like to restrict SNMPv1 and SNMPv2c messages to have read only access (you can set this later by the command 'snmp restrict-access'):
「コミュニティ」を「sakue」にし、制限はかけない
snmp-server community sakue Unrestricted
レシーバーの設定
snmp-server host "sakue" 192.168.2.2 snmp-server host "sakue" 192.168.2.200
認証トラップを有効にする
snmp-server enable traps authentication
設定内容の確認
show snmp-server
設定を保存する
write memory
機器の設定方法が不明な場合
対象機器がSNMPに対応しているのに設定項目が見当たらない場合は、同じネットワーク内からはOKかもしれませんので、次項のsnmpwalkで試しに取得してみると良いです。
設定が見当たらない場合、「読み出し権限のみ」を持つコミュニティーとして「public」が、「書き込み権限」を持つコミュニティーとして「private」がデフォルトで設定されている場合が多いので、コミュニティ名に「public」か「private」を指定して次項のsnmpwalk を実行してみるのも手です。
実際の値を取得する(snmpwalk)
SNMP V2の場合の書式は以下のとおりです。
snmpwalk -v 2c -c [コミュニティ] [機器のIPアドレス] [OID]
V1の場合は「-v」で指定している引数を「1」にします。
バージョンは「1」「2c」「3」のいずれかが指定できます。
snmpwalk -v 1 -c [コミュニティ] [機器のIPアドレス] [OID]
以下の構成の場合の例です。
- sakue(コミュニティ名)
- 192.168.2.11(機器のIPアドレス)
- 1.3.6.1.4.1.11.2.14.11.5.1.1.2.1.1.1.7(OID)
snmpwalk -v 2c -c sakue 192.168.2.11 1.3.6.1.4.1.11.2.14.11.5.1.1.2.1.1.1.7
実行してみると現在の値が返ってきました。
[root@sakue ~]# snmpwalk -v 2c -c sakue 192.168.2.11 1.3.6.1.4.1.11.2.14.11.5.1.1.2.1.1.1.7 NETSWITCH-MIB::hpLocalMemAllocBytes.1 = INTEGER: 7808880
指定するOIDは階層になっているため、上の階層を表示したい場合はOIDの数字を末尾から削って実行します。
試しに末尾から2つ削り、2個上の階層を表示してみると、メモリ関連の値が色々出てきました。
以下の例から分かるように、大抵のMIBはカテゴリ分けされているので、目的のMIBに近い意味を持つMIBを発見したら、上の階層を見てみると目的のMIBが発見できたりします。
[root@sakue ~]# snmpwalk -v 2c -c sakue 192.168.2.11 1.3.6.1.4.1.11.2.14.11.5.1.1.2.1.1 NETSWITCH-MIB::hpLocalMemSlotIndex.1 = INTEGER: 1 NETSWITCH-MIB::hpLocalMemSlabCnt.1 = Counter32: 13452 NETSWITCH-MIB::hpLocalMemFreeSegCnt.1 = Counter32: 775 NETSWITCH-MIB::hpLocalMemAllocSegCnt.1 = Counter32: 12677 NETSWITCH-MIB::hpLocalMemTotalBytes.1 = INTEGER: 23546544 NETSWITCH-MIB::hpLocalMemFreeBytes.1 = INTEGER: 15737664 NETSWITCH-MIB::hpLocalMemAllocBytes.1 = INTEGER: 7808880
もっと削って先頭の「1」だけにすると全部のMIBと値が返ってきます。
snmpwalk -v 2c -c sakue 192.168.2.11 1
「| grep XXX」で絞り込んでもいいですが、多くの機器が数万行ほどあるため非常に時間がかかります。
このため、以下のようにファイルへ出力してからテキストエディタで開いてじっくり探す方がおすすめです。
snmpwalk -v 2c -c sakue 192.168.2.11 1 > /tmp/mibs.txt
コメントフォーム