Postfix設定メモ
日本語のマニュアルは Ver.2 の頃から更新されておらず、信用できない。
ABC順に並べられても分からん。
結局何がどれだけ必要なのか?
main.cf の所のみ
なにはともあれ
compatibility_level
これはバージョン変更で設定の解釈が変わった時でも、どのバージョンとして解釈するかを決定するもの。
Postfix 3.6 より前は「設定のバージョン」(よって、最新は compatibility_level = 2)だったが、
Postfix 3.6 からは「Postfixのバージョン」となった。
よって、最新は compatibility_level = 3.6
バージョン比較用の演算子も定義されたので、式の値として使うことができるようになった。
code:main.cf
#% compatibility_level = 0 compatibility_level = 3.6
readme_directory
説明を見ても、どう使うのか、どう使われるのかがまったく分からない。
どうやら、この変数を使って、エラーメッセージにドキュメント位置を書いたりするものらしい。
Debian のインストーラを使った時には、自動的に no が設定された。(これも正しいのか怪しい)
デフォルトでは postfix のマニュアルのあるディレクトリ(/usr/share/doc/postfix)が設定されていた。(ビルドによって異なる)
インストーラ側のデフォルトで no と書くくらいだから、おそらくまったく無意味なのだろう。
code:main.cf
#% readme_directory = /usr/share/doc/postfix readme_directory = no
inet_protocols
どのプロトコルを使うか(IPv4, IPv6)
本来は master.cf の方に書くべきなのだと思うが、master.cf はポートのみの設定で、
それ以外が main.cf に書かれている。
普通はデフォルトの all のままでいいだろう。(後はipv4かipv6のどちらかを書く。)
code:main.cf
inet_interfaces
どのネットワークインターフェースを使うか(正確にはどのアドレスにバインドするか)
all ならいわゆる 0.0.0.0, ::0 にバインドされる。
普通はデフォルトの all のままでいいだろう。
code:main.cf
myhostname
自ホスト名
このホスト名を使ってメールのドメイン名等が決定される。
ホスト名が FQDN になってるなら、デフォルトのままでいいはず。
code:main.cf
#% myhostname = $(hostname) mydomain
ホスト名のドメイン名部分。
ホスト名が FQDN になってるなら、デフォルトのままでいいはず。
mydestination とかで使われている。
myorigin
デフォルトで $myhostname になっている。
送信元ドメインとして使われる。
ホスト名が FQDN になってるなら、デフォルトのままでいいはず。
関連: append_at_myorigin
Debian のパッケージでは以下のように設定されている。
code:main.cf
myorigin = /etc/mailname
mynetworks_style
mynetworks を自動的に設定させるもの。
mynetworks を書くなら mynetworks_style は書かない。
table:mynetworks_style
host 自分自身だけを mynetwokrs とする。(3.0以降のデフォルト)
subnet 自分が所属するサブネットを mynetworks とする。
class 自分のインターフェースのクラス範囲(class A とか B とか)でのサブネットを mynetworks とする。
code:main.cf
#% mynetworks_style = host mynetworks
単純に LAN とかサブネットのことだと思うと正しくない。
実際には「信頼できるネットワーク範囲」を指す。
IPv6は角括弧で括る必要がある。[::1]/64 など。
スペース区切りでよい。
自分自身だけで良いならこれを書かずに mynetwork_style = host と書く。
左(先頭)から右(終端)の順に適用される。
頭に ! を付けると除外になる。
/path/to/file 形式ならそのファイルが読み込まれる。
type:table 形式のリストも受け付ける。
code:main.cf
smtpd_use_tls は古いのでもう使わない。smtpd_tls_security_level を使う。
smtpd_tls_security_level
相手の TLS 利用の必要性の設定
may で、相手が TLS を使わないことを許可する。
code:main.cf
#% smtpd_tls_security_level = smtpd_tls_security_level = may
smtpd_tls_mandatory_protocols
TLSの必須プロトコルの指定
TLSv1.1 以下を禁止する。
code:main.cf
#% smtpd_tls_mandatory_protocols = >=TLSv1 smtpd_tls_mandatory_protocols = >=TLSv1.2
TLS のプロトコルの指定
TLSv1.1 以下を禁止する。
code:main.cf
#% smtpd_tls_protocols = >=TLSv1 smtpd_tls_protocols = >=TLSv1.2
smtpd_tls_cert_file
SMTP受信時に使われる証明書の指定
smtpd_tls_key_file
SMTP受信時に使われる証明書の秘密鍵の指定
code:main.cf
smtpd_tls_cert_file=/etc/letsencrypt/live/mx.example.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mx.example.com/privkey.pem
smtpd_tls_session_cache_database
TLSのセッション情報をキャッシュする。
同じ所と何度も接続する時に効果が出てくるはず。
ただ、spam で食い潰されそうな気がする。
code:main.cf
#% smtpd_tls_session_cache_database = smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_tls_session_cache_database
smtpd_client_restrictions
接続情報に対する制約
code:main.cf
#% smtpd_client_restrictions = smtpd_client_restrictions =
permit_mynetworks
check_client_access cidr:/etc/postfix/check_client_access.cidr
reject_rbl_client all.rbl.jp
reject_rbl_client bl.spamcop.net
reject_rbl_client zen.spamhaus.org
permit
check_client_access を先に定義することで、他の設定に関係なく認可する。
client では cidr 方式で弾く。
reject_rbl_client で、rbl を使って spam を弾く。
smtpd_banner
SMTP受信時に出力されるバナー
普通はデフォルトのままで良いはず。
デフォルトだと
220 ホスト名 ESMTP Postfix
spammer 対策で情報を削るのであれば $mail_name を潰すくらい。
(他は必須情報になってるので書かなければならない。)
code:main.cf
#% smtpd_banner = $myhostname ESMTP $mail_name smtpd_banner = $myhostname ESMTP unknown
smtpd_helo_required
HELO, EHLO コマンドを必須にする。
spammer は HELO, EHLO を送ってこないことがあるので、必須にすることで除外する。
現代の MTA では、EHLO で正しくネゴシエーションすべきである。
code:main.cf
#% smtpd_helo_required = no smtpd_helo_required = yes
disable_vrfy_command
VRFY コマンドを禁止する。
spammer によりユーザーアカウントの有無を調べられないようにする。
code:main.cf
#% disable_vrfy_command = no disable_vrfy_command = yes
smtpd_helo_restrictions
HELO/EHLO コマンド内容に対する制約
code:main.cf
smtpd_helo_restrictions =
permit_mynetworks,
reject_unknown_hostname,
reject_non_fqdn_hostname,
reject_invalid_hostname
smtpd_etrn_restrictions ETRN コマンド内容に対する制約
smtpd_sender_restrictions FROM コマンド内容に対する制約
smtpd_recipient_restrictions RCPT TO コマンド内容に対する制約
smtpd_data_restrictions DATA コマンド実行可否に対する制約
smtpd_end_of_data_restrictions DATA コマンドのデータ転送完了時に行う制約
アドレス書き換え
主に送信側
append_at_myorigin
アドレスに@ドメイン名が付いていない時に、自分のドメイン名($myorigin)を追加する。
デフォルトで yes
これはデフォルトのままでいいだろう。
append_dot_mydomain
送信者アドレスに自動的に .$mydomain を追加する。
なぜかデフォルトで yes になってる。
小さな親切大きなお世話である。
コンソールでアドレスを手打ちしている時代の名残りでは?
code:main.cf
#% append_at_myorigin = yes append_dot_mydomain = no
主に受信側
recipient_delimiter
受信者の名前をこのデリミタ以降を削除して判定する。
たとえば recipient_delimiter = + とした場合、foo+bar@exmaple.com は foo@example.com として判定される。
これにより、ユーザーは任意のサブアドレスを作ることができる。
code:main.cf
recipient_delimiter = +
VERP は全部デフォルトでいいはずなので、特に何もかかない。
virtual 関連はここには書かない。
配送
配送先の判別
transport_maps
type:table 形式の値を受け取る。
普通は /etc/postfix/transport に定義を書いて postmap で hash ファイルにする。
code:main.cf
# transport_maps = hash:/etc/postfix/transport
PostfixAdmin で MySQL と連携している場合
code:main.cf
transport_maps = proxy:mysql:/etc/postfix/sql/mysql_transport_maps.cf
mydestination
自分のホスト宛と判定するドメインの一覧
ホスト名が FQDN で設定されているなら、まずデフォルトのままでいいはず。
code:main.cf
#% mydestination = $myhostname, localhost.$mydomain, localhost ローカル配送
ローカル配送は、以下の順で評価される。
aliases
.forward ファイル
mailbox_transport_maps
mailbox_transport
mailbox_command_maps
mailbox_command
home_mailbox
mail_spool_directory
fallback_transport_maps
fallback_transport
luser_relay
デフォルトでは、alias_map と mail_spool_directory のみ値がある。
transport は配送方法の変更
command は実行するコマンド
fallback は該当ユーザーにマッチしなかった場合のもの
luser_relay はいわゆる catch all で、マッチしなかったすべての対処を書く。
エイリアス
alias_maps
nis が含まれているので除外する。
code:main.cf
#% alias_maps = hash:/etc/aliases, nis:mail.aliases alias_maps = hash:/etc/aliases
alias_database
ツール(newaliases, sendmail -bi)が変換対象とするもの。
デフォルトのままで構わないが alias_maps と同じであるべきなので忘れないように書いておく。
code:main.cf
#% alias_database = hash:/etc/aliases alias_database = hash:/etc/aliases
newaliases_path
newaliases コマンドのパス (sendmail -bi で使われるはず)
デフォルトのままで構わない
code:main.cf
#% newaliases_path = /usr/bin/newaliases home_mailbox
ローカル配送のメールの置き場で、ホームディレクトリからの相対パスを指定する場合。
Maildir 方式にする場合は、Maildir/ と書く。~/Maildir/ が Maildir 方式になる。
空なら評価されない。
code:main.cf
home_mailbox = Maildir/
mail_spool_directory
ローカル配送のメールの置き場
home_mailbox が設定されているなら、こちらの方が優先度が低いため無視される。
デフォルトのままでいいだろう。
少なくとも Debian では /var/spool/mail は /var/mail のシンボリックリンクになっているので、/var/mail でよい。
code:main.cf
#% mail_spool_directory = /var/mail biff
メール到着時に biff コマンドを使って通知をするかどうか。
コンソールを使っている人なら yes にする価値があるのかもしれない。
code:main.cf
biff = no
リレー配送
受け取ったメールを(基本的に)同じ envelop のままで別のMTUに送信するのがリレー。
MUAからMTAにSMTP(submission)を使ってメールを送信して、そのメールが別のMTAにSMTPで送信されるのは、実は「リレー」である。
分散したMTAからどこかのPOP,IMAPサーバーにまとめたい場合(LMTPを使う方が合理的)
何らかの都合で代理のMXになっている場合。
smtpd_relay_restrictions
リレーに対する制約
昔は誰でもリレーさせることができるのがデフォルトだったが、今は mynetworks か SASL で認証された場合だけリレーさせるのデフォルトになった。
リレーで何か特別なことをしない限りは、特に設定は要らないだろう。
code:main.cf
#% smtpd_relay_restrictions = ${{$compatibility_level} <level {1} ? {} : {permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination}} relayhost
自ホストから直接外部のメールサーバーに接続できないような場合(OP25B)
バーチャルドメイン
virtual_maps
virtual_alias_maps = $virtual_maps
virtual_alias_domains = $virtual_alias_maps
SMTP送信
smtp_use_tls は古いのでもう使わない。smtp_tls_security_level を使う。
smtp_tls_security_level
相手の TLS 利用の必要性の設定
may で、相手が TLS を使わないことを許可する。
code:main.cf
#% smtp_tls_security_level = smtp_tls_security_level = may
smtp_tls_mandatory_protocols
TLSの必須プロトコルの指定
TLSv1.1 以下を禁止する。
code:main.cf
#% smtp_tls_mandatory_protocols = >=TLSv1 smtp_tls_mandatory_protocols = >=TLSv1.2
TLS のプロトコルの指定
TLSv1.1 以下を禁止する。
code:main.cf
#% smtp_tls_protocols = >=TLSv1 smtp_tls_protocols = >=TLSv1.2
smtp_tls_session_cache_database
SMTP送信時のTLSのセッション情報をキャッシュする。
同じ所と何度も接続する時に効果が出てくるはず。
code:main.cf
#% smtp_tls_session_cache_database = smtp_tls_session_cache_database = btree:${data_directory}/smtp_tls_session_cache_database
関連