2004/2/15

BEFSR41C-JPのsyslog取得(FreeBSD, Internet)

はじめに

リンクシスのBEFSR41C-JPというルータは安価なくせに高機能でSNMPを喋ることができます。今回はルータのログをsnmptrapを使ってFreeBSD側で受け取る設定を紹介します。

やり方として

  • syslogに出力させる
  • traphandleを使って自作ログに出力させる

の二種類を紹介します。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 エントリである。

HOSTNAME
trap を送ってきた該当ホストの名前。ホスト名は gethostbyaddr() で決定されたものである。
IPADDRESS
trap を送ってきたホストの IP アドレス。
VARBINDS
トラップとその変数の記述を含む variable bindings のリスト。空白までの行の最初のトークンは OID で、行の残りの部分はその値である。 1 番目の OID は system.sysUpTime.0、 2 番目の OID は ...snmpTrap.snmpTrapOID.0 にすべきである。 OID の残りは trap に含まれる variable bindings である (ただし最後の OID はこの限りでないかもしれない)。 SNMPv1 trap では、一番最後の OID は ...snmpTrap.snmpTrapEnterprise とその値である。基本的に SNMPv1 trap は、 SNMPv1 と SNMPv2 の共存のためのドキュメントに書かれている方法で、 SNMPv2 trap の PDU タイプに変換されている。しかし RFC の番号を忘れてしまった。

今回はテスト用のログ出力プログラムを公開します。

【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です










名前、アドレスを登録しますか?