我が家のメール・サーバーには、平均で 1日あたり 400~500通程度の迷惑メールが届く。そのため迷惑メール対策が欠かせず、MTA と連動した迷惑メール・フィルターとして、SpamAssassin が活躍している。
MTA (Postfix) から SpamAssassin にメールを投げるのは自作のコンテンツ・フィルターで、これは自宅だけでなく、同様に Postfix + SpamAssassin が稼動する業務環境にも導入されている (自宅サーバーは業務のテスト環境でもあるが、その逆もまた真)。しかしこのコンテンツ・フィルターは長らく Postfix と spamd が同じサーバー上で動作していることを暗黙の了解としていて、メール・サーバーの負荷増大の一因にもなっていたが、前に別マシン上の spamd を利用して負荷分散を図る必要が生じたことで、先日久々にアップグレードした。
ところが、その 「別マシン上の spamd」 である CentOS の SpamAssassin は自機外からの利用は想定されていないようで、外部 spamc からのアクセスを許可するには、spamd 側で起動時のオプションを追加する必要があった。
spamd が外部 spamc からのアクセスを受け付ける設定は、次の通り。(CentOS 5.5)
# cat /etc/sysconfig/spamassassin # Options to spamd #SPAMDOPTIONS="-d -c -m5 -H" ← デフォルト設定をコメントアウト SPAMDOPTIONS="-d -c -m5 -H -i -A 127.0.0.1,192.168.xxx.0/24" ← 追加
このように、-A オプションで接続を許可するクライアントの IP アドレスを、個別または範囲で列挙すればいいが、spamd が接続を待ち受ける IP アドレス (要するにインターフェイス?) を指定する -i オプションを忘れてはいけない。デフォルトで許可されているのは "127.0.0.1" だけなので、この指定がないと、外部からの接続は事実上不可能になる。上記例のように "-i" の後に任意の IP アドレスを明示しない場合は、"0.0.0.0" を指定するのと同義で、全てのインターフェイスが有効になる。
-m オプションは、子プロセスの最大数を指定している。デフォルトは 5 だが、spamd 専用マシンを用意できるなら、マシンのスペックに応じてもっと増やしてもいいと思う。あまり調子に乗りすぎると、窮地に陥るかもしれないが・・・。
加えてファイア・ウォールが有効な環境では、spamd が利用する TCP/783 を開けておく。
尚、spamc 実行時に -x オプションを付加すると、失敗時に以下のようなエラー・コードが得られるので、上手く動かない場合の調査や、spamc の結果を見てスクリプトの挙動を変えたりする際に役立つ (man spamc 参照)。
If the "-x" option is specified, ’safe fallback’ will be disabled, and certain error conditions
related to communication between spamc and spamd will result in an error code. The exit codes used
are as follows:
EX_USAGE 64 command line usage error
EX_DATAERR 65 data format error
EX_NOINPUT 66 cannot open input
EX_NOUSER 67 addressee unknown
EX_NOHOST 68 host name unknown
EX_UNAVAILABLE 69 service unavailable
EX_SOFTWARE 70 internal software error
EX_OSERR 71 system error (e.g., can’t fork)
EX_OSFILE 72 critical OS file missing
EX_CANTCREAT 73 can’t create (user) output file
EX_IOERR 74 input/output error
EX_TEMPFAIL 75 temp failure; user is invited to retry
EX_PROTOCOL 76 remote error in protocol
EX_NOPERM 77 permission denied
EX_CONFIG 78 configuration error
