再送を要求するGreylisting

前々から気になってたGreylistingをメールサーバーに導入してみた。

導入にあたってはいろいろ悩みもあったのだが、とりあえずやってみた。


Greylistingというのは、届いたE-mailに対して、一旦エラーを出して再送させることで、迷惑メールを排除しようという仕組みだ。

まともなメールサーバーならば450エラーを出せば何度か再送してくる。

Libserverでは再送を繰り返すのは最長1時間に設定してある。(粘るPostfixに水やりしてあげる )

標準だと5日間だけど、さすがにそれはReturn-Mailが届くまでにかかる時間が長すぎるということでだいぶと短くした。

それで、Greylistingでは、最初の送信から一定時間以上空けて再送してきた場合に限って受け取るようになっている。

一般的には5分以上間隔を空けたらということになっていることが多いのかな。

迷惑メールを送るシステムは再送せずに失敗とするものが多いということがGreylistingの前提となっている。


とはいえ、Greylistingの導入にあたっては悩みもあった。

というのも、一旦エラーを出して再送させるということは、最低5分の遅延が生じることになる。

そしてGreylistingは再送要求を出したメールサーバーの情報を持つ必要があるので、そのためのDBが肥大化するという話もあった。

特に遅延というのは大きなデメリットと思うのだけど、果たしてそれで本当に迷惑メールが減るのだろうか?

メリットに見合っていないのではないか? と、そういうことで悩んでいたのだ。


今回、導入した方法は、以前から導入していた Starpitの後段にGreylistingを付加したもので、taRgreyにあたるのかな。

taRgrey – S25R + tarpitting + greylisting (tarpit + greylist policy server)

これまでは、S25Rの条件で動的IPっぽいリモートホストに対して、一定時間の遅延をかけていた。

迷惑メールを送るサーバーの中にはRFCで定められてるタイムアウトの5分以前に切断してしまうものが多いということで、

一定時間の遅延をかければある程度迷惑メールを排除できると。副作用も少ないので導入しやすかった。

スパム送信者はいらちだから待たせれば諦める

この後にさらにGreylistingを行う。すなわち一旦450エラーを出して再送させるわけだ。

taRgreyについての説明を見ると、遅延とGreylistingを二重で使うことで迷惑メールの通過率が半分ぐらいになるようね。

遅延を通り抜けられた分にだけGreylistingをかけるので、DBへの負荷も多少軽減できるのかな?


どれぐらいの効果が見込めるのだろうかと思い、S25Rの条件にあてはまるE-mailがどれぐらい届いているのか調査した。

/^[^\.]*[0-9][^0-9\.]+[0-9]/                    PREPEND X-S25R: true

とか、S25RにあてはまるE-mailにタグを付けて、届いたメールを観察してみた。

その結果、迷惑メール以外でS25Rの条件に合うものはかなり少なく、遅延の影響が問題となるE-mailは少ないだろうと。

一方、迷惑メールだが、S25Rの条件に合うものも合わないものもある。

固定IPっぽいリモートホストとなるとお手上げだ。これはいちいちブラックリストに入れていかないといけない。

けど、一定、S25Rにひっかかるものがあるのは事実なのでやってみる価値はある、ということでGreylistingの導入に踏み切った。


まず、yumでpostgreyをインストールする。

そして、/etc/rc.d/init.d/postgrey をいじって、postfixとの接続方法を書き換える。

OPTIONS="--inet=10023"

それでpostfixのmain.cfに、

smtpd_restriction_classes = check_greylist
check_greylist = check_policy_service inet:127.0.0.1:10023

と書き加える。

全E-mailにGreylistingを適用する場合はsmtpd_recipient_restrictionsにcheck_policy_serviceを書けばよい。

postgrey自身もホワイトリストを持っていて、Greylisting単独でうまく使う方法もある。というかそっちの方が一般的だ。

ただ、今回はフィルタにひっかかったE-mailだけにGreylistingを適用するために、新しく check_greylist というクラスを作っている。

その上で、grey_clientとか作って、

/^[^\.]*[0-9][^0-9\.]+[0-9]/                    check_greylist

とかして、main.cfに、

smtpd_recipient_restrictions = ... ,
  check_client_access regexp:/etc/postfix/tarpit_client,
  check_client_access regexp:/etc/postfix/grey_client

と設定した。


それで効果はどんなもんなのという話だが、確かに迷惑メールは激減した。

ただ、Greylistingで弾けるようになった迷惑メールの大半はこれまでSPFで自動的に迷惑メールに分類できていたものだ。

SPFでも弾けなくて、Greylistingで新しく弾けるようになったE-mailはどれぐらいあるんだろ。

Greylistingの対象になったものの、Greylistingを通り抜けたE-mailもあるのも事実だし、そうなるとブラックリスト以外に対処法がないわな。

それとS25Rに引っかからないものは当然これまでと変わらない。

そこは根気よくブラックリストで埋めていくしかない。厳しい戦いだ。


そんなわけだから手応えが感じられたわけではないのだが、有効な方法ではあると思う。

遅延の問題など、そこそこデメリットはあるので、対象を絞り込んで、怪しいものに対して実行できるとよいだろう。