2004/12/31

ルータの仕事はルーティングのみ(FreeBSD, Internet)

自宅で使っているbbルータはLinksysのBEFSR41C-JPです。普通のbbルータなので以下の機能を持っています。

  • PPPoEによる接続及びルーティング
  • 上記のNAT機能
  • SNMPサーバ
  • DNSリレー
  • DHCPサーバ
  • DDNS更新

普通のルータですね。So-net ADSLを利用しているのでレンタルしているモデムにもルータ機能がついているのですが、 SNMPを喋れないとDDNSの更新が面倒くさいのでこのモデムはブリッジモードにして、BEFSR41C-JPを繋げています。

「ルータにはルータ本来の仕事だけをさせよう」と思い、 ルータについている付加機能は全てFreeBSD上にサービスを移行してしまいました。

まずはDNSリレーですが、ローカルエリアにもパソコンが3台あるので、 IPベースのホスト名解決の為に個々のパソコンの/etc/hostsをメンテするのも大変なので、 ローカル用及びグローバル用にBind9によるDNSサーバを設置しました。

前の記事で家庭内DNSサーバはルートサーバへの負担も考えて使わない方が良いと宣言しましたが、 意外とルートサーバから名前引きをさせても応答速度は結構早いことが分かり、導入してしまいました。すみません。

So-netの用意しているDNSサーバへリレーすればまだいいのですが、 夜など高負荷状態の時にDNSの問い合わせがタイムアウトするという経験を何度かしているので直にルートサーバから引いています。

続いてDHCPサーバですが、isp-dhchdを導入しました。ローカルエリアのドメイン名もhijiki.netにしたので、 ドメインサフィックスもリース時に通知したいのですが、ルータにあるDHCPサーバにはそこまでの機能は無かったので導入しました。 実際にDHCPサーバのお世話になるクライアントは一台だけなんですけどね…

DDNS更新ですが、元々BEFSR41C-JPはDynDNS.orgにしか対応していなかったので、 これは早期にLinux用のフリーソフトであるDiCEのお世話になっています。外向けのDNSはValueDomain管理なのですが、 ちゃんと対応しています。

IPは定期的にSNMPを使ってルータから直にWAN側IPのエントリを取得しているので、 HTTPを使って管理画面から指定場所のアドレスを加工して取ってくるとか面倒くさい事をしなくて済みます。SNMPは便利ですね。 なんで各社実装しないのでしょうか。

…というわけで、BEFSR41C-JPは今は純粋にルータとしてのみ機能しています。スループットの向上にも多少貢献したのでは? と思いますがどうでしょう。

DNSの問い合わせログを見ていて思ったのですが、 BEFSR41C-JPが定期的にNTPで時刻修正する際に台湾のサーバを見ていることが発覚してちょっとびっくりしました。いや、 別にいいんですけど出来れば自分でサーバリストの編集が出来ればいいなと思いました。

2004/12/18

FreeBSD on swatchでログ監視(FreeBSD)

今までログの監視は自作スクリプトで行っていたのだけど、swatchという便利なツールがある事を知り、早速導入してみた。

使用したswatchのVersionは3.1.1なのだけれど、家の環境ではマニュアル通りには動作しなかったので、 注意点をエントリします。

まず導入ですが、こちらはportinstall swatchで入ります。 /usr/local/etc/rc.d/swatch.shのコメントを見て、設定を行ったのですが、 以下の設定ファイルでは正しくマッチした行をコマンドに引き渡すことができませんでした。

watchfor /TEL\[01\/1\] InComing Call from/
exec "/root/swatch/telsend $0"

このtelsendというコマンドの中身は割愛しますが、 この状態でargv[0]を見るとswatchが吐き出す一時実行スクリプトの名前そのものが渡ってしまいます。

仕方ないのでスクリプトを解析して、perlで書かれていたので、「$0」や「$*」 を指定しろとマニュアルにも書かれているのですが「$_」を指定したらうまく引き継がれました。 これは皆さんもswatchが出力する実行ファイルの中身を見れば理由は分かると思います。 $0や$*に対する処理が全くされていません。

あと、rcファイルですが、/etc/rc.confに以下の形式で二つのswatchを実行するように定義しました。

swatch_rules="1 2"
swatch_1_flags="-c /root/swatch/swatch.tel.conf -t /var/log/rta52i-log --daemon
--pid-file=/var/run/swatch_tel.pid"
swatch_1_pidfile="/var/run/swatch_tel.pid"
swatch_2_flags="-c /root/swatch/swatch.link.conf -t /var/log/linksys.log --daemo
n --pid-file=/var/run/swatch_link.pid"
swatch_2_pidfile="/var/run/swatch_link.pid"

pidfileは個々に分けないと、/usr/local/etc/rc.d/swatch stop実行時に正常に停止出来ないみたいです。

しかし、/etc/local/etc/rc.d/swatch.shの中で、 停止時のKILLレベルが弱くて正常にこのままでは終了しません。「sig_stop=SIGKILL」 にKILLレベルを変更して対応しました。

ただし、この場合/rootに「.swatch_script.*」 というファイルがどんどん残ってしまうので適当なタイミングで手動で消す必要があります。うーん、不便。いまに何とかします。

最後に、家の環境だけかもしれませんが、結構有名だったswatchにしては単純なバグ?があるなあと思いました。 幸いなことに簡単な問題だったので対処は楽でしたが、同じ思いをしている方向けにエントリします。


後日談ですが、オプションに「--awk-field-syntax」を付けると、$0や$1が使えるようになるみたいです。
(参考サイト:@~のひたすらメモ、ありがとうございました)