SNMPの設定

投稿者: | 2011年7月10日
Pocket

はじめに

MRTG, rrdtools, cacti, nagios, Zabbixなどの監視ツールのベースとなるSNMP(NET-SNMP version 5.4.3)について、設定と動作確認を行います。

目次

  1. SNMPマネージャとエージェントのインストール
  2. Trapの受信設定
  3. SNMPマネージャの設定
  4. SNMPエージェントの設定

サーバ環境

製品名 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:
Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です