使用しているルーターRT314はsyslog対応なのでlogをサーバーへ送ることができる。現用Linuxサーバーでも外部からのsyslogを受け取る設定にしてあるので、同じ事をFreeBSDサーバーでもやることにした。先ずはWeb検索である。syslog、FreeBSDをキーワードに検索するとたくさんヒットした。それによるとsyslog.confに記述し、/var/logに受け取るファイルを作ればOKのようである。syslog.confの記述はLinuxサーバーと同じであるので、/etc/syslog.confに
local1.* /var/log/rt314
と記述した。#touch /var/log/rt314で空のログファイルを作っておく。これだけはダメで/etc/newsyslog.confにログ・ローテーションを記述する。今回は
/var/log/rt314 644 5 100 * Z
とした。これは100kBになると新しいログとして古いログは圧縮して5個で廻すことを意味している。FreeBSD4以上ではsyslodはデフォルトでリモートからのログを受け取らないので、
/etc/rc.confにsyslogd_flags =" -a 192.168.0.0/24:*"
というオプションを記述する。ipfilterに穴を開ける必要があるのが、とりあえず/etc/rc.confでipfilterをコメントアウトしておいた。
これでうまくログを受け取るはずなのだが・・・ハマってしまった。
またまた、Web検索すると/etc/syslog.confや/etc/newsyslog.confに記述する際、左側のパートと右側のパート間の空白はTABキーを使う必要があるとのこと。でも最新のFreeBSDではこの縛りはないともあった。とりあえず、TABキーを使って書き直したがやはりダメであった。
最近、英語を読むのも億劫になっていたが、仕方ないのでman
sylsogdでマニュアルを読むことにした。FreeBSDに実装されているsyslogdではLinuxのようなリモートからの受信を許可する-rオプションがないことがわかった。確かに無制限にリモートからのlogを受信してしまえば重大なセキュリティーホールになるわけで、受け取るにしても送信してくる相手を制限する-aオプションが必要なことがわかった。
その後、紆余曲折があったがようやく成功した。以下、その勘所である。
1 /etc/syslog.confの記述
local1.* /var/log/rt314
当初は一番最後に記述していたが、それではダメである。!startslipと書いてある箇所よりも上に記述しよう。空白は念のためTABキーを使用する。
2 syslogdの起動オプションは/etc/rc.confに記述するとよい。/etc/rcを書き換えても良いがこちらの方が簡単である。
syslogd_flags="-4 -n -a *:*"
-4はIPv4のみでIPv6を使用しないというオプション、-nはsyslogに含まれるIPをDNSへ問い合わせしないというオプションである。当初これを記述しなかったらルーターとプロバイダーのDNS間でエンドレスのバケットが飛び回ってしまった。自宅では自前のDNSサーバーを運用していないので正引きは加入プロバイダーのものを利用しているが、Linuxサーバーのsyslogではこのようなことはない。-a
*:*はWeb検索で見つけたが、-rオプションと同等であり、これでようやく受信できるようになった。
3 /etc/newsyslog.confの記述は他から推測できる。これもLinuxの作法とは違うのでちょっと戸惑った。
/var/log/rt314 644 5 100 * Z
man newsyslog.confで詳細が読めるが、Linuxよりも芸が細かいかもしれない。ちなみに最後のZは古いログを圧縮するものである。/varに十分な容量を確保していれば、圧縮する必要がないのでZを外すと生ファイルでローテーションされる。こちらの空白も念のためTABキーを使った。ps
axで状況を確認すると
134 ?? Ss 0:00.08 /usr/sbin/syslogd -4 -n -a *:*
となり外部からの受け取りが可能となっている。ちなみにデフォルトでは
125 ?? Ss 0:00.08 /usr/sbin/syslogd -s
となっている。-sオプションがついていると外部からのログは受け取らないことになる。
4 /etc/ipf.rulesの記述
pass in quick proto udp from 192.168.0.1/32 to 192.168.0.2/32
port = 514 group 100
とした。これはルーター (192.168.0.1/32)からのポート514あてのudpを受け取るというものである。サーバーのIPは(192.168.0.2/32)である。
ipfilterとapache(httpd)関係のログはsyslogdを経由しないで出力されるようであり、newsyslog.confにローテーションを記述しても廻らなかった。
Linuxサーバーのapacheではデフォルトで/var/logに出力されたログがローテーションされるが、FreeBSDではそのような設定になっていないようである。ipfilterも/var/logへ出力する設定になっているが、ログが廻らないのでかなり大きなファイルとなっている。例によってweb検索でいくつかの情報がヒットし、/etc/newsyslog.confの記述ヒントがありそれにそれに従って書き換えてみたが、うまく廻わらなかった。また、こんなところでハマるのはイヤなのでcronで強引に廻すことにした。まず、ログを廻すスクリプトを作った。
#vi /usr/local/shellscript/logrotate.sh
#!/bin/sh
cp /var/log/httpd-access.log /var/log/httpd-access.log.bk
echo > /var/log/httpd-access.log
cp /var/log/httpd-error.log /var/log/httpd-error.log.bk
echo > /var/log/httpd-error.log
cp /var/log/ipflog /var/log/ipflog.bk
echo > /var/log/ipflog
#chmod + logrotate.sh
で実行ファイルとする。単純なスクリプトであるので説明の必要もない。ただ、バックアップをとり元ファイルを空にしているだけである。/etc/crontabに下記を追加した。
#httplogs and ipflog rotate weekly
15 4 * * 6 root /usr/local/shellscript/logrotate.sh
これで1週間に一度バックアップをとることになる。
ipfilterとapache(httpd)関係のログはcronで強引に廻していたが、やはり何とかしたいと思い始めた。雑誌やwebで当たった結果、/etc/newsyslog.confに以下の記述をすることでようやく廻り始めた。
/var/log/rt314 644 5 1000 *
Z
/var/log/httpd-access.log 644 5 1000 * Z /var/run/httpd.pid
/var/log/httpd-error.log 644 5 1000 * Z /var/run/httpd.pid
/var/log/ipflog 644 5 1000 *
Z /var/run/ipmon.pid
Zはファイルを圧縮するコメントであるが、/varの容量に余裕があったので、当初外したがnewsyslog:
illegal flag in config file -- /と怒られてしまった。Zを再挿入したら廻り始めた。これらの記述は1000kBで新しいファイルへ引き継ぎ、5回廻すことを意味している。