
次のようなシナリオがあります:
- Postfix サーバー M (メールを保存)
- Postfix サーバー A (インターネット接続 IA を使用してメールを中継)
- Postfix サーバー B (インターネット接続 IB を使用してメールを中継)
- 内部 DNS サーバー (ローカルの名前解決を行う)
サーバー M、A、B は同じネットワーク LAN 内に存在するため、IA と IB のインターネット接続が切断されても、M & A と M & B 間の通信が必ずしも切断されるわけではありません。そのため、Postfix の smtp_fallback_relay オプションをこの目的に使用できません。
ここで、サーバー M は、リレー時にインターネット接続を持つサーバーにのみ送信する必要があります。
これを最も効果的に行うにはどうすればよいでしょうか?
私たちが試したこと
私の同僚と私は 2 つの選択肢を共有しました (網羅的ではありません):
- メールストア(M)の認識でリレーメールを「LAN」からオフラインにして、フォールバックリレーにフォールバックするスクリプトを作成します。
- DNS サーバー (D) (または M の etc ホスト、どちらでもかまいませんが、M にとって必須の DNS) にスクリプトを作成し、mail-relay.ourdomain.com を変更して、TTL が十分に小さい (たとえば 5 秒) インターネット アクセスを持つサーバー メール リレー A または B を指すようにします。
これらのオプションは両方ともほとんどの場合機能しますが、必要なのは、なぜ機能しないのか(どちらかを使用すると危険があるか)ということです。
答え1
どちらのアプローチでも問題はレースコンディションつまり、インターネットは機能しており、A または B は配信が成功したことを相手に通知しましたが、A または B がそれをインターネットに転送しようとしたときに接続が切断されました。
上記のシナリオは、電子メールが Postfix 内でどのように流れるかによって可能になりました。
Email from client ---> Received ---> Queued -> Sent
サーバー A の Postfix は、電子メールがキューに入れられたときに、電子メールが A によって受け入れられたことを M に確認送信します。そのため、Postfix がインターネットに電子メールを送信しようとすると、接続が切断され、接続が回復するまで電子メールがキューに入れられる可能性があります。
注意: この動作は一般的なMTAでは予想されたものです。SMTPは保存して転送するプロトコル。