こんにちは。サイオステクノロジー OSS サポート担当 N です。
RHEL の 標準 MTA として同梱されている Postfix ですが、2019/05/07 に RHEL8 がリリースされたのに伴い、Postfix のバージョンも 2.10 系から 3.3 系へとリベースされました。
変更点や追加機能の概要は、リリースノートや、Pstfix コミュニティで公開されているアナウンスページなど (以下参照) を拝見していただくとして、
・Postfix feature overview
https://www.postfix.org/features.html
・Postfix stable release 3.0.0
https://www.postfix.org/announcements/postfix-3.0.0.html
Postfix 3系で追加された新しい lookup table の動作を確認していきたいと思います。
Postfix 3系では、lookup table に新しく「inline」「randmap」「pipemap」「unionmap」が追加されました。
inline と randmap は、シンプルなルールを main.cf に直接定義するためのテーブル、
pipemap と unionmap は、複数の lookup table を定義するためのテーブルです。
※前回 (inline と randmap) はこちらから
今回は unionmap と pipemap について動作を確認していきます。
unionmap
- 複数の lookup table 操作のサポート。
- クエリを複数の lookup table に送信して、結果を “,” 区切りでリストする
・unionmap を使用しない複数テーブルの指定例
unionmap を使わずとも、以前のバージョンで複数の lookup table を指定することは可能でした。
ただし、複数のテーブルファイルを検査し「最初に HIT したものを使用する」という動作でした。
条件に合致するレコードが複数あっても、最初にマッチした「user1 に書き換え」だけが実行されます。
※「virtual_alias_maps」を使用して特定のメールアドレスやドメイン名を書き換え、別の宛先へエイリアスさせます。
/etc/postfix/virtual1
virtual-user@RHEL8.example.com user1@RHEL8.example.com
/etc/postfix/virtual2
virtual-user@RHEL8.example.com user2@RHEL8.example.com
/etc/postfix/main.cf
virtual_alias_maps = hash:/etc/postfix/virtual1, /etc/postfix/virtual2
試しに、localhost から virtual-user 宛にメールを送信してみましょう。
# echo "virtual_alias_maps test" | mail -s "virtual_alias_maps test" virtual-user@RHEL8.example.com
maillog から確認すると、最初に HIT した条件 virtual1 によって、「user1 に書き換え」が実行されてますが、virtual2 は作用していません。
postfix/qmgr[6858]: 05D911129E39: from=<root@RHEL8.example.com>, size=484, nrcpt=1 (queue active) postfix/local[6874]: 05D911129E39: to=<user1@RHEL8.example.com>, orig_to=<virtual-user@RHEL8.example.com>, relay=local, delay=0.06, delays=0.05/0.02/0/0, dsn=2.0.0, status=sent (delivered to mailbox) postfix/qmgr[6858]: 05D911129E39: removed
・unionmap を使用した複数テーブルの指定例
unionmap では複数の lookup-table 全てにクエリを送信して、応答をカンマ繋ぎで連結させます。
“/etc/postfix/virtual1” と “/etc/postfix/virtual2” のテーブルからそれぞれ user1/2@RHEL8.example.com に書き換えるというレコードが HIT します。
つまり、内部的には「TO:virtual-user@RHEL8.example.com」から「TO:user1@RHEL8.example.com,user2@RHEL8.example.com」という書き換えが実行される訳です。
/etc/postfix/main.cf
virtual_alias_maps = unionmap:{hash:/etc/postfix/virtual1, hash:/etc/postfix/virtual2}
※/etc/postfix/virtual1 と /etc/postfix/virtual2 には変更なし
もう一度同じように、localhost から virtual-user 宛にメールを送信してみましょう。
# echo "unionmap test" | mail -s "unionmap test" virtual-user@RHEL8.example.com
virtual1 による「user1 に書き換え」、virtual2 による「user2 に書き換え」の両方が作用していることが確認できます。
postfix/qmgr[7042]: F292F1129E39: from=<root@RHEL8.example.com>, size=484, nrcpt=2 (queue active) postfix/local[7057]: F292F1129E39: to=<user1@RHEL8.example.com>, orig_to=<virtual-user@RHEL8.example.com>, relay=local, delay=0.08, delays=0.05/0.02/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox) postfix/local[7058]: F292F1129E39: to=<user2@RHEL8.example.com>, orig_to=<virtual-user@RHEL8.example.com>, relay=local, delay=0.08, delays=0.05/0.03/0/0, dsn=2.0.0, status=sent (delivered to mailbox) postfix/qmgr[7042]: F292F1129E39: removed
pipemap
- 複数の lookup table 操作のサポート
- クエリを最初のテーブルに渡し、その結果を次のテーブルに渡し、その結果を次のテーブルに渡し… 最後のテーブルが最終結果を生成する。
/etc/postfix/main.cf
virtual_alias_maps = pipemap:{hash:/etc/postfix/virtual1, hash:/etc/postfix/virtual2, hash:/etc/postfix/virtual3}
/etc/postfix/virtual1
virtual-user@RHEL8.example.com user1@RHEL8.example.com
/etc/postfix/virtual2
user1@RHEL8.example.com user2@RHEL8.example.com
/etc/postfix/virtual3
user2@RHEL8.example.com user3@RHEL8.example.com
unionmap では最初の lookup-table にクエリを送信して、その応答を次の lookup-table に渡します。
( パイプライン “|” でコマンドを繋げていくイメージ)
「virtual-user@RHEL8.example.com」という宛先に対し、virtual1 で「user1@RHEL8.example.com」へ書き換え、
「user1@RHEL8.example.com」という応答を、virtual2 で「user2@RHEL8.example.com」へ書き換え、
「user2@RHEL8.example.com」という応答を、virtual3 で「user3@RHEL8.example.com」へ書き換えます。
# echo "pipemap test" | mail -s "pipemap test" virtual-user@RHEL8.example.com
postfix/qmgr[15600]: 2A0BE11D92C1: from=<root@RHEL8.example.com>, size=462, nrcpt=1 (queue active) postfix/local[15607]: 2A0BE11D92C1: to=<user3@RHEL8.example.com>, orig_to=<virtual-user@RHEL8.example.com>, relay=local, delay=0.05, delays=0.04/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox) postfix/qmgr[15600]: 2A0BE11D92C1: removed
その結果、最終的には「TO:user3@RHEL8.example.com」という書き換え結果が適用されます。