はじめに
MRTG, rrdtools, cacti, nagios, Zabbixなどの監視ツールのベースとなるSNMP(NET-SNMP version 5.4.3)について、設定と動作確認を行います。
目次
サーバ環境
製品名 | Dell OPTIPLEX SX280 |
CPU | Intel Pentium4 CPU 2.8GHz |
メモリ | 3GB(PC2-5300U(1GB) x 1枚、PC2-5300U(2G) x 1枚) |
ストレージ | IBM SATA 160GB |
1. SNMPマネージャとエージェントのインストール
root@labo:~# aptitude install snmp snmpd 以下の新規パッケージがインストールされます: snmp snmpd 更新: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。 2,005 kB のアーカイブを取得する必要があります。展開後に 2,642 kB のディスク領域が新たに消費されます。 取得:1 http://ftp.jp.debian.org/debian/ squeeze/main snmp i386 5.4.3~dfsg-2 [1,044 kB] 取得:2 http://ftp.jp.debian.org/debian/ squeeze/main snmpd i386 5.4.3~dfsg-2 [961 kB] 2,005 kB を 6秒 秒でダウンロードしました (318 kB/s) パッケージを事前設定しています ... 未選択パッケージ snmp を選択しています。 (データベースを読み込んでいます ... 現在 126390 個のファイルとディレクトリがインストールされています。) (.../snmp_5.4.3~dfsg-2_i386.deb から) snmp を展開しています... 未選択パッケージ snmpd を選択しています。 (.../snmpd_5.4.3~dfsg-2_i386.deb から) snmpd を展開しています... man-db のトリガを処理しています ... snmp (5.4.3~dfsg-2) を設定しています ... snmpd (5.4.3~dfsg-2) を設定しています ... Starting network management services: snmpd.
snmpがSNMPマネージャ、snmpdがSNMPエージェントになります。
root@labo:~# ps aux | grep snmp snmp 3687 0.0 0.1 9916 4204 ? SN 22:49 0:00 /usr/sbin/snmpd -Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid root@labo:~# netstat -an | grep :161 udp 0 0 127.0.0.1:161 0.0.0.0:*
SNMPエージェントが起動しています。ListenしているIPアドレスが127.0.0.1で外部サーバからPollingできないため、設定変更を行います。
以前と流儀が変わっておりうまく動作しませんでしたが、偉い人にはわからんのですさんのサイトに方法が記載されていました。
root@labo:~# vi /etc/snmp/snmpd.conf # Listen for connections from the local system only #agentAddress udp:127.0.0.1:161 # Listen for connections on all interfaces (both IPv4 *and* IPv6) #agentAddress udp:161,udp6:[::1]:161 agentAddress udp:161
agentAddress udp:127.0.0.1:161をコメントアウトしてagentAddress udp:161を追加しました。
root@labo:~# /etc/init.d/snmpd restart Restarting network management services: snmpd snmptrapd. root@labo:~# netstat -an | grep :161 udp 0 0 0.0.0.0:161 0.0.0.0:*
2. Trapの受信設定
root@labo:~# vi /etc/default/snmpd # This file controls the activity of snmpd and snmptrapd # Don't load any MIBs by default. # You might comment this lines once you have the MIBs downloaded. export MIBS= # snmpd control (yes means start daemon). SNMPDRUN=yes # snmpd options (use syslog, close stdin/out/err). #SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid' SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid' # snmptrapd control (yes means start daemon). As of net-snmp version # 5.0, master agentx support must be enabled in snmpd before snmptrapd # can be run. See snmpd.conf(5) for how to do this. #TRAPDRUN=no TRAPDRUN=yes # snmptrapd options (use syslog). #TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid' TRAPDOPTS='-Ls5 -p /var/run/snmptrapd.pid' # create symlink on Debian legacy location to official RFC path SNMPDCOMPAT=yes
TRAPDRUNをyesに修正しました。そして、TRAPDOPTSのオプションを-Ls5に修正することで、受け取ったtrapをfacility:local5でrsyslogに渡します。
root@labo:~# /etc/init.d/snmpd restart Restarting network management services: snmpd snmptrapd. root@labo:~# ps aux | grep snmp snmp 3884 0.2 0.1 9912 4260 ? SN 23:11 0:00 /usr/sbin/snmpd -Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid root 3886 0.0 0.0 8696 1152 ? SNs 23:11 0:00 /usr/sbin/snmptrapd -Ls5 -p /var/run/snmptrapd.pid root 3888 0.0 0.0 2992 836 pts/0 SN+ 23:11 0:00 grep snmp
snmptrapdプロセスが立ち上がりました。次に、rsyslog側でlocal5をtrap.logに保存するようにします。
root@labo:~# vi /etc/rsyslog.conf ... local5.* /var/log/trap.log local6.* /var/log/router.log "/etc/rsyslog.conf" 119 lines, 2696 characters written root@labo:~# /etc/init.d/rsyslog restart Stopping enhanced syslogd: rsyslogd. Starting enhanced syslogd: rsyslogd.
以上でTrapの受信準備が整いました。
次に、Trapの送出元となるルータを用意します。
手元に用意できるRTX1000に以下の設定を行い、ケーブルを抜去してTrap送出させて見ます。
snmp trap host 192.168.0.121 snmp trap enable snmp all snmp trap community public
192.168.0.121に対してcommunity publicでtrapを送出する設定です。
root@labo:~# tail -f /var/log/trap.log ... Jun 26 23:27:46 labo snmptrapd[4163]: NET-SNMP version 5.4.3 Jun 26 23:28:44 labo snmptrapd[4163]: No access configuration - dropping trap. Jun 26 23:28:49 labo snmptrapd[4163]: No access configuration - dropping trap.
ルータ(192.168.0.1)でケーブルを抜いてみたところ、「 No access configuration – dropping trap.」というログが出ました。調べてみると苦悩するだめ日記5に類似事象が見つかりました。snmptrapd.confにauthCommunity設定が必要のようです。
root@labo:~# vi /etc/snmp/snmptrapd.conf ############################################################################### # # EXAMPLE-trap.conf: # An example configuration file for configuring the Net-SNMP snmptrapd agent. # ############################################################################### # # This file is intended to only be an example. If, however, you want # to use it, it should be placed in /etc/snmp/snmptrapd.conf. # When the snmptrapd agent starts up, this is where it will look for it. # # All lines beginning with a '#' are comments and are intended for you # to read. All other lines are configuration commands for the agent. # # PLEASE: read the snmptrapd.conf(5) manual page as well! # authCommunity log,execute,net public
一番下の行を追加しました。第8回 SNMPによる異常値検出テクニックによると、「ログ出力(log)」「コマンドの実行(execute)」「別のネットワークへの転送(net)」を許すという意味のようです。とりあえずこの設定で試してみます。
root@labo:~# /etc/init.d/snmpd restart Restarting network management services: snmpd snmptrapd. root@labo:~# tail -f /var/log/trap.log Jun 28 21:46:17 labo snmptrapd[20142]: 2011-06-28 21:46:07 192.168.0.1(via UDP: [192.168.0.1]:161->[192.168.0.111]) TRAP, SNMP v1, community public#012#011iso.3.6.1.4.1.1182.1.23 Link Down Trap (0) Uptime: 97 days, 21:26:03.26#012#011iso.3.6.1.2.1.2.2.1.1 = INTEGER: 3 Jun 28 21:46:22 labo snmptrapd[20142]: 2011-06-28 21:46:17 192.168.0.1(via UDP: [192.168.0.1]:161->[192.168.0.111]) TRAP, SNMP v1, community public#012#011iso.3.6.1.4.1.1182.1.23 Link Up Trap (0) Uptime: 97 days, 21:26:06.26#012#011iso.3.6.1.2.1.2.2.1.1 = INTEGER: 3
今度はちゃんと記録されました。
3. SNMPマネージャの設定
SNMPマネージャはsnmpgetやsnmpwalkでSNMPエージェントに対して情報を取得する機能です。先ほどtrap送出元にしたRTX1000を、今度はSNMPエージェントにするため、以下の設定を入れます。
snmp host 192.168.0.111 snmp community read-only public snmp local address 192.168.0.1 snmp syscontact aaa snmp sysname ccc snmp syslocation bbb
SNMPエージェントの準備が整ったら、SNMPマネージャからRTX1000にsnmpwalkしてみます。
root@labo:~# snmpwalk -v 1 -c public 192.168.0.1 .1.3.6.1.2.1.1 iso.3.6.1.2.1.1.1.0 = STRING: "RTX1000 Rev.8.01.28 (Mon Aug 4 17:13:15 2008)" iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.1182.1.23 iso.3.6.1.2.1.1.3.0 = Timeticks: (845930967) 97 days, 21:48:29.67 iso.3.6.1.2.1.1.4.0 = STRING: "aaa" iso.3.6.1.2.1.1.5.0 = STRING: "ccc" iso.3.6.1.2.1.1.6.0 = STRING: "bbb" iso.3.6.1.2.1.1.7.0 = INTEGER: 12
取得できましたが、オブジェクト名が表記されず、OID表示されています。
試しにオブジェクト名でsnmpwalkできるか、確かめてみます。
root@labo:~# snmpwalk -c public -v 1 localhost ifDescr ifDescr: Unknown Object Identifier (Sub-id not found: (top) -> ifDescr)
エラーになりました。どうやらMIB定義ファイルが認識されていないようです。試行錯誤したところ、以下の設定がまずいようです。
root@labo:/usr/share/mibs/netsnmp# vi /etc/snmp/snmp.conf # # As the snmp packages come without MIB files due to license reasons, loading # of MIBs is disabled by default. If you added the MIBs you can reenable # loaging them by commenting out the following line. # mibs :
最後のmibs :をコメントアウトします(mibdirsとmibsを正確に指定しても動作すると思われます)
root@labo:/usr/share/mibs/netsnmp# snmpwalk -c public -v 1 localhost ifDescr IF-MIB::ifDescr.1 = STRING: lo IF-MIB::ifDescr.2 = STRING: eth0 IF-MIB::ifDescr.3 = STRING: pan0
オブジェクト名が認識できるようになりましたので、いくつか利用価値のあるコマンドを試してみます。
オブジェクト名からOIDを調べる
root@labo:~# snmptranslate -On -IR ifDescr .1.3.6.1.2.1.2.2.1.2
snmpwalkの結果をOIDで表示する。
root@labo:/usr/share/mibs/netsnmp# snmpwalk -c public -v 1 localhost ifDescr -On .1.3.6.1.2.1.2.2.1.2.1 = STRING: lo .1.3.6.1.2.1.2.2.1.2.2 = STRING: eth0 .1.3.6.1.2.1.2.2.1.2.3 = STRING: pan0
MIBツリーを表示する。
root@labo:~# snmptranslate -Tp | less +--iso(1) | +--org(3) | +--dod(6) | +--internet(1) | +--directory(1) | +--mgmt(2) | | | +--mib-2(1) | | | +--system(1) | | | | | +-- -R-- String sysDescr(1) | | | Textual Convention: DisplayString | | | Size: 0..255 | | +-- -R-- ObjID sysObjectID(2) | | +-- -R-- TimeTicks sysUpTime(3) | | | | | | | +--sysUpTimeInstance(0) | | | | | +-- -RW- String sysContact(4) | | | Textual Convention: DisplayString | | | Size: 0..255 | | +-- -RW- String sysName(5) | | | Textual Convention: DisplayString | | | Size: 0..255 | | +-- -RW- String sysLocation(6) | | | Textual Convention: DisplayString | | | Size: 0..255 | | +-- -R-- INTEGER sysServices(7) | | | Range: 0..127 | | +-- -R-- TimeTicks sysORLastChange(8) | | | Textual Convention: TimeStamp | | | | | +--sysORTable(9) | | | | | +--sysOREntry(1) | | | Index: sysORIndex | | | | | +-- ---- INTEGER sysORIndex(1) | | | Range: 1..2147483647 | | +-- -R-- ObjID sysORID(2) | | +-- -R-- String sysORDescr(3) | | | Textual Convention: DisplayString | | | Size: 0..255 | | +-- -R-- TimeTicks sysORUpTime(4) | | Textual Convention: TimeStamp | | | +--interfaces(2) | | | | | +-- -R-- Integer32 ifNumber(1) | | | | | +--ifTable(2) | | | | | +--ifEntry(1) | | | Index: ifIndex | | | | | +-- -R-- Integer32 ifIndex(1) | | | Textual Convention: InterfaceIndex | | | Range: 1..2147483647 | | +-- -R-- String ifDescr(2) | | | Textual Convention: DisplayString | | | Size: 0..255 省略
4. SNMPエージェントの設定
SNMPエージェントの設定は/etc/snmp/snmpd.confで行います。設定内容は、主にSNMPマネージャに対してどのような情報を公開するかのコントロールです。
長らくSNMPを触っていなかったこともあり、snmpd.confのデフォルト設定を一通り確認してみました。
・ACCESS CONTROLについて
# system + hrSystem groups only view systemonly included .1.3.6.1.2.1.1 view systemonly included .1.3.6.1.2.1.25.1 # Full access from the local host rocommunity public localhost # Default access to basic system info rocommunity public default -V systemonly # Full access from an example network # Adjust this network address to match your local # settings, change the community string, # and check the 'agentAddress' setting above #rocommunity secret 10.0.0.0/16 # Full read-only access for SNMPv3 #rouser authOnlyUser # Full write access for encrypted requests # Remember to activate the 'createUser' lines above #rwuser authPrivUser priv
デフォルトでは上記のような設定が入っています。
rouser authOnlyUserはSNMPv3用です。SNMPv3は使用しないためコメントアウトしてしまいました。
rocommunityとrwcommunityはSNMPv1とv2cで共通設定のため、両バージョンに対する設定になります。
上記デフォルトの設定のまま、別サーバからsnmpwalkすると以下のように、view systemonlyで設定したOIDのみが表示されました。
root@labo-2:~# snmpwalk -v 1 -c public 192.168.0.111 iso.3.6.1.2.1.1.1.0 = STRING: "Linux labo 2.6.32-5-686 #1 SMP Wed May 18 07:08:50 UTC 2011 i686" ... iso.3.6.1.2.1.1.9.1.4.8 = Timeticks: (13) 0:00:00.13 iso.3.6.1.2.1.25.1.1.0 = Timeticks: (1523784) 4:13:57.84 ... iso.3.6.1.2.1.25.1.7.0 = INTEGER: 0 End of MIB
localhost以外からのpollingは「rocommunity public default -V systemonly」にマッチするため、systemonlyビューでincludeされたiso.3.6.1.2.1.1とiso.3.6.1.2.1.25のみしか取得できなかったことになります。
以下のように修正すると、192.168.0.0/24内の別サーバからもcommunity=hogehogeでアクセスすることで全てのMIB情報を取得することができるようになります。また、publicでアクセスするとこれまで通りiso.3.6.1.2.1.1とiso.3.6.1.2.1.25のみしか取得できませんでした。
rocommunity public localhost rocommunity hogehoge 192.168.0.0/24 rocommunity public default -V systemonly
・sysLocation/sysContactについて
次に、snmpd.confのSYSTEM INFORMATION部分を見ていきます。
############################################################################### # # SYSTEM INFORMATION # sysLocation Sitting on the Dock of the Bay sysContact Me
上記sysLocationとsysContactを以下に修正します。
sysLocation Jitaku labo(Dell) sysContact Me
snmpdを再起動します。
root@labo:~# /etc/init.d/snmpd restart Restarting network management services: snmpd snmptrapd.
別サーバからアクセスしてみます。
root@labo-2:~# snmpget -c hogehoge -v 1 192.168.0.111 .1.3.6.1.2.1.1.6.0 iso.3.6.1.2.1.1.6.0 = STRING: "Jitaku labo(Dell)" root@labo-2:~# snmpget -c hogehoge -v 1 192.168.0.111 .1.3.6.1.2.1.1.4.0 iso.3.6.1.2.1.1.4.0 = STRING: "Me"
labo側の変更が反映されています。
・sysServicesについて
manには以下の記載がありますのでdefaultのままにしておきます。
「system.sysServices.0 オブジェクトの値を設定する。 ホストの場合は、72 がよい。」
sysServices 72
pollingすると以下のように見えるだけで利用用途は不明です。
root@labo:~# snmpwalk -v 1 -c public localhost 1.3.6.1.2.1.1.7 iso.3.6.1.2.1.1.7.0 = INTEGER: 72
・procについて
以下の設定はデフォルト値です。「proc プロセス名」と指定すると、指定したプロセスの数がsnmpで取得できるようになります。また、プロセス名に続けて閾値を設けておくと、その範囲外になった際にtrapを上げることも可能になります。
proc mountd proc ntalkd 4 proc sendmail 10 1
上記設定では、mountdは1つ以上、ntalkdは0~4、sendmailは1~10プロセスが動いているのが正常で、異なる場合はprErrorFlag(1.3.6.1.4.1.2021.2.1.100)が0から1に変化します。そしてメッセージがprErrMessage(1.3.6.1.4.1.2021.2.1.101)に表示されます。
デフォルト設定で指定されているmountdとsendmailは本サーバでは立ち上がっていないため、実際にsnmpwalkしてみると以下の通りになっていました。
※ntalkdも上がっていませんが、条件が0~4プロセスなので、0でも正常扱いになります。
root@labo:~# snmpwalk -v 1 -c public localhost 1.3.6.1.4.1.2021.2.1.100 iso.3.6.1.4.1.2021.2.1.100.1 = INTEGER: 1 iso.3.6.1.4.1.2021.2.1.100.2 = INTEGER: 0 iso.3.6.1.4.1.2021.2.1.100.3 = INTEGER: 1 root@labo:~# snmpwalk -v 1 -c public localhost 1.3.6.1.4.1.2021.2.1.101 iso.3.6.1.4.1.2021.2.1.101.1 = STRING: "No mountd process running." iso.3.6.1.4.1.2021.2.1.101.2 = "" iso.3.6.1.4.1.2021.2.1.101.3 = STRING: "Too few sendmail running (# = 0)"
MRTG等でapacheのプロセス数をグラフ化したいため、以下の通りapache2を監視するように修正します(プロセス数の監視は行いません)。
proc apache2
・diskについて
デフォルトでは以下の設定になっていました。
disk / 10000 disk /var 5% includeAllDisks 10%
/ が10MB、/varが5%、全disk容量が10%以下(includeAllDisksは正しい情報が見付からなかったため推測です)になったらdskErrorFlag(1.3.6.1.4.1.2021.9.1.100)が1に設定され、エラーを説明するメッセージがdskErrorMsg(1.3.6.1.4.1.2021.9.1.101)に表示されます。
これも現状は使用しないためコメントアウトしておきます。
・loadについて
デフォルトでは以下の設定になっていました。
load 12 10 5
マシンの平均負荷をチェックし、1分平均が12%、5分平均が10%、15分平均が5%を超えていたら、laErrorFlag(1.3.6.1.4.1.2021.10.1.100)に1をセットして、laErrMessage(1.3.6.1.4.1.2021.10.1.101)にテキスト文字列のエラーメッセージを返します。
これも現状は使用しないためコメントアウトしておきます。
・trapsinkについて
この設定は、上記で見てきたprocやdisk、loadがある条件を満たした際にtrapを出力させたい時に使用します。
第8回 SNMPによる異常値検出テクニック (1/7)が参考になります。細かい説明は上記サイトを参照して頂ければと思います。
############################################################################### # # ACTIVE MONITORING # trapcommunity public trapsink localhost public trapsink 192.168.0.121 public createUser _internal MD5 "internalpass" iquerySecName _internal rouser _internal linkUpDownNotifications yes
本サイトでは上記設定を行うことで、Linkdown時に以下のようなtrapが上がるようになりました。
Jul 3 17:37:05 labo-2 snmptrapd[1820]: 2011-07-03 17:37:05 labo.local [192.168.0.111] (via UDP: [192.168.0.111]:48455->[192.168.0.121]) TRAP, SNMP v1, community public#012#011iso.3.6.1.4.1.8072.3.2.10 Link Down Trap (0) Uptime: 0:01:00.04#012#011iso.3.6.1.2.1.2.2.1.1.3 = INTEGER: 3#011iso.3.6.1.2.1.2.2.1.7.3 = INTEGER: 1#011iso.3.6.1.2.1.2.2.1.8.3 = INTEGER: 2#011iso.3.6.1.6.3.1.1.4.3.0 = OID: iso.3.6.1.4.1.8072.3.2.10
proc設定にてapache2を監視するようにしているので、apache2が落ちた際にtrapを上げることができるかも確かめましたがうまく動きませんでした。
試した内容ですが、まずSNMPD.EXAMPLESのサイトを見てみたところ、デフォルト設定で入っている以下の設定があれば動きそうですがだめでした。
# generate traps on UCD error conditions defaultMonitors yes
弾き語って御免さんのサイトやnet-snmpについて(Trap設定)、第8回 SNMPによる異常値検出テクニック (6/7)を参考にnotificationEventやmonitor設定も色々と試行錯誤してみましたがtrapは上がりませんでした。
試したパターン1
notificationEvent apache2_down .1.3.6.1.4.1.9999.1.2.1 monitor -u _internal -r 30 -e apache2_down "apache2" prErrorFlag.1 != 0
試したパターン2
monitor -u _internal -r 30 -o prNames -o prErrMessage "procTable" prErrorFlag.1 == 1
defaultMonitors yesがあると設定が被ってしまいうまく動かないのかもしれないと思いはずしてみましたが駄目でした。他にもいろいろと微調整してみましたが駄目でした。以下の通り、apache2を落とすと以下の通り、prErrorFlagは立つのですが… MANにも特に有益な情報がないため諦めます。
誰かご存知の方がいらっしゃいましたらご指摘頂けると助かります。
root@labo:~# snmpwalk -c public -v 1 localhost prTable UCD-SNMP-MIB::prIndex.1 = INTEGER: 1 UCD-SNMP-MIB::prNames.1 = STRING: apache2 UCD-SNMP-MIB::prMin.1 = INTEGER: 0 UCD-SNMP-MIB::prMax.1 = INTEGER: 0 UCD-SNMP-MIB::prCount.1 = INTEGER: 0 UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: error(1) UCD-SNMP-MIB::prErrMessage.1 = STRING: No apache2 process running. UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0) UCD-SNMP-MIB::prErrFixCmd.1 = STRING: