Ubuntu で、リモートから SNMP でマシンのトラフィックの監視をしたい。

まずは SNMP の基本用語から。
  • SNMP のサーバ側は、SNMP エージェントという。具体的には snmpd のことで、Ubuntu だと apt-get install snmpd でインストールできる。
  • SNMP クライアント側は、SNMP マネージャという。具体的には MRTG や snmpget、snmpwalk コマンドのことで、apt-get install mrtg や apt-get install snmp でインストールされるもの。
マシンのトラフィックを監視したかったら、監視対象のマシンで snmpd を動かす。監視する側は MRTG というシステムを設定する。そうするとブラウザから監視対象のマシンの入出力のトラフィックのグラフが見られたりする。 監視対象のマシンでは、/etc/snmp/snmpd.conf を設定する。Ubuntu の場合はデフォルトの設定を少しだけいじる。実際には、以下を参考にするとよいと思う。
...

# com2sec paranoid  default         public ←コメントアウト
com2sec readonly  192.168.0.0/24      public ← default とあった部分を、自分のネットワークの IP アドレスの範囲(CIDR)を書く。
com2sec readwrite localhost           private ← default とあった部分を、localhost に書き換える。

...

# group MyROSystem v1        paranoid ← MyROSystem あたりはコメントアウト
# group MyROSystem v2c       paranoid ← MyROSystem あたりはコメントアウト
# group MyROSystem usm       paranoid ← MyROSystem あたりはコメントアウト
group MyROGroup v1         readonly ← そのまま
group MyROGroup v2c        readonly ← そのまま
group MyROGroup usm        readonly ← そのまま
group MyRWGroup v1         readwrite ← そのまま
group MyRWGroup v2c        readwrite ← そのまま
group MyRWGroup usm        readwrite ← そのまま

...

#                context sec.model sec.level match  read   write  notif
# access MyROSystem ""  any  noauth  exact  system none  none ← コメントアウト
access MyROGroup     ""   any  noauth  exact  all        none  none ← そのまま
access MyRWGroup    ""   any  noauth  exact   all        all      none ← そのまま
設定を変更したら /etc/inet.d/snmpd restart または、apt-get install debian-helper-scripts してある人は service snmpd restart で再起動する。 snmpd が動作している監視対象のマシンと、監視する MRTG が同じマシン上で動いている場合は、MRTG の /etc/mrtg.cfg 設定ファイルの中で、 Target[localhost_2]: 2:private@localhost: とすればうまくいくと思う。問題は、監視対象のマシンと監視する MRTG が別のマシンにある場合。これはハマった。監視するマシンから試しに以下のコマンド、
snmpget -v 2c -c public 192.168.0.2 1.3.6.1.2.1.2.2.1.16.2
としても、snmpget: timeout となってしまうのだ。ちなみに上のコマンドは、トラフィックの出力の総バイト数を調べるときのもの。このあたりは、SNMP によるネットワークモニタリング の、interfacesサブツリー(1.3.6.1.2.1.2) あたりを参考にした。 で、いろいろと悩んだ挙句、snmpd デーモンを停止して、単に /usr/sbin/snmpd だけ起動するとうまく値が取得できることがわかったので、snmpd の起動スクリプトに問題があることがわかった。起動スクリプト /etc/init.d/snmpd 自体は問題ないのだが、このスクリプトは最初に /etc/default/snmpd というファイルを読み込むことになっており、/etc/default/snmpd の中には、
SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1'
という行があり、ここで snmpd デーモンが Listen するホスト名を 127.0.0.1 すなわち localhsot =自分自身として、localhost からだけの SNMP リクエストは受け付けるが、くどくいうとそれ以外からの SNMP リクエストを受け付けないようになっていたのだ。監視対象のマシンはリモートの MRTG から監視させたいわけだから、他のマシンからの SNMP リクエストにも応えなければならない。そのために余計な 127.0.0.1 などは削ってしまおう(以下のように 127.0.0.1 の部分を消す)。
SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid'
もちろん、セキュリティ上リモートから監視されては困る場合や、セキュリティをもっと厳密に考えなければならない場合などは、localhost 以外からのアクセスを受け付けるべきかどうかを検討したうえで、/etc/snmp/snmpd.conf ファイルの設定も public などと設定しないで、もっと違った community 名を付けるとか、よく考えた方がよいのは、言うまでもないことなので注意しよう。
トラックバック URL: https://perltips.twinkle.cc/trackback/302