Postgrey vs milter-greylist
Greylisting 自体は、Postfix や sendmail の機能として持っている訳ではない。なので、連携させる別のソフトが必要になる。
で、代表的な Greylisting 用ソフトを比較してみる。
概要
Postgrey
- Perl で書かれている。
- Postfix SMTP アクセスポリシー委譲の仕組みを使ったもの。
- 故に Postfix 専用*1。
- Postfix の「smtpd_なんちゃら_restrictions」の中で呼び出す形になる。
- なので、Postfix の豊富なアクセス制御と組み合わせると、S25R や DNSBL に引っかかった時だけ Greylisting、ということが実現できる。
- Greylisting 中(一時エラーを返して、再送を待っている状態)のリストは BerkeleyDB で保持。
- 設定ファイルは特になく、起動時のコマンドラインで指定。
milter-greylist
- C で書かれている。
- sendmail 発祥の milter の仕組みを使っている。
- milter 自体は他の MTA でも使える(Postfix なら 2.3 以降)ので、原理的には MTA を選ばない。
- milter-greylist 用の設定ファイル(ディストリビューション用のパッケージでインストールすると、たぶん、/etc/mail/greylist.conf)の中で、Greylisting する場合の条件を記述できる。
- Greylisting 用のプログラムなのに、DNSBL や SPF を使っていきなり拒否、とかできてしまう。
- Greylisting 中のリストはオンメモリで保持。更新されたタイミングなどで、テキストファイルで出力。
- 起動時にそれを読み直すことで、起動前の状態を復元する。
主なパラメータ
再送禁止期間
最初に届いてから、一時エラーで拒否し続ける期間。立て続けに送ってくるケースをブロックする。
パラメータ名 | 単位 | デフォルト値 | |
---|---|---|---|
Postfix | delay | 秒 | --delay=300(5 分) |
milter-greylist | delay | 秒、分、時、日、週 | delay 45m(45 分) |
Greylist 保持期間
最初に届いて Greylist にエントリを追加し、その後、再送がない場合に Greylist のエントリを破棄するまでの期間。
パラメータ名 | 単位 | デフォルト値 | |
---|---|---|---|
Postfix | retry-window | 時、日 | --retry-window=2(2 日) |
milter-greylist | timeout | 秒、分、時、日、週 | timeout 5d(5 日) |
許可情報保持期間
Greylisting 後の再送により許可された場合、同一条件のメールが届かなくなってから、許可状態が取り消されるまでの期間。
パラメータ名 | 単位 | デフォルト値 | |
---|---|---|---|
Postfix | max-age | 日 | --max-age=35(35 日) |
milter-greylist | autowhite | 秒、分、時、日、週 | autowhite 3d(3 日) |
自動ホワイトリストの違い
milter-greylist の場合、Greylisting されたものが再送によって許可されたものを自動ホワイトリストと呼んでいる。
それに対し、Postgrey の場合は、同一条件(IP アドレス、送受信者のメールアドレス)のメールが、一定回数、繰り返して成功した場合、以降、送受信者のメールアドレスを無視して、IP アドレスだけで許可するようになる。この「IP アドレスだけで許可する」ものを自動ホワイトリストと呼ぶ。自動ホワイトリスト入りするための成功回数は「--auto-whitelist-clients」で指定する。デフォルトは5回。
milter-greylist でも Postgrey の自動ホワイトリストのような、「IP アドレスだけで許可」は可能だが*2、Postgrey のように「何回成功したら」ということはなく、再送成功後は必ず IP アドレスのみで許可されることになる。
IP アドレスの評価の違い
ISP のような大規模なメールサーバを持っている場合、再送時に必ず同じ IP アドレスから送信してくるとは限らない。そのため、実際にはまっとうな再送処理なのに、別のメールと判断され、再び一時エラーを返してしまう。
Postgrey ではデフォルトで、Class C 相当のネットワークアドレス(24 bit)が一致すれば、同一の送信元として扱う*3。但し、DNS の逆引きで得られた FQDN に IP アドレスの下位 16 bit を表す数字が含まれている場合は、IP アドレス全体が一致している必要がある。
milter-greylist の場合、デフォルトでは IP アドレス全体が一致している必要があるが、subnetmatch を指定することで、任意のビット長のネットワークアドレスで評価することができる。
個人的見解
すでに Postfix で「smtpd_なんちゃら_restrictions」でいろんな制限を設けている場合だと、Postgrey が導入しやすいと思う。基本的には「smtpd_なんちゃら_restrictions」で使えるものがひとつ増えた感じで設定できる。
Postfix 以外の MTA の場合、そもそも、Postgrey はスコープ外だが、Postfix でも、「smtpd_なんちゃら_restrictions」に詳しくなければ、milter-greylist の方が機能は豊富。milter-greylist の設定ファイル中で、様々なルールを記述できるので、これ一つでカバー出来る範囲が広い。
ただ、Postfix と milter-greylist の間、というか、Milter プログラム全般に言えるんだけど、あまり相性は良くない*4。ので、Postfix と組み合わせるのなら、間に Milter Manager( http://milter-manager.sourceforge.net/index.html.ja )を挟んだ方が良さそう。
... で、実践編じゃなくて、比較編になっちゃった(^^;。どっちもドキュメントが豊富とは言えず、結局、ソースを見ないと分からないことがいくつか...。ソースを見るのだと、Postgrey は Perl スクリプト一本なので、情報は見つけやすい。でも、「FQDN に IP アドレスの下位 16 bit が含まれると」というのは、本当にソースを見るまで分からなかった。
*1:一応、exim からも使えるらしい。exim との互換性のための --exim というオプションがある。
*2:lazyaw を指定
*3:--lookup-by-host を指定すると、IP アドレスが一致していることが必要になる。
*4:milter-greylist の場合、動作はするんだけど、ログの出力結果でちょっと問題。Postfix が、SMTP の MAIL FROM が許可された段階でキュー ID を割り当てるので、milter-greylist に渡ってきたときにはキュー ID が不明になる。そのため、後でログを解析しようとすると、IP アドレスや送受信者のアドレスを組み合わせて、同一メールに対する処理なのかを判断してやる必要がある。sendmail の場合はキュー ID が渡ってくるので、キュー ID で結びつけてやれば良い。