Linuxから特定の相手にメールが送れない2008年05月13日 09時13分

社内ユーザーから、とある企業にだけメールが送れないことがあると問い合わせを受けた。「メールが送れないことがある」というのが実に不可解。逆に言えばたまには送れていると言うことだし。

とりあえず自社メールサーバー(Fedora Core6)から送ってみると確かに送れない。メールサーバ(Postfix)のログを見ると「Connection timed out (port 25)」と残っておりタイムアウトしているようだ。

実験1 Gmailから送ってみる。

社内から送れないので外部のサーバーから送信してみる。結果、問題なく送れる。ということは自社だけの問題か。

実験2 自社メールサーバーから相手のメールサーバーにTELNETコマンドで接続してみる。

普通は「TELNET (相手のIP) 25」とコマンドで打てば即座に応答が帰ってくるが、この企業のメールサーバーからは「Trying (相手のIP)...」と出たまま応答が帰ってこない。

実験3 社内LANからTELNETで接続してみる。

ファイアウォールで社内LANからのSMTPを許可し、WindowsパソコンからTELNETで接続してみたら問題なく接続された。

今度はテスト機にFedora6をインストールし、デフォルトの設定のままTELNETで接続してみた。すると問題なくつながった。

以上の実験の結果から、自社メールサーバーの特有の設定が影響しているのは間違いなさそうだ。しかもTELNETで接続できないということはPostfixの設定ではなく、OSの設定だろう。一番怪しいのは「iptables」か。

試しにiptablesのデーモンを止めてみた。・・・症状変わらず。ただ一つ思い出した。最初にサーバーを立ち上げた際にセキュリティを強化するためにスクリプトを動かしたことを。そのスクリプトの中身を見てみるとiptables以外にも色々設定していた。試しにこのスクリプトをクリーンインストールしたFedora6で動かしてみたところ、それ以降その企業のメールサーバーに接続できなくなった。ということで問題はこの中にありそうだ。

スクリプトを少しずつ編集しては再起動を繰り返し、ようやく原因特定。「/etc/sysctl.conf」というカーネルのパラメータを設定するファイルに「net.ipv4.tcp_ecn = 1」という記述があり、これが起因しているようだ。ネットで調べてみたところ、このパラメータがオン(1)になっていると、通信経路中に古いルーターなど対応できない機器が存在したときに通信エラーになるらしい。結構有名なことらしいが、ここまでたどり着くのが大変だった・・・。

「net.ipv4.tcp_ecn」の値をオフ(0)にして「sysctl -p」を実行したらこの企業のメールサーバーと通信できるようになった。

ecnとはExplicit Congestion Notificationの略らしい。目的は大雑把に言えば回線の混雑状況を制御することらしい。なぜこの設定をオンにしたのかは今となっては不明。でも解決してよかった。