最近、検索してみると、メールサーバ(Submission ポート)構築のトレンドは、Dovecot SASL + Postfix という組み合わせのようです。 Submission ポートは Postfix で待ち受けて、Postfix と Dovecot を UNIX ソケットでつないで、Postfix から Dovecot の認証情報を利用する設定です。 その設定でも問題ないのですが、最新の Dovecot は Submission ポートのサービスが実装されていますので、それを使う方がスッキリすると思います。ということで、さっそくやってみます。

なお、Dovecot 2.3.20、Postfix 3.7.3 を使用しています。

Postfix 側の設定

主題と少し逸れるので、簡単に書きます。

Postfix は SMTP (ポート 25)だけを開けるので、/etc/postfix/master.cf はデフォルト設定のままで、OK です。Submission ポートを LISTEN する設定になっている場合は、元に戻してください。

/etc/postfix/main.cf は通常通りの設定で OK ですが、Dovecot で受け取ったメールを Postfix で中継することになるので、 Dovecot を動かしているホストからの中継を許可します。小規模メールサーバではどちらも同一のホストだと思うので、通常は許可する設定になっていると思います。

既に動いているメールサーバをこの設定に変更したい時は、/etc/postfix/main.cf は放っておいて、/etc/postfix/master.cf だけデフォルト設定に戻せば OK です(要は ポート 587 を閉じる。/etc/postfix/main.cf に Submission ポートに関する設定が残っていても、どのみち無視されるので問題ないです)。

Postfix を再起動して設定を反映させましょう。

ポートの話が出たので、一つ。Dovecot SASL を使ってメールサーバを構築するブログ記事の多くで、ポート 465 を Submission ポートのように使っていますが、Submission ポートは 587 です。歴史的な経緯でまだ使えますが、現在ではポート 465 は非推奨です。

Dovecot 側の設定

/etc/dovecot/dovecot.conf を設定します。

# Protocols we want to be serving.
#protocols = imap pop3 lmtp submission
protocols = imap submission

IMAP と Submission サービスを有効にします。POP3 はお好みで。

/etc/dovecot/conf.d/10-ssl.conf を設定します。

# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/pki/dovecot/private/dovecot.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem

# Or migrate from old ssl-parameters.dat file with the command dovecot
# gives on startup when ssl_dh is unset.
#ssl_dh = </etc/dovecot/dh.pem
ssl_dh = </etc/ssl/dh2048.pem

# To disable non-EC DH, use:
#ssl_cipher_list = ALL:!DH:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@STRENGTH
ssl_cipher_list = PROFILE=SYSTEM
ssl_cipher_list = ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305

# Prefer the server's order of ciphers over client's.
#ssl_prefer_server_ciphers = no
ssl_prefer_server_ciphers = yes

# Dovecot also recognizes values ANY and LATEST. ANY matches with any protocol
# version, and LATEST matches with the latest version supported by library.
#ssl_min_protocol = TLSv1.2
ssl_min_protocol = TLSv1.2

通常の TLS の設定です。いつも通りなので、言及すべきことは特にありません。/etc/ssl/dh2048.pem は事前に作成しておいてください。

/etc/dovecot/conf.d/20-submission.conf は一カ所だけ設定が必要です。

# Host name for the relay server (required)
#submission_relay_host =
submission_relay_host = smtp.example.com

リレー先の SMTP サーバを指定します。小規模メールサーバの場合はおそらく Dovecot と同一ホストで動いている Postfix を指定すると思いますが、その場合でも、localhost のような書き方は避けた方が良いと思います。この部分は、メールヘッダ(Recieved:)に出てきます。

Dovecot を再起動して、設定を反映させましょう。

Dovecot で Submission サーバを構築する場合、/etc/dovecot/dovecot.conf/etc/dovecot/conf.d/20-submission.conf に 2行書くだけで済みます。Dovecot SASL を設定する場合に比較すると、かなり簡便に済みます。

それ以外の設定項目

他に情報が少ないので、/etc/dovecot/conf.d/20-submission.conf の各設定についてざっと紹介します。

submission_logout_format = in=%i out=%o
ログの出力フォーマットです。通常は変更する必要はないでしょう。
hostname = mail.example.com
HELO/EHLO コマンドに対して、Submission サーバが名乗るホスト名を指定します。デフォルトは動作中のシステムのホスト名です。
submission_max_mail_size =
submission_max_recipients =
メールの最大サイズ、最大宛先数を指定します。デフォルトは無制限ですが、リレー先の SMTP サーバによっても制限されます。
submission_client_workarounds = whitespace-before-path mailbox-for-path
Postfix の設定では broken_sasl_client に相当するもので、古いメールクライアントへの救済措置です。デフォルトは指定なしで、必要に応じて whitespace-before-pathmailbox-for-path をスペース区切りで指定します。
submission_relay_host = smtp.example.com

リレー先の SMTP サーバを指定します。必須の設定項目です。

submission_relay_port = 25
リレー先の SMTP サーバのポートを指定します。デフォルトは 25 です。
submission_relay_trusted = yes | no
リレー先の SMTP サーバに対して XCLIENT コマンドを送信するかどうかを指定します。デフォルトは no です。XCLIENT コマンドは Postfix の独自拡張です。何をするのかよくわかりませんでした。詳しい方、解説いただけると幸いです。
submission_relay_user =
submission_relay_master_user =
submission_relay_password =
リレー先の SMTP サーバで認証が必要な場合、ユーザ名とパスワードを指定します。私は試していないので、言及は避けます。
submission_relay_ssl = no | smtps | starttls
リレー先の SMTP サーバとの間の通信を暗号化するかどうかを指定します。同一のサーバ内や安全なネットワーク内で完結するならば、デフォルトの no のままで OK です。念のため書いておきますが、Submission サービスは StartTLS で暗号化されますのでご安心を。
submission_relay_ssl_verify = yes | no
リレー先の SMTP サーバの SSL 証明書の真正性を検証する場合は yesを指定します。
submission_relay_rawlog_dir = /var/log
リレー先の SMTP サーバとの通信内容を出力するディレクトリを指定します。デバッグ用です。
submission_backend_capabilities =
Dovecot は Message Submission BURL Extension(RFC4468)をサポートしています。Dovecot が Submission サービスを実装した大きな動機の一つで、目玉機能ではあるのですが、よくわかりません。

おわりに

Dovecot で Submission サーバを構築する事例を紹介しました。 Dovecot SASL を使う方法に比べると、Dovecot - Postfix 間のソケットを作らなくて済むので、簡単に設定できます。 ただ、新しすぎて情報が少ないですし、logwatch もまだログのフィルタが整備されておらず、毎日正常終了した送信ログが届きます。 全体としてはサーバの更生がスッキリするので、皆様もお試しください。