中継メールサーバーの高可用性・負荷分散に対応する - Postfix Advent Calendar 2014 - ダメ出し Blog

2014-12-17(Wed) [postfix][ha] [更新履歴]

Postfix Advent Calendar 2014 の 17日目の記事です。 安定の 4日遅れです。毎度すみません。

今回は、メールの中継処理の高可用性・負荷分散を実現するため、 複数の中継メールサーバーを用意し、それに対応するための Postfix とその周辺の設定方法について解説します。

筆が乗らず、後半は説明が雑になっています。すみません。 おいおい改善します。

構成

要件

ユーザー名@example.jp をホストするメールサイトであると仮定します。

example.jp ドメインの DNS MX RR は中継用の SMTP サーバー (Postfix でも何でも構いません) relay1.example.jprelay2.example.jp を指しており、 インターネットから来るメールはこれを経由して LAN 内の Postfix SMTP サーバーである mail.example.jp に配送するものとします。

LAN 内の MUA は Postfix SMTP サーバー mail.example.jp を送信用 SMTP サーバーとして利用しており、 インターネット宛のメールは relay1.example.jprelay2.example.jp を経由して配送するものとします。

ネットワーク構成

{インターネット}
       |
   [ルーター]
       |
-------+------------+--------------------+------------- DMZ
       |            |10.0.0.1            |10.0.0.2      10.0.0.0/24
   [ルーター]  [relay1.example.jp]  [relay2.example.jp]
       |
--+----+----------------+------+----------------------- LAN
  |192.168.0.1          |      |                        192.168.0.0/24
[mail.example.jp]     [MUA]  [MUA]  ...

mail.example.jp の Postfix 設定

main.cf の設定内容です。 現段階では、relayhost パラメーターで中継メールサーバー relay1.example.jp だけを利用する設定になっています。

## mail.example.jp:/etc/postfix/main.cf
myhostname = mail.example.jp
myorigin = $mydomain
mynetworks =
        127.0.0.1 [::1]
        192.168.0.0/24

parent_domain_matches_subdomains =

mydestination = $mydomain
relay_domains =
relayhost = [relay1.example.jp]

## Postfix 2.10 向けの設定
## Postfix 2.9 以前は代わりに smtpd_recipient_restrictions を使用すること
smtpd_relay_restrictions =
        permit_mynetworks
        reject_unauth_destination

relay1, relay2.example.jp の Postfix 設定

本題ではありませんが、参考までに、中継メールサーバーを Postfix にした場合の main.cf の設定例を載せておきます。

## relay1.example.jp:/etc/postfix/main.cf
myhostname = relay1.example.jp
myorigin = $mydomain
mynetworks =
        127.0.0.1 [::1]
        192.168.0.1

parent_domain_matches_subdomains =

mydestination =
relay_domains = example.jp

## Postfix 2.10 向けの設定
## Postfix 2.9 以前は代わりに smtpd_recipient_restrictions を使用すること
smtpd_relay_restrictions =
        permit_mynetworks
        reject_unauth_destination
        reject_unverified_recipient

myhostname 以外は relay1.example.jprelay2.example.jp で共通です。 1台でも2台でもそれ以上でも、設定内容に変わりはありません。

DNS RR の設定

example.jp.             IN MX   10 relay1.example.jp.
example.jp.             IN MX   20 relay2.example.jp.

relay1.example.jp.      IN A    10.0.0.1
relay2.example.jp.      IN A    10.0.0.2

mail.example.jp.        IN A    192.168.0.1

Postfix smtp(8) の配送先 (next-hop) の指定方法

Postfix の smtp(8) が利用する配送先の中継メールサーバーを指定する方法や条件はいくつかありますが、 代表的なものが relayhost パラメーターです。 その値には、中継メールサーバーを一つだけ指定できます。

relayhost = [relay1.example.jp]

実は古の Postfix 1.X 以前は、中継先を複数指定することができました。 成功するまで順番にメール配送を試みるため、 このような設定だけで中継メールサーバーの冗長化に対応できました。

## Postfix 1.X 以前にのみ許される記述なので注意!!!!
relayhost = [relay1.example.jp] [relay2.example.jp]

relayhost の値に指定できる形式は次の 3形式があります。 いずれも一つしか指定できません。

FIXME: CNAME も見るんだっけ?

複数の中継メールサーバーによる中継の高可用性

既存の MX RR を利用する場合

既存の example.jp の MX RR を利用できるなら、main.cfrelayhost を次のように書き換えるだけで済みます。

relayhost = example.jp

別に MX RR を用意して利用する場合

既存の MX RR ではなく、中継メールサーバー用の MX RR を別途用意する方法もあります。 例えば relay.example.jp という名前の MX RR を追加します。

relay.example.jp.       IN MX   10 relay1.example.jp.
relay.example.jp.       IN MX   20 relay2.example.jp.

main.cfrelayhost を次のように書き換えて、relay.example.jp を利用するようにします。

relayhost = relay.example.jp

複数の中継メールサーバーによる中継の負荷分散

Postfix の機能で負荷分散する場合

同一優先度の MX RR を複数用意すれば、Postfix がランダムな順番で配送試行してくれます。

relay.example.jp.       IN MX   10 relay1.example.jp.
relay.example.jp.       IN MX   10 relay2.example.jp.

main.cfrelayhost を次のように書き換えて、relay.example.jp を利用するようにします。

relayhost = relay.example.jp

DNS キャッシュサーバーの機能で負荷分散する場合

DNS キャッシュサーバーから得た返答節の同一優先度の MX をランダムに選択するかどうかは、smtp_randomize_addresses の設定値に依存します。デフォルト値は yes です。

これを no に設定することで、DNS キャッシュサーバーの応答の順番通りに配送試行するようになります。

smtp_randomize_addresses = no

DNS キャッシュサーバーが返答節をラウンドロビンする機能を持っている場合や、 外部要因による応答節の並び換え機能を持っている場合、 それを利用することができるようになります。


ところで、12月25日はクリスマスな上に、 OSS 界隈で地味に活躍されているふみやすさんの誕生日ですね!
http://www.amazon.co.jp/registry/wishlist/27M7TV8CEEF6G?sort=priority

逆に、あなたの書いた OSS や Blog や Advent Calendar が気に入ったら何か送りたく なってしまうかもしれないので、プロフィールや Web サイトに あなたの Amazon 欲しいものリストの URL を貼っておいてくださいね!


私が勤める OSSTech っていう某弊社で社員募集しているようです。 人材紹介会社を介さなければ、入社後に 20万円のボーナス! 「ふみやすっていう人に紹介された」と言ってもらえると私にもボーナス!! → https://www.osstech.co.jp/recruit/


よろしければ、これまで参加した/参加予定のほかの Advent Calendar もどうぞ。