keepalived で smtp の負荷分散をする場合 ident に気を付けろ

手元の閉じた環境にメールの配信を行うSMTPのMTAがいる。このMTAを冗長化することになった。ふつうDNSでうまいことちらすんだろうけどこの環境では一個のIPアドレスの下に複数台ぶら下げるしかないという縛りがある。LinuxLVSを使おう。keepalivedなら慣れてるからこれにしようとおもってささっと構築してみたらハマった。

WEB上では、keepalived で http(80) を分散する設定を行っている事例はたくさんあり、http(80) を smtp(25) に変えればよかろうとポートだけ変えて作ってみたのだけど、smtp の connect に 5 秒ほど待たされる。何故待つ。 tcpdump で拾ってみると、ident(113) の通信を行おうとしている。

smtp の実装によっては、connect するとき smtp(25) 以外に、ident/auth(113) の通信が行われる。keepalived とかで DR 環境で smtp(25) のために仮想IPを振ると、この ident が通らずにタイムアウトまで待たされることがある。

この環境では MTA が sendmail であり、ident の timeout が 5sec であった。sendmail.cf 内の #O Timeout.ident=5s のコメントをはずし、O Timeout.ident=0 とした。ident を待つなという指定。これで変に待たされることはなくなった。

なんかすっきりしないけれども、まあこれでいいか。