努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


documents:mail:mail-013

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で集約していました。

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 のサーバが不要になりました。

documents/mail/mail-013.txt · 最終更新: 2015/12/20 15:24 by k896951

ページ用ツール