JailホストのPostfixがJailゲストのPostfixに接続できなかった話
2015/09/07
検証できたので、多少マシな対処方法を追記しました。
2015/09/06
Jailホストの Postfix が JailゲストのSMTPへ接続できなかった際のメモ書きです。
最初の構成認識
3つのシステムがあり、ここから配信するメールはすべて192.168.1.40のSMTPサーバへリレーされます。この192.168.1.40サーバは社内の上位SMTPサーバへの接続が許可されているリレー用のサーバになります。
各システム、SMTPサーバのMTAには Postfix 2.11.6 を利用しています。
3つのシステムの設定ファイル main.cf には「relayhost = 192.168.1.40」が記述された状態です。
この構成下において、何故かシステムAのSMTPサーバ接続で、Postfixが「warning:relay configuration problrm」と言って接続ができませんでした。システムB,システムCは問題なく接続できています。
実際の構成
よくよく考えると、実際には3システムとSMTPサーバは1台の筐体に集約していたことを思い出します。
FreeBSDのJailで集約していました。
システムAがJailホスト、その他がJailゲストとなっています。そして、Jailゲスト間であれば接続できているのに、JailホストとJailゲスト間の接続ができていない状況です。
そして、この構成を整理したところで、ようやくPostfixが気を利かせた結果じゃないかと思い当たります。
Jailホストで、Jailゲストに適用するIPアドレスのエリアスを定義しています。
この例だと、Jailホスト ( システムA ) のIPアドレスは 192.168.1.10 ですが、そのほかに 192.168.1.20,192.168.1.30,192.168.1.40 の3つのIPアドレスもJailホストのIPアドレスになります。
Postfixが、「あれ?main.cf に書いた relayhost = 192.168.1.40 だけどさ、これ自分自身のIPアドレスじゃん。間違ってるよ!」と教えてくれている状態なのです。
愚かな対処方法
Postfixさんへ、この気を利かせる対応を止めてもらう設定があるかどうか調査する時間がなかったので、とっても愚かな方法なのかもしれませんが、こんな対処で逃げました。
たまたま別の目的で物理的にサーバ (192.168.1.50)が1台稼働していたので、急遽Postfixを導入し、システムAのためだけのSMTPサーバになってもらいました。
システムAの main.cf で「relayhost = 192.168.1.50」を定義し、192.168.1.50のホストの main.cf で「relayhost = 192.168.1.40」を定義。完全な迂回の為だけのサーバです。
この構成でメールの転送ができている事を確認し、待たせていた人達と晩御飯を食べに行くことができました。
追記:もう少しマシな対処方法
192.168.1.50のサーバをなくすことができたのでその説明。
Jailホスト
Jailホスト 192.168.1.10 の main.cf で、“inet_interfaces = 192.168.1.10” を定義します。
もし外部からの接続を制限するなら、“inet_interfaces = localhost” を定義します。localhost がループバックアドレスでない環境なら代わりに 127.0.0.1 を定義しましょう。
inet_interfaces = 192.168.1.10 relayhost = [192.168.1.40]
デフォルトだと、“inet_interfaces = localhost, 192.168.1.10, 192.168.1.20, 192.168.1.30, 192.168.1.40 ” が指定されています。
inet_interfaces パラメタで明示する事で relayhost = 192.168.1.40 の定義に警告が出なくなります。要は、inet_interfaces パラメタから Jailゲストに指定するアドレスを外せばいいんです。
Jailゲスト
Jailゲスト 192.168.1.20, 192.168.1.30, 192.168.1.40 の場合は main.cf の inet_interfacesパラメタはデフォルトのままでいいです。
Jailゲストではローカルループバックが使えないので、Jailゲストに割り当てしたアドレスが inet_interfaces パラメタに指定した事になります。
ですので、Jailゲストで外部からの接続を制限したい場合、inet_interfaces パラメタではなく、mynetworks パラメタと smtpd_recipient_restrictions パラメタで対応します。
例えばJailゲスト 192.168.1.20 はこんな感じ。
smtpd_recipient_restrictions = permit_mynetworks mynetworks = 127.0.0.0/8 192.168.1.20
念のため指定のループバックアドレスと、アドレス 192.168.1.20 が接続を受け付けるアドレスの宣言です。つまり自分自身ですね。
ゲートウエイSMTPサーバとなる Jailゲスト 192.168.1.40 に接続制限をかける場合は、他のJailゲスト、Jailホストに接続を許す必要があるのでこんな感じ。
smtpd_recipient_restrictions = permit_mynetworks mynetworks = 127.0.0.0/8 192.168.1.10 192.168.1.20 192.168.1.30 192.168.1.40
Jailホストと自分も含めたJailゲストの接続を受け付ける宣言です。
main.cf を書き換えたら、
# service postfix restart
を実行してください。reload だと有効になりません。
これで 192.168.1.50 のサーバが不要になりました。