Postfix 3.6

4 min read読了の目安(約3900字

4/29 に Postfix 3.6 がリリースされたので、その変更点などを。

3.5 と 3.6 のパラメータの差分はこちら

デュアルライセンス

今まで IBM Public License 1.0 というライセンスだったんだけど、それに加えて Eclipse Public License 2.0 も追加された。
(実は 3.3 からだった)

whitelist / blacklist が allowlist / denylist に変更

最近流行りの言葉狩り的なアレ。

postscreen のパラメータ名とログメッセージが変更された。

パラメータ名の変更:

  • postscreen_whitelist_interfacespostscreen_allowlist_interfaces
  • postscreen_blacklist_actionpostscreen_denylist_action
  • postscreen_dnsbl_whitelist_thresholdpostscreen_dnsbl_allowlist_threshold

互換のため、新しいパラメータのデフォルト値は古いパラメータの値を見るようになってる。
こんな感じ:

postscreen_allowlist_interfaces=${postscreen_whitelist_interfaces?{$postscreen_whitelist_interfaces}:{static:all}}

ログの方は、respectful_logging=no を設定するとログには今まで通り WHITELIST / BLACKLIST で出力される。

内部プロトコル変更

内部プロトコルが変更になったらしい。なのでバージョンアップ前にちゃんと postfix stop しておく必要があるとのこと。

あ、postfix_daemon が動かなくなるな…。まあいいや、そのうち直そう。

TLS まわり

OpenSSL の最低バージョンが 1.1.1 になった。
OpenSSL 1.1.1 は 2023-09-11 に EOL だけど、Postfix 3.6 は 2025 までサポートする予定なので、必要になったらアップデートするらしい。

lmtp_tls_fingerprint_digest, smtp_tls_fingerprint_digest, smtpd_tls_fingerprint_digest のデフォルト値が md5 から sha256 に変更になった。

tlsproxy_tls_dh512_param_file は無効になった。指定しても無視される。

tlstype.pl スクリプト追加。collate.pl スクリプトの出力を入力することでメッセージごとの TLS 情報を出力してくれるらしい。

compatibility_level が Postfix のバージョンになった

今まで compatibility_level0, 1, 2 だったんだけど、Postfix バージョン(3.6 とか 3.6.0 とか)になった。
と言ってもデフォルト値は 0 のままなので、主に compatibility_level を評価する側の表記の問題。

今までは main.cf 中で ${{$compatibility_level} < {1} ? {yes} : {no}} みたいに書いてたんだけど、<<= は単純な文字列比較らしく 3.9 よりも 3.10 が小さく評価されてしまうとのことで、<level, <=level という記述が導入された。
${{$compatibility_level} <level {3.6} ? {yes} : {no}} みたいに書く。

known_tcp_ports パラメータ

TCP ポートの指定に数字ではなく smtpsmtps みたいにサービス名で記述すると /etc/services ファイルを見てたんだけど、新設された Postfix パラメータの known_tcp_ports を参照するようになった。参照コストが高かったということなのかな…。
パラメータのデフォルト値は lmtp=24, smtp=25, smtps=submissions=465, submission=587
このパラメータに無いサービス名は今までどおり /etc/services ファイルを見る。

local_login_sender_maps パラメータ

sendmail コマンドや postdrop コマンドでメールを送る際、今まではどのユーザーでも任意のエンベロープ送信者アドレスを指定できたけんだけど、それを制限できるようになった。

このマップは UNIX ログイン名をキーとして、返される値が許されるパターン。

  • * は何でもOK
  • <>(empty_address_local_login_sender_maps_lookup_key の値) は空アドレス
  • @ドメイン名 はそのドメインであればOK
  • それ以外はメールアドレス

たとえば、

main.cf:
local_login_sender_maps = hash:login_senders
login_senders:
hoge  hoge@example.com @example.net
fuga  *
piyo  <>

みたいにすると、hoge ユーザーは hoge@example.com または examlpe.net ドメインのアドレス、fuga ユーザーは何でもOK、piyo ユーザーは空アドレスのみOK…という感じ。

デフォルトは static:* で、従来どおり誰でも何でも指定可能。

smtpd_relay_restrictionssmtpd_recipient_restrictions の評価順

3.5 までは smtpd_recipient_restrictionssmtpd_relay_restrictions の順に評価されていたのが、3.6 からは smtpd_relay_restrictionssmtpd_recipient_restrictions の順になった。

smtpd_relay_before_recipient_restrictions=no に設定すると 3.5 までと同じ順になる。

バウンスメールを元メールへの返信にできる

enable_threaded_bounces=yes を設定すると、バウンスメールのヘッダに ReferencesIn-Reply-To がついて、元メールの返信になるようにできる。デフォルトは no なのでヘッダはつかない。

smtpd_sasl_mechanism_filter パラメータ

リリースノートには smtpd_sasl_mechanism_list と書かれてるけど間違い。

SASLライブラリが返す mechanism の中で採用するもののフィルタ。マップはキーだけが有効で値は意味がない。

デフォルト値は !external, static:restexternal を除外してそれ以外を使用する。
マップの値は使われないので static:restrest は無意味。

配送エージェントのログ追加

local の mailbox_transport や smtp の best_mx_transport のように他の配送エージェントに転送する場合に次のようなログを吐くようになった。

postfix/smtp[pid]: queueid: passing <recipient> to transport=local

errno が 0 のときのログメッセージ

エラー時に errno が 0 の場合に Unknown error: 0 と出てたのを Application error と出るようになった。

DNS API 関数変更

DNS API として res_XXXX() 関数の代わりに res_nXXXX() 関数を使用するようになった。

以前と同じようにビルドするには CCARGS=-DNO_RES_NCALLS を指定する。