Postgrey はこんな感じ
まぁ、私があれこれ書かなくても、参考になる情報は多いので、そちらをどうぞ。
...なんだけど、自分でいじってみて気が付いた点などを。
インストール
オリジナルをソースを持ってきてても良いけど、やっぱりパッケージで入れた方が圧倒的に楽。
CentOS の場合だと、CentOS のリポジトリには無いので、rpmforge のリポジトリを追加すれば、「yum install postgrey」で必要なインストールは完了。
ポイントは、postfix 側の設定。
通常は、SMTP の RCPT TO を受け取った時に判断するので、smtpd_recipient_restrictions でチェックをかけるのだが、ここで「S25R に引っかかった場合に Greylisting」とするには、ちょっと工夫が必要。
まず、S25R のパターンに引っかけるために、main.cf 上で、こんな風に書く。
smtpd_recipient_restrictions = permit_mynetworks, check_client_access regexp:/etc/postfix/s25r, reject_noauth_destination
これで、接続してきた相手をチェックするのに、/etc/postfix/s25r 中に記述された正規表現を使いますよ、ということになる。で、/etc/postfix/s25r 側はこんな風に書く。
/^unknown$/ check_greylist /^[^.]*[0-9][^0-9.]+[0-9].*\./ check_greylist /^[^.]*[0-9]{5}/ check_greylist /^([^.]+\.)?[0-9][^.]*\.[^.]+\..+\.[a-z]/ check_greylist /^[^.]*[0-9]\.[^.]*[0-9]-[0-9]/ check_greylist /^[^.]*[0-9]\.[^.]*[0-9]\.[^.]+\..+\./ check_greylist /^(dhcp|dialup|ppp|[achrsvx]?dsl)[^.]*[0-9]/ check_greylist
通常なら左の条件に引っかかったら、右側に REJECT とか書いて、拒否するところに、謎の「check_greylist」などという物を書く。で、この「check_greylist」なるものを、また、postfix の main.cf で定義しておく。
smtpd_restriction_classes = check_greylist check_greylist = check_policy_service unix:/usr/spool/posfix/postgrey
smtpd_restriction_class で、いわば、オリジナルの処理名(check_greylist)を定義しておき、その処理名に対して、処理内容を記述しているのが2行目になる。で、この check_policy_service は別のプログラムに結果を判断してもらう、というもので、指定先に接続して判断を仰ぐ。その接続先で Postgrey が待ち受けている、という寸法になっている*1。
後は、check_policy_service で指定先で Postgrey が待ち受けするように動作していれば良い。rpmforge からのパッケージに含まれる起動スクリプトでは、UNIX ドメインソケットで Postgrey が待ち受けるようになっているので、check_policy_service の指定先は、そのパスを指定することになるが、IP ベースで待ち受けるようにするのであれば、「inet:localhost:10023」といった具合になる。
これを応用すれば、
- 特定の送信者アドレスや送信先アドレスに対して Greylisting
- 特定の IP アドレスの範囲に対して Greylisting
といった事が可能になる。
Postgrey は必要なパラメータをコマンドラインから指定するため、設定ファイルが無い。rpmforge からのパッケージに含まれる起動スクリプト(/etc/rc.d/init.d/postgrey)の場合、最終的には OPTIONS というシェル変数を postgrey に渡す。/etc/sysconfig/postgrey というファイルを作って、「OPTIONS=なんちゃら」と書けば、それがコマンドラインに渡る。
とはいえ、デフォルトをいじらないと、という感じはあまりない。強いて言うと、retry-window の2日間というのは長い感じがする。あと、max-age の 35 日間は、ホワイトリストを Postgrey の自動ホワイトリスト機能に任せて、自分で状況を見てホワイトリストを追加するので無ければ、この期間でも良いと思うが、積極的に状況を観察して、必要なホワイトリストは自分たちで追加するのであれば、max-age は短くした方が良いかなぁ。