いやあ、まあ、今時?な話なんで、こんなところに書いてもあんまり参考になりませんが、俺の備忘録代わりに。
もうずっと(サーバは乗り換えつつも基本的な環境は変更せず)動いてるシステムがあって、そのメールサーバが、tcpserver(ucspi-tcp)+qmail という形で構築されている。
今回、このメールサーバを某プロバイダのロードバランサー(以降 LB)の下に移動することになった。
MX にロードバランサーの IP を指定して、外部からのメールは LB の 25番ポートに届くんで、それをネットワーク内部にいるメールサーバの 25番に振り分ける・・・っていう運用ね。
これが上手くいかないの(^^;
/etc/tcp.smtp には LB の IP も登録し、実際、/var/log/messages を見ると、LB からメールサーバの 25番ポートには接続に来ている。
実際、メールサーバ側の /usr/local/bin/tcpserver も起動するしね。
しかし、送り元に 220 コード(正常に接続できたという意味のコードNo)は返ってこない。
$ telnet smtp.exsample.co.jp 25Trying 202.XXX.XXX.116...Connected to smtp.exsample.co.jp.Escape character is '^]'.Connection closed by foreign host.
と切れちゃう。
正常に接続できれば、
$ telnet smtp.exsample.co.jp 25Trying 202.XXX.XXX.116...Connected to smtp.exsample.co.jp.Escape character is '^]'.220 smtp.exsample.co.jp ESMTPQUIT221 smtp.exsample.co.jpConnection closed by foreign host.
と、こんな感じなんだけど。
なんじゃあ???
送った側の /var/log/maillog 見てみると、
Nov 22 16:02:12 smtp qmail: 1479798132.340284 delivery 1015263: deferral: Connected_to_202.XX.XX.116_but_connection_died._(#4.4.2)/
だって。
接続後数秒してから切れるので、タイムアウトくさい。tcpserver が答えを返さない?あるいは tcpserver が必要としている情報が LB から来ない?(直接インターネットから接続すると上手くいくので、LB 独自の何か・・・なんだろうけど)
結論から言うと、tcpserver が TCPREMOTEINFO を取得しようとするが、LB からは取得できず待ちにはいっちゃって、LB側がセッションを切ってる感じかな?
LB 側のセッション切れた後も、しばらく tcpserver は起動しているからそういうこと?
結局、tcpserver の起動オプションに「接続元ホストから $TCPREMOTEINFO を取得しない」という意味の R をつければよかった。
/usr/local/bin/tcpserver -v -u ~(以下略)↓/usr/local/bin/tcpserver -vR -u ~(以下略)
という感じ。
これで、問題なく LB 経由で内部のメールサーバにメールが届くようになった。