原因は、サブネット内部への、宛先ポートを TCP/133 とするパケットを遮断していたせいでした。qmail(に限らず MTA 一般の話?)は SMTP EHLO コマンドを受信すると、接続元のホストに対して IDENT プロトコルで接続を試みます。待たされていたのは、このパケットをファイアウォールで遮断していたため、タイムアウト待ちになるのが原因でした。
ルータ の iptables に次のように仕込むことで解決。
$IPTABLES -A out-in -p tcp --dport 113 -j REJECT --reject-with tcp-reset
out-in チェインは、FORWARD チェインから、SRC が外部ネットワークで DEST がサブネット内部の場合に飛ぶ先です。flatten に書くならこんな感じ?
iptables -A FORWARD -i $ETH_OUTER -p tcp --dport 113 -j REJECT --reject-with tcp-reset
$ETH_OUTER はルータの外側 NIC。eth0 なり eth1 なり……
この問題が示す現象としては、次のようなものがあります。
- MUA で該当サーバを SMTP サーバとしてメールを送信すると、接続開始時になんか待たされる
- 該当サーバにログインして mail コマンド等で送信すると問題ない
- DNS はサーバ・クライアントの正引き・逆引きどれも問題なし
- telnet example.com 25 すると、初回の EHLO だけ待たされる
- サーバとクライアントの間にファイアウォールがあって、パケットフィルタリングをしている
- 遅いときはこんな反応をする
Connected to mail.example.com. Escape character is '^]'. EHLO client.subnet.example.com (この行を入力して Enter すると待たされる) 220 mail.example.com ESMTP 250-mail.example.com 250-PIPELINING 250 8BITMIME
- 問題ないときは、こんな反応をする
Connected to mail.example.com. Escape character is '^]'. 220 mail.example.com ESMTP (入力より先にまずこの行が返ってくる) EHLO client.subnet.example.com (この行を入力するとすぐ次の行が返る) 250-mail.example.com 250-PIPELINING 250 8BITMIME
詳しくはここを参照。http://unixluser.org/techmemo/ident/
今回の件とはあまり関係ないけれど、このへんも参考になります。http://i.loveruby.net/diary.1/200201.html#d02_1