はじめに
リンクシスのBEFSR41C-JPというルータは安価なくせに高機能でSNMPを喋ることができます。今回はルータのログをsnmptrapを使ってFreeBSD側で受け取る設定を紹介します。
やり方として
の二種類を紹介します。traphandleを使うと簡単に目的のsnmptrapに対して別のプログラムが実行できるので色々活用できそうです。
ucd-snmpのインストール
既にucd-snmpは名前をnet-snmpと変えてVer5.xが出ていますが、今回はucd-snmp 4.xを使用します。理由はこちらのほうが現時点ではインターネット上で情報が豊富だからです。
さて、portsからサクっとインストールしましょう。
| # cd /usr/ports/net/net-snmp4 # make install clean |
今回はsnmpエージェントは使用しないので、/usr/local/etc/rc.d/snmpd.shを起動不可にします。
| # cd /usr/local/etc/rc.d # mv snmpd.sh snmpd.sh.sample |
一応インストール確認として、ルータの情報を軽く見てみましょう。(私の場合は192.168.0.1がルータのアドレスです)
| # snmpwalk 192.168.0.1 public |
ずらっと何か出たと思います。内容についてはsnmpを他サイトで勉強しましょう(笑)
BEFSR41C-JPの設定
ルータ設定画面からログのタブを選択し、ログを有効に。送信するIPアドレスに(一応)FreeBSDのアドレスを入力します。ただし、この値がデフォルトの255でもブロードキャストで全マシンに流れるので特に問題ありません。

syslogに出力する
まずはルータログをsyslogで取得してみましょう。
/usr/local/etc/rc.d/snmptrapd.shを以下のように作成します。
#!/bin/sh
if ! PREFIX=$(expr $0 : "\(/.*\)/etc/rc\.d/$(basename $0)\$"); then
echo "$0: Cannot determine the PREFIX" >&2
exit 1
fi
case "$1" in
start)
[ -x ${PREFIX}/sbin/snmptrapd ] && ${PREFIX}/sbin/snmptrapd -s -l5
echo -n ' snmptrapd'
;;
stop)
killall snmptrapd && echo -n ' snmptrapd'
;;
*)
echo "Usage: `basename $0` {start|stop}" >&2
;;
esac
exit 0 |
この例ではtrapを受けるsyslogのファシリティーはlocal5を使っています。
続いて/etc/syslog.confに以下の一行を追加します。
local5.* /var/log/linksys.log |
途中の空白はTABで入力してください。スペースだと駄目です。
ここまで準備ができたら、syslogdにHUPシグナルを送り、snmptrapdを起動します。
| # ps -ax|grep syslogd 77 ?? Ss 0:07.58 /usr/sbin/syslogd # kill -1 77 # /usr/local/etc/rc.d/snmptrapd.sh start |
暫くネットを徘徊してから/var/log/linksys.logを見てみましょう。以下のようなログがたまっているはずです。
| Jan 1 00:01:39 penpen snmptrapd[209]: 192.168.0.1: Enterprise Specific
Trap (1)Uptime: 9 days, 15:13:26.98, enterprises.3955.1.1.0 = "@out
UDP from 192.168.0.4:123 to 133.100.9.2(133.100.9.2):123." Jan 1 00:02:47 penpen snmptrapd[209]: 192.168.0.1: Enterprise Specific Trap (1)Uptime: 9 days, 15:14:34.99, enterprises.3955.1.1.0 = "@out UDP from 192.168.0.4:123 to 133.100.11.8(133.100.11.8):123." Jan 1 00:05:59 penpen snmptrapd[209]: 192.168.0.1: Enterprise Specific Trap (1)Uptime: 9 days, 15:17:47.00, enterprises.3955.1.1.0 = "@out UDP from 192.168.0.4:123 to 131.107.1.10(131.107.1.10):123." Jan 1 00:07:12 penpen snmptrapd[209]: 192.168.0.1: Enterprise Specific Trap (1)Uptime: 9 days, 15:19:00.00, enterprises.3955.1.1.0 = "@out UDP from 192.168.0.4:123 to 142.3.100.2(142.3.100.2):123." Jan 1 00:18:43 penpen snmptrapd[209]: 192.168.0.1: Enterprise Specific Trap (1)Uptime: 9 days, 15:30:31.02, enterprises.3955.1.1.0 = "@out UDP from 192.168.0.4:123 to 133.100.9.2(133.100.9.2):123." Jan 1 00:19:43 penpen snmptrapd[209]: 192.168.0.1: Enterprise Specific Trap (1)Uptime: 9 days, 15:31:31.02, enterprises.3955.1.1.0 = "@in TCP from 220.210.112.39:3597 to 220.211.195.200:135." Jan 1 00:19:50 penpen snmptrapd[209]: 192.168.0.1: Enterprise Specific Trap (1)Uptime: 9 days, 15:31:38.03, enterprises.3955.1.1.0 = "@out UDP from 192.168.0.4:123 to 133.100.11.8(133.100.11.8):123." |
traphandleで取得する
次はtraphandleで取得してみましょう。前節で設定したsyslogのトラップ設定はそのまま残しても構いません。もし、syslogへの出力を止めてtraphandleだけでログを取得したい場合は、/usr/local/etc/rc.d/snmptrapd.sh内のsnmptrapdの引数「-s -l5」を削除してください。
さて、traphandleの設定は/usr/local/share/snmp/snmptrapd.confで行います。今回trap検知するルータのOIDは「.1.3.6.1.4.1.3955.2.2.1.0.1」です。この値について分からない人はSNMPの基礎を他サイトで勉強しましょう。私もよく分かっていません。
このOIDに対してtrapが発生した時に実行するプログラムも用意します。私はconfと同じ場所においたので、設定ファイルは以下の様になります。
【/usr/local/share/snmp/snmptrapd.conf】| traphandle .1.3.6.1.4.1.3955.2.2.1.0.1 /usr/local/share/snmp/befsr41c-jp.traphandle |
続いてプログラム内の紹介ですが、traphandleで受けたプログラムは標準入力から情報を受け取ります。
linux.or.jpから引用します。
プログラムは trap の詳細を標準入力から受け取る。フォーマットは以下のようになっており、1 行につき 1 エントリである。
今回はテスト用のログ出力プログラムを公開します。
【befsr41c-jp.traphandle】#!/usr/bin/perl
while (<STDIN>) {
$buf.=$_;
}
open(FILE,">>/tmp/out.txt");
print FILE $buf;
print FILE "-----\n";
close(FILE); |
syslogよりも多い情報を取得できますが、こちらは単にログを収集するのではなく、ログの内容に対して何かしらのアクションを起こす仕組みを作りこむのがいいと思います。
例えばIPアドレスが変更になったら、即時DynamicDNSの更新を行う等ができます。
投稿者 yotan : 2004年2月15日 00:00| トラックバック(1)※コメント内にURLを書くとSPAM扱いとなります。2ch風に表記はOKです


