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

迷惑メール対策のためにSPFを導入したのはよいが、迷惑メールの送り主がなんしかドメインをもってたら防ぎようはない。

むしろSPF passになってしまう分厄介である。まぁそこはSPFの守備範囲ではないのでどうにもならんわな。

そんなわけで信頼できない送信元からのメールは受け取らないようにしたいが、はてどうしたものか。


世の中には送信元が信頼に値するかということを集めたデータベースがある。

RBLとか呼ばれているものだ。RBL.JPだとかSpamhausだとかが有名だ。迷惑メールを送信してきたIPアドレスを集めたものだ。

さて、ところがこれには大きな問題がある。このデータベースの内容をそのまま使うと真っ当な送信者も巻き込まれることがある。

可変IPでその周りのIPもまとめて指定してしまったり、同じIPアドレスを共有してる真っ当なメールサーバーがあることも考えられる。

そうなると本来は迷惑メールでないものも拒否してしまう恐れがある。

それを防ぐためにマークをつけるだけつけて、判断はユーザーに任せるという方法も考えられるがちょっとめんどくさい。

あと当たり前だけどRBLに登録されてない送信者からのものは防げないので、効果も薄いかも知れない。


そこでいろいろ探していたらおもしろい方法をみつけた。

スパム対策技術 S25R (Gabacho-Net)

送信者のIPアドレスを逆引きし、逆引きできないときやエンドユーザーのIPアドレスと疑われるものは、

受け取らず、再送するように450という応答コードを使って知らせる。

ここでスパムは間髪入れずに再送してくるか諦めるが、普通のメールサーバーはしばらく間を開けて再送してくる。

さて、ここでS25Rを導入したメールサーバーの管理者は、ログを解析し、ここで再送するように知らせた記録を調べる。

ここで再送時の挙動などからここで信用できるか判断しホワイトリストに入れる。これにより迷惑メールでないものに対処する。

というやり方らしい。うまく設定できれば迷惑メールのほとんどをはじける。ただ、ホワイトリストを作るのがめんどくさいのは確か。


ここでホワイトリストを再送時の挙動から自動生成するという方法が考えられる。

実はそういう考えがもとからあったそうだ。

一旦再送するように指示し、しばらく開けて再送されてきたものは受信するというものである。

S25Rの逆引きできないときやエンドユーザーに対する対応をGraylistingで行うというRgrayという方法もあるそう。

Rgrey – S25R + greylisting (Kozupon.com)

これならほとんど迷惑メール以外への害はなさそうだ。

これはよさそうだなと思いながら、この記事を読んでいたら、おもしろい方法を発見した。


Starpitでほぼ誤検出無く98%のスパムを排除 (S25R+tarpittingによるスパム対策) (モーグルとカバとパウダーの日記)

非常に簡単な方法で、逆引きできないときやエンドユーザーからの送信と疑われるときは、85秒ぐらい待ってもらうだけ。

RFCではタイムアウトは5分だと決められてるから、普通のメールサーバーは85秒待たせたところでほとんど問題は無い。

しかし、迷惑メールを送ってくるやつは大概いらちらしく、85秒も待たせると大概それまでに切断してくる。

そんなんで効果あるんかい、とつっこみたくもなる方法だが、なんとこれだけで93%の迷惑メールを排除できたようだ。

LibserverのPostfixは2.3なので、設定をちょっと書き加えるだけでよい。

簡単で、誤検出は気にしなくてよいレベルで、効果もかなり高いというのだから、やってみることにした。


まずwarn_clientとtarpit_clientというファイルを用意する。

/^unknown$/                                     WARN
/^[^.]*[0-9][^0-9.]+[0-9].*\./                  WARN
/^[^.]*[0-9]{5}/                                WARN
/^([^.]+\.)?[0-9][^.]*\.[^.]+\..+\.[a-z]/       WARN
/^[^.]*[0-9]\.[^.]*[0-9]-[0-9]/                 WARN
/^[^.]*[0-9]\.[^.]*[0-9]\.[^.]+\..+\./          WARN
/^(dhcp|dialup|ppp|[achrsvx]?dsl)[^.]*[0-9]/    WARN
/^unknown$/                                     sleep 85
/^[^.]*[0-9][^0-9.]+[0-9].*\./                  sleep 85
/^[^.]*[0-9]{5}/                                sleep 85
/^([^.]+\.)?[0-9][^.]*\.[^.]+\..+\.[a-z]/       sleep 85
/^[^.]*[0-9]\.[^.]*[0-9]-[0-9]/                 sleep 85
/^[^.]*[0-9]\.[^.]*[0-9]\.[^.]+\..+\./          sleep 85
/^(dhcp|dialup|ppp|[achrsvx]?dsl)[^.]*[0-9]/    sleep 85

これを用意したら、main.cfには少し書き足すだけだ。

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

非常に簡単だ。ここでwarn_clientを用意しているのは、待たせたことをログに残すためだ。

ログを見てみると、かなりひっかかっていることがわかる。いかにも迷惑メールらしいが。


さて、この設定が終わった後に届いた迷惑メールを調べてみると、かつて使ってた転送メールからのがほとんどだった。

こればかりはしゃあないよね。直接受信でなければなかなか害の少ない対策はできない。

もうほとんどこの転送メールからのメールは受け取らないので、この転送メールを削除するとかしてもよい気はするが、

新しいメールアドレスに変えて高々1年半しか経っていない。未だに旧メールアドレスしか知らない人も多い。

そうなるとなかなか消すのははばかられる。

直接受信の迷惑メールも少しあるものの、この対策により数は十分少なくなった。

元々Thunderbirdを立ち上げていれば迷惑メールフィルタではじかれていたけど、転送メールの分を隔離すれば、

例えThunderbirdを立ち上げていなくても直接受信分だけならそんなに数はないので、重要なメールが埋もれるほどではなさそうだ。

Webメールから使う時には便利になりそうだ。


この転送メールからの分を隔離した話はまた後日書こうと思う。

しかし、真っ当な送信者に害のない迷惑メール対策というのはなかなか難しい。

特に自分自身、自宅にメールサーバーを設置しているということもあり、非常に疑われやすいことをしていると自覚している。

そんな適当に設定した自宅に設置されたメールサーバーからでもきちんと受信できる程度の迷惑メール対策に留めたいと思っている。

まぁさすがに最低限オープンリレー対策がなされているというのが前提ですが。(参考 : SPAMメールでないかはっきりさせるSMTP-AUTH)

そんな方針にはよくあった方法かなと思っている。もちろん効果もそれなりだが、それで十分ですわ。