greeting pauseを使う

SMTPでメールをやりとりする場合のプロトコル

  1. 発信側から受信側へTCP/25で接続
  2. 受信側から発信側へOKを送信
  3. 発信側から受信側へEHLO(またはHELO)
  4. 受信側から発信側へOKを送信

というやりとりが行われます。手動でこれをやってみるとこんな感じ。

0 :# telnet localhost 25
1 :Trying 127.0.0.1...
2 :Connected to localhost.
3 :Escape character is '^]'.
4 :220 hoge.com ESMTP Sendmail 8.14.3/8.14.3; Fri, 9 Oct 2009 17:20:42 +0900 (JST)
5 :EHLO hogehoge
6 :250-smtp.example.com Hello localhost [127.0.0.1], pleased to meet you
7 :250-ENHANCEDSTATUSCODES
8 :250-PIPELINING
9 :250-8BITMIME
10:250-SIZE
11:250-DSN
12:250-ETRN
13:250-DELIVERBY
14:250 HELP
15:mail from:hoge@hoge.com
16:250 2.1.0 hoge@hoge.com... Sender ok

説明のために行数を入れてあります。まず接続(0行目)。220を返信(4行目)。EHLOで名乗り(5行目)。6〜14行目で250を返信。とここまできてから送信者情報とか、メール本文とかがやりとりできる状態になります。メールを発信する方は接続してから受信側が220を返してくれるまで最小でも5分間待つことになっています。RFC5321の4.5.3.2.1ですね。

これをちょっと大きな値にしてあげる。5秒とか10秒とか。スパムって単位時間あたりに大量にメールを送りたい人たちなので、ある程度接続を試みて220が帰ってこなかったら諦めるらしいですよ。

ということで設定してみました。

sendmail.mcを編集

sendmail.mcに以下を追加。

FEATURE(`greet_pause',`5000')dnl 5 seconds

これは5秒待つとき。ミリセカンドなんですね。
それでsendmail.cfをmakeして、/etc/mailへコピー。

$ make sendmail.cf
# cp sendmail.cf /etc/mail

例外を設定

とはいえ、内部からの接続とかローカルホストからの接続は迅速にお願いしたいところ。access_dbが有効になっていれば例外設定もできます。

sendmail.mcに

FEATURE(`access_db',`hash -T<TMPF> /etc/mail/access.db')dnl

を入れておいて、 /etc/mail/accessにこんなのを書く。

GreetPause: hoge.com 0 (ローカルドメイン)
GreetPause: 127.0.0.1 (localhost)

カッコは書いちゃだめですよ。でもってaccess.dbを作成。

# /usr/sbin/makemap hash /usr/mail/access.db < /etc/mail/access

効果を見てみる

最初から小さい数字だとおもしろくないので、50秒に設定してみる。ログをみるとこんな感じ。

Oct  9 16:55:59 hoge sendmail[22423]: [ID 801593 mail.info] n997tXoc022423: rejecting commands from fedsmta2.email.global.factiva.com [205.203.134.162] due to pre-greeting traffic after 26 seconds
Oct  9 16:55:59 hoge sendmail[22424]: [ID 801593 mail.info] n997tX6n022424: rejecting commands from fedsmta2.email.global.factiva.com [205.203.134.162] due to pre-greeting traffic after 26 seconds
Oct  9 16:56:17 hoge sendmail[22475]: [ID 801593 mail.info] n997tpIT022475: rejecting commands from fedsmta1.email.global.factiva.com [205.203.134.161] due to pre-greeting traffic after 25 seconds
Oct  9 16:59:37 hoge sendmail[23152]: [ID 801593 mail.info] n997xMQs023152: rejecting commands from [120.87.99.48] [120.87.99.48] due to pre-greeting traffic after 15 seconds
Oct  9 17:00:45 hoge sendmail[23418]: [ID 801593 mail.info] n9980K3e023418: rejecting commands from mxl144v222.mxlogic.net [208.65.144.222] due to pre-greeting traffic after 25 seconds

ごく一部ですが、25秒もまってる奴がいるのか。。5秒で効果あるかな。といっても30秒だとでかいような気がする。