Postfix でメールの宛先をもとにフィルタする方法

テスト環境にて、誤ってメールを送信してしまう場合に備え、予め設定した宛先以外にはPostfixがメールを送信しないようにする方法。
但し、テスト環境におけるメールの送信は、他ホストのSMTPを利用せず、自身で動作しているPostfixから送信する前提。

【環境】
CentOS 6/postfix-2.6.6-8.el6.x86_64
CentOS 7/postfix-2.10.1-6.el7.x86_64


/etc/postfix/main.cf にて、ヘッダーのチェックを有効化する。

#header_checks = regexp:/etc/postfix/header_checks
 ↓
header_checks = regexp:/etc/postfix/header_checks


/etc/postfix/header_checks を開いて、正規表現でルールを記載する。

例)全て拒否

/^To: .*/ REJECT


$ mail root のようなローカル配送も失敗する。
 →エラーログ:reject: header To: root from local;
但し、その後、失敗した旨を通知するメールはroot宛等に送信される。


例)OK にマッチしたアドレスなら送信、マッチしない場合は全て拒否

/^To: hoge@myhostname.domain/ OK
/^To: .*/ REJECT


例)特定アドレスと特定ドメインへは送信を許可、マッチしなければ全て拒否

/^To: hoge@myhostname.domain/ OK
/^To: .*@test.domain/ OK
/^To: .*/ REJECT


サービス再起動

CentOS 6
# /etc/init.d/postfix restart

CentOS 7
# systemctl restart postfix


メールを送信して、許可されていない宛先だった場合には、メールログに送信を拒否した旨が記録される。

reject: header To: 

追記(2018/2/20)

/^To: hoge/ OK

のように指定した OK は、DUNNO の別名。
これは後方互換性のため残されている設定値。
他の設定値は、man や以下の日本語ドキュメントを参照。

参考;
Postfix manual - header_checks(5)


注意しなければいけないのが、DUNNO/OK の動作。
DUNNO/OK は、「このテーブルに検索キーが見つからなかったように見せ、次の入力行を検査する」との事。

つまり、このアクションが行われた後、そこで以降のルールをチェックしない訳ではない。

ハマりやすいのは、以下のような定義をした場合。

/@test.domain/ OK
/./ REJECT

To か From かヘッダを記載していないので、たとえ To が OK にマッチしても、From など他のヘッダに対しても検査が行われるので、それが最後のREJECTに引っかかりREJECTされてしまう。