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 の動作を確認していきたいと思います。

 

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」テーブルについても順次まとめていきます。

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

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

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

コメントを残す

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