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

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【3/22開催】テックブログを書こう!アウトプットのススメ
1年で100本ブログを出した新米エンジニアがPV数が伸びなくてもTech Blogを書き続ける理由とは?
https://tech-lab.connpass.com/event/312805/

【4/18開催】VSCode Dev Containersで楽々開発環境構築祭り〜Python/Reactなどなど〜
Visual Studio Codeの拡張機能であるDev Containersを使ってReactとかPythonとかSpring Bootとかの開発環境をラクチンで構築する方法を紹介するイベントです。
https://tech-lab.connpass.com/event/311864/

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

 

アバター画像
About サイオステクノロジーの中の人 4 Articles
サイオステクノロジーで働く中の人です。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

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

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


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる