Postfix 3系で追加された lookup table を試してみた②

こんにちは。サイオステクノロジー 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」という書き換え結果が適用されます。

 

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です