こんにちは。サイオステクノロジー 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 の動作を確認していきたいと思います。
lookup table とは?
lookup table と言えば、アクセス制御やアドレス書き換え、コンテンツフィルタなどの為に、ルールを保存しておく database を指します。
Postfix では「database」と「lookup table」という語句を同じ意味で使用しているんですね。
(postmap コマンドで /etc/postfix/transport を hash 化、transport.db を作成して~のやつです。)
例えば以下の設定であれば、”table type が hash の lookup table 「/etc/postfix/transport.db」に、transport_maps に必要な配送ルールを記載する”
ということですね。
transport_maps = hash:/etc/postfix/transport
詳しくは コミュニティのドキュメントをご参照ください。
https://www.postfix.org/DATABASE_README.html#intro
Postfix 3系では、lookup table に新しく「inline」「randmap」「pipemap」「unionmap」が追加されました。
inline と randmap は、シンプルなルールを main.cf に直接定義するためのテーブル、
pipemap と unionmap は、複数の lookup table を定義するためのテーブルです。
今回は inline と randmap について動作を確認していきます。
因みに、使っている Postfix がどの lookup table をサポートしているかは postmap コマンドの “-m” で確認できます。
# postconf -m btree cidr environ fail hash inline internal memcache nis pipemap proxy randmap regexp socketmap static tcp texthash unionmap unix
inline
- main.cf に直接定義するための基本的なテーブル
- {} 囲みでルールを設定する
- 複数ルールを定義する場合、半角スペースかカンマ(,)で区切る
「特定ドメイン宛のメールのリレー先を 、IP アドレスで指定する」というケースを想定します。
従来の設定方法であれば、以下のように /etc/postfix/transport にルールを記載して、その table type (hash) と定義ファイル (/etc/postfix/transport) を 設定する必要がありました。
/etc/postfix/transport
transport.example.com smtp:[xxx.xxx.xxx.xxx] transport2.example.com smtp:[yyy.yyy.yyy.yyy]
# postmap /etc/postfix/transport
/etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
上記では「transport.example.com」宛のメールを IP「xxx.xxx.xxx.xxx」へ、「transport2.example.com」宛のメールを IP「yyy.yyy.yyy.yyy」へ配送するように設定している訳ですが、ルールを 1つか2つ程度定義するのに、main.cf とは別に /etc/postfix/transport を編集しないといけないのでは少々面倒です。
inline テーブルを使用して同じルールを定義すると以下のようになります。
/etc/postfix/main.cf
transport_maps = inline:{transport.example.com=smtp:[xxx.xxx.xxx.xxx], transport2.example.com=smtp:[yyy.yyy.yyy.yyy]}
これだけです。
postmap コマンドを使った .db ファイル作成も必要ありません (main.cf の再読み込みは必要ですが)。
randmap
- ランダムに選択されるルールを定義する
- inline 同様、main.cf に直接定義することが可能
- {} 囲みでルールを設定する
- 複数ルールを定義する場合、半角スペースかカンマ(,)で区切る
「メール送信時に使用する smtp サービスをランダムに選択する」というケースを想定します。
randamap テーブルを使用して定義すると以下のようになります。
①master.cf に smtp サービス「relay1」「relay2」「relay3」を定義
master.cf
relay1 unix - - n - - smtp -o smtp_helo_name=relay1.example.com -o syslog_name=relay1 relay2 unix - - n - - smtp -o smtp_helo_name=relay2.example.com -o syslog_name=relay2 relay3 unix - - n - - smtp -o smtp_helo_name=relay3.example.com -o syslog_name=relay3
②main.cf に sender_dependent_default_transport_maps を使って、relay1 ~ relay3 をリスト
main.cf
sender_dependent_default_transport_maps = randmap:{relay1:[xxx.xxx.xxx.xxx],relay2:[yyy.yyy.yyy.yyy],relay3:[zzz.zzz.zzz.zzz]}
※「sender_dependent_default_transport_maps 」は transport(5) ではなく、default_transport の構文に則る点に注意してください。
上記の設定で、smtp サービス「relay1」「relay2」「relay3」のいずれかをランダムに選択して、[xxx.xxx.xxx.xxx]、[yyy.yyy.yyy.yyy]、[zzz.zzz.zzz.zzz] 宛にリレーします。
(relay1 が選択されれば [xxx.xxx.xxx.xxx] へ、relay2 が選択されれば [yyy.yyy.yyy.yyy] へ…)
最後に
残りの 「pipemap」「unionmap」テーブルについても順次まとめていきます。