Postfixでメールを2つのサーバにリレーする
目次
ここで説明すること
前提
example.jpドメインで利用するメールシステムがあります。
インターネットから届いたメールを、メールリレーサーバを経由して、メールボックスに格納します。
ただし、メールボックスが2つあるような状況を想定します。
各サーバのMTAは、Postfixを使用します。
サーバ | ホスト名 |
---|---|
メール中継サーバ | relay.example.jp |
メールボックスサーバ1 | mail01.example.jp |
メールボックスサーバ2 | mail02.example.jp |
目的
このページで目指すのは以下の2つです。
- インターネットから届いたメール全てを、2つのメールボックスサーバにリレーしたい(同じメールを2つのサーバに配送したい)
- インターネットから届いた特定ドメインからのメールだけを、2つのメールボックスサーバにリレーしたい(同じメールを2つのサーバに配送したい)
要はメールを2重配送したい、と言うことです。
制約条件
ただし、以下の様な制約条件とします。
- 2つのメールボックスサーバに、それぞれユーザが作成されており、それぞれのユーザのメールボックスに配送します。
実装方法
インターネットから届いたメール全てを、2つのメールボックスサーバにリレーしたい場合
この場合は比較的簡単です。
メールボックスサーバ1へは通常通りリレーし、メールボックスサーバ2へはBCCを追加することで配送します。
BCCを追加するためには以下のオプションを使います。
recipient_bcc_maps
- http://www.postfix.org/postconf.5.html#recipient_bcc_maps
- Toのアドレスに対する付与するBCCアドレスのテーブルを指定します
transport_maps
- http://www.postfix.org/postconf.5.html#transport_maps
- Toのアドレスに対する配送先のサーバのテーブルを指定します
recipient_bcc_maps
recipient_bcc_maps
を使うためには、Toに対するBCCアドレスのテーブルを作成する必要があります。
以下の様な内容で/etc/postfix/recipient_bcc.regexp
ファイルを作成します。
/(.*)@example.jp/ ${1}@mail02.example.jp
これにより、example.jp宛のメールを受信したら、ローカルパート(ユーザ名)の部分を元に生成したmail02.example.jpのメールアドレスをBCCに付与するようになります。
なお、通常1対1でテーブルを作成する場合はrecipient_bcc.regexp
ではなく、recipient_bcc
ファイルを作成しpostmap
コマンドでハッシュ化しますが、今回は正規表現を用いるためハッシュ化は行いません。
transport_maps
transport_maps
を使うためには、Toに対する配送先メールサーバのテーブルを作成する必要があります。
以下の様な内容で/etc/postfix/transport
ファイルを作成します。
example.jp smtp:[mail01.example.jp] mail02.exmaple.jp smtp:[mail02.example.jp]
作成したファイルは以下の様にハッシュ化することで、/etc/postfix/transport.db
ファイルが作成されます。
postmap /etc/postfix/transport
上で作成したtransport
ファイルの意味するところは
- exmaple.jp宛のメールはメールボックスサーバ1に配送する
- mail02.example.jp宛のメールはメールボックスサーバ2に配送する
です。
recipient_bcc.regexp
ファイルに指定したとおり、example.jp宛のメールにはmail02.example.jpのメールアドレスがBCCとして付与されますので、これで2つのメールボックスサーバに配送することが出来ます。
main.cf
recipient_bcc.regexp
とtransport
が用意できたところで、最終的に/etc/postfix/main.cf
には以下の様に記載します。
transport_maps = hash:/etc/postfix/transport recipient_bcc_maps = regexp:/etc/postfix/recipient_bcc.regexp
これで完了です。
ちなみにrelayhostを指定すれば、example.jpやmail02.example.jpにマッチしない様なデフォルトの配送先も指定できます。
インターネットから届いた特定ドメインからのメールだけを、2つのメールボックスサーバにリレーしたい場合
通常のメールはメールボックスサーバ1にメールを配送し、特定ドメインからのメールはメールボックスサーバ1とメールボックスサーバ2に配送します。
この場合は私の中では簡単な案が見つからず、力業で実装する形になりました。
Postfixを3インスタンス作成し、特定ドメインからのメールと、それ以外のドメインからのメールで処理するインスタンスを分ける形です。
通常Postfixは複数起動が出来ませんが、複数インスタンスを起動するためのモードがあります。
複数インスタンスの起動については、以下のページが参考になります。
特定ドメインは、ここではexample.co.jpを想定しますが、複数のドメインでも対応出来ます。
postmulti
メインのインスタンスと追加のインスタンス2つの計3インスタンスを動作させますが、追加のインスタンスには名前を付ける必要があるので、今回はstep1、step2と命名します。
以下の様にコマンドを実行します。
postmulti -e init postmulti -I postfix-step1 -e create postmulti -I postfix-step2 -e create
initで/etc/postfix/main.cf
に複数インスタンスを動作させるための記述が追加されます。
createをすると、/etc/postfix-step1
のようなディレクトリが作成され、追加のインスタンスの設定ファイルがその中に格納されます。
postmulti
実行後の設定ファイルは以下の様な記述が追加されます。
/etc/postfix/main.cf
multi_instance_wrapper = ${command_directory}/postmulti -p -- multi_instance_enable = yes multi_instance_directories = /etc/postfix-step1 /etc/postfix-step2
/etc/postfix-step1/main.cf
master_service_disable = inet multi_instance_name = postfix-step1 multi_instance_enable = yes
今回作成した3つのインスタンスの役割分担です。
インスタンス | 用途 | Listen IPアドレスとポート |
---|---|---|
メインインスタンス | example.jp宛は、step1へリレー | 0.0.0.0:25 |
step1インスタンス | example.jp宛を受信 特定ドメインからのメールは、step2へリレー |
127.0.0.1:10025 |
step2インスタンス | example.jp宛&特定ドメインからのメールを受信 特定ドメインからのメールを処理 |
127.0.0.1:20025 |
メインインスタンス
メインインスタンスでは、example.jp宛のメールをstep1インスタンスにリレーします。
直接メインインスタンスで処理しない理由は、通常メールリレーサーバは内部からインターネット宛のメールも処理するからです。
メインインスタンスでは、インターネット宛のメールを外部へ配送するのが主目的となりますので、もしその役割が不要であればメインインスタンスと追加インスタンス1つでも事足りるでしょう。
example.jp宛のメールをstep1にリレーするためには、上でも利用したtransport_maps
を使います。
/etc/postfix/transport
ファイルを以下の内容で作成します。
example.jp smtp:[127.0.0.1]:10025
同様にpostmap
コマンドでハッシュ化します。
postmap /etc/postfix/transport
/etc/postfix/main.cf
に、transport_maps
を記述します。
また、example.jp宛を別のインスタンスにリレーできるよう、relay_domains
も設定します。
postmluti
コマンドで追加されたものを含めると、以下の様な内容となります。
multi_instance_wrapper = ${command_directory}/postmulti -p -- multi_instance_enable = yes multi_instance_directories = /etc/postfix-step1 /etc/postfix-step2 relay_domains = example.jp transport_maps = hash:/etc/postfix/transport
step1インスタンス
step1インスタンスでは、example.jp宛のメールを処理しますが、そのうち特定ドメインからのメールはstep2インスタンスにリレーします。
特定ドメイン宛のメールでは無い場合は、そのままメールボックスサーバ1に配送します。
また、25番ポートは既にメインインスタンスで使われているため、10025番ポートで待ち受けるよう変更します。
ポート番号変更には、/etc/postfix-step1/master.cf
を以下の様に修正します。
※smtpから始まる行はコメントアウト、10025から始まる行を追記
#smtp inet n - n - - smtpd 10025 inet n - n - - smtpd
ドメインによってメールの配送先を変えるためには、以下のオプションを使います。
sender_dependent_relayhost_maps
- http://www.postfix.org/postconf.5.html#sender_dependent_relayhost_maps
- 送信元によって
relayhost
の設定を上書きます
sender_dependent_relayhost_maps
を使うために、送信元ドメインに対する配送先メールサーバのテーブルを作成する必要があります。
以下の様な内容で/etc/postfix-step1/sender_dependent_relayhostファイルを作成します。
@example.co.jp [127.0.0.1]:20025
このファイルは、postmap
コマンドでハッシュ化する必要があります。
postmap /etc/postfix-step1/sender_dependent_relayhost
このファイルの意味するところは
- 特定ドメインexample.co.jpからのメールは、step2インスタンスに配送する
です。
/etc/postfix-step1/main.cf
には、デフォルトの配送先の指定と、上記のsender_dependent_relayhost
の設定を追加します。
またTCP/IPの待ち受けが出来るように、master_service_disable
から始まる行をコメントアウトします。
postmulti
コマンドで追加されたものを含めると、以下の様な内容になります。
#master_service_disable = inet multi_instance_name = postfix-step1 multi_instance_enable = yes relayhost = [mail01.example.jp] sender_dependent_relayhost_maps = hash:/etc/postfix-step1/sender_dependent_relayhost
step2インスタンス
step2インスタンスでは、example.jp宛で特定ドメインからのメールを処理します。
この条件に一致するメールは、メールボックスサーバ1とメールボックスサーバ2に配送します。
step1同様に、/etc/postfix-step2/master.cf
を編集し、20025番ポートで待ち受けるように修正をします。
#smtp inet n - n - - smtpd 20025 inet n - n - - smtpd
全てのメールを2つのメールボックスサーバに配送するのと同様に、recipient_bcc_maps
とtransport_maps
の2つを使います。
/etc/postfix-step2/recipient_bcc.regexp
は、以下の様な内容となります。
/(.*)@example.jp/ ${1}@mail02.example.jp
/etc/postfix-step2/transport
は、以下の様な内容となります。
example.jp smtp:[mail01.example.jp] mail02.exmaple.jp smtp:[mail02.example.jp]
こちらは、postmap
コマンドでハッシュ化が必要です。
postmap /etc/postfix-step2/transport
/etc/postfix-step2/main.cf
には、上記の2つ、recipient_bcc_maps
、transport_maps
の設定を追加します。
step1と同様に、TCP/IPの待ち受けが出来るように、master_service_disable
から始まる行をコメントアウトします。
postmulti
コマンドで追加されたものを含めると、以下の様な内容になります。
#master_service_disable = inet multi_instance_name = postfix-step2 multi_instance_enable = yes recipient_bcc_maps = regexp:/etc/postfix-step2/recipient_bcc.regexp transport_maps = hash:/etc/postfix-step2/transport
このように3インスタンスで、それぞれ処理するメールを分けることで、ドメインが異なっても複数のメールボックスサーバに配送が出来るようになります。
最近のコメント