🐕

docker-mailserverをさくっと立ち上げる(令和4年2月版)

2022/02/10に公開

はじめに

これまでG Suiteでメールアカウントの運用をしてきました。独自ドメインも使えるうえに無償だったのでとても重宝していましたが、無償利用も2022年5月で終わりそうな状況です(2022年2月時点)。

このご時世、うかつにメールサーバを自前で建てるのも大変そうだし、どこかによさそうなコンテナイメージはないものか探したところ、docker-mailserverが全部入り&お手軽でよさそうでした。

令和4年2月版として、ソースを漁りながら利用方法調査したので、まとめておきます。

docker-mailserver

これはなにもの?

メール送受信に必要なものがまるっと一式入った便利なイメージです。元はtvial/docker-mailserverという名前だったようです。

https://github.com/docker-mailserver/docker-mailserver

  • pros
    • さくっとpostfix, dovecotを立ち上げられる
    • fail2ban, DNSBLもオプションで有効化するだけで使える
      その他対応しているサービスは公式のIncluded Servicesを参照
    • DKIM, SSLも簡単に設定できる
    • dovecotなしてsmtpサーバのみでの稼働も可能
  • cons
    • 活発に更新されているので、ぐぐっても最新の情報が出てこないことがある

導入する構成

OP25Bで直接インターネットに向けてメール配信できないような環境を想定しています。家サーバ用ですね。もし直接配信できる素敵な環境にお住まいの方は、リレー周りの設定をスキップしてください。

項目
メールのドメイン名 mydomain.example.com
メールサーバ名 mailsv.mydomain.example.com
メールサーバのIPアドレス xxx.xxx.xxx.xxx
リレーサーバのホスト名 relaysv.isp.example.org

DNS周りの設定(MXレコードやメールサーバのAレコード)は、事前に済ませておいてください。家サーバを立てる個別の内容(ルータの設定やOS設定)は記載しません。

setup.sh使用時の注意

docker-mailserverの設定はsetup.shで実施します。docker-compose.ymlの以下を編集する場合、setup.shの修正も必要になるので注意してください。基本、いじらないほうがトラブルもなく楽だと思います。

  • サービス名(mailserver)
  • configを配置するボリューム(./docker-data/dms/config/:/tmp/docker-mailserver/)

コンテナイメージをアップデートする際は合わせてsetup.shもアップデートしましょう。

本文章の構成

導入編は設定が必須の項目と、必要に応じて行う項目に分けて記載しています。「導入編(設定が必須の項目)」→「導入編(必要に応じて行う項目)」の順番で設定していけばうまくいくように記載しています。

コンテナの起動は「導入編(設定が必須の項目)」と「導入編(必要に応じて行う項目)」が完了してから行ってください。

導入編(設定が必須の項目)

docker-mailserverモジュール取得

githubからdocker-compose.ymlとmailserver.envを取得します。取得方法は本家ドキュメントに従います。

DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master'
wget "${DMS_GITHUB_URL}/docker-compose.yml"
wget "${DMS_GITHUB_URL}/mailserver.env"
wget "${DMS_GITHUB_URL}/setup.sh"
chmod a+x ./setup.sh

永続化対象データディレクトリ設定(必要に応じて設定)

本設定は必須ではないのですが、他の設定に影響を与えるため、この節にて記載します。

メールデータなど永続化が必要なデータの置き場所を定義します。docker-compose.ymlのvolumesで定義しますが、特に変更の必要はありません。理由があって、データを置く場所を指定したい方は、設定を行ってください。

docker-compose.ymlでの初期値は以下の通りです。設定ファイルのボリュームを変更する場合、setup.shの定義も修正する必要があります。

種類 場所
メールデータ ./docker-data/dms/mail-data/
設定ファイル ./docker-data/dms/config/
ログ ./docker-data/dms/mail-logs/
状態管理(各サービス動作に必要な情報を格納) ./docker-data/dms/mail-state/

ホスト名・ドメイン名設定

docker-compose.ymlのhostnameとdomainnameでメールサーバのホスト名を設定します。

docker-compose.yml
services:
  mailserver:
    image: docker.io/mailserver/docker-mailserver:latest
    container_name: mailserver
    # If the FQDN for your mail-server is only two labels (eg: example.com),
    # you can assign this entirely to `hostname` and remove `domainname`.
    hostname: mailsv
    domainname: mydomain.example.com
    env_file: mailserver.env

リレーホストの設定

OP25Bにより直接メール配信が行えない場合はリレーホストの設定を行います。直接配信できる素敵な環境にお住まいの方は、本節をスキップしてください。

すべてのメールを単一のリレーホスト設定へ送る場合、設定はmailserver.envで行います。リレーホストはそのままAレコードを引いてほしいので、[]で囲います。

パラメータ 意味 設定値
DEFAULT_RELAY_HOST メール送信時のリレーホスト [relaysv.isp.example.org]

リレーホストでsasl認証が必要な場合、以下のパラメータも設定が必要です。

パラメータ 意味 設定値
RELAY_HOST DEFAULT_RELAY_HOSTと同じ値 relaysv.isp.example.org
RELAY_PORT リレー時に使用するポート番号 587
RELAY_USER リレーホストでの認証用ユーザ名 relayuser1
RELAY_PASSWORD リレーホストでの認証用パスワード relayPassWord

メールアドレスの追加

メールアドレスの追加を行います。「setup.sh email add メールアドレス パスワード」で登録します。

$ ./setup.sh email add user1@mydomain.example.com PassWord

作成したメールアドレスの一覧は「setup email list」で確認できます。

$ ./setup.sh email list
* user1@mydomain.example.com

POSTMASTERメールアドレス設定

POSTMASTERのメールアドレスを設定します。設定するドメインのroot宛(root@mydomain.example.com)に対してのaliasが本メールアドレスに設定されます。また、後述のdocker-mailserverアップデートチェックにて、通知メールの送り先が本アドレスになります。

mailserver.env
# empty => postmaster@domain.com
# => Specify the postmaster address
POSTMASTER_ADDRESS=postmasterのメールアドレス

ローカルからメール送信時のドメイン設定

docker-mailserverアップデートチェックでは、内部的にmailコマンドでメールが送信されます。この時の送信元メールアドレスは「root@ホスト名」となります。今回の例では「root@mailsv.mydomain.example.com」です。
このメールアドレスをメールのドメイン名にしておかないと、リレーサーバによってはメール送信がエラーとなることがあります。そのため、myoriginを設定することで、「root@ホスト名」ではなく「root@ドメイン名」となるようにします。

この設定はsetup.shやmailserver.envでは行えません。その他postfixの設定で記載していますが、コンテナ起動時にpostconfを実行する枠組みがあります。docker-data/dms/config/postfix-main.cfにmyoriginの設定を追加します。

docker-data/dms/config/postfix-main.cf
myorigin=$mydomain

導入編(必要に応じて行う項目)

接続ポート設定

docker-compose.ymlでは以下のポートが設定されています(公式のUnderstanding the Ports参照)。

Protocol Explicit TLS Implicit TLS Purpose
SMTP 25 N/A Transfer
ESMTP 587 465 Submission
IMAP4 143 993 Retrieval

サーバ証明書を用意できない場合、ESMTP/IMAP4ともに暗号化はできず平文での通信となります。
今回はESMTP/IMAP4ともに暗号化を問答無用で強制したかったので、どちらもImplicit TLSのポートのみを設定し、Explicit TLSのポートは削除しました。

docker-compose.yml
    ports:
      - "25:25"    # SMTP  (explicit TLS => STARTTLS)
      - "465:465"  # ESMTP (implicit TLS)
      - "993:993"  # IMAP4 (implicit TLS)

SSL使わない方や、Explicit TLSでやりたいという方は、Explicit TLSのポートを設定してください。

SSL設定

サーバにアクセスする際に使用するサーバ証明書の設定を行います。SSLでアクセスしない場合はデフォルトのまま(SSL_TYPEを空白)で問題ありません。接続ポート設定でImplicit TLSを設定した場合、SSL設定は必須となります。

docker-mailserverではLet's Encryptで取得したサーバ証明書、もしくは自身で入手したサーバ証明書を使用可能です。

サーバ証明書の設定はmailserve.envのSSL_TYPEで行います。

サーバ証明書入手方法 SSL_TYPEの値
Let's Encryptで取得したサーバ証明書 letsencrypt
自分で取得したサーバ証明書 manualもしくはcustom
オレオレ証明書 self-signed

SSL_TYPE=manual以外では、メールサーバのホスト名(mailsv.mydomain.example.com)が証明書ファイル名の一部となります。証明書ファイルを置く際注意してください。

Let's Encryptで取得したサーバ証明書を使う

Let's Encrypt発行のサーバ証明書を使う場合、mailserver.envのSSL_TYPEにletsencryptを指定します。

mailserver.env
SSL_TYPE=letsencrypt

また、Let's Encryptのコンテナ上で/etc/letsencrypt配下にcertbotのConfiguration directory(デフォルトでは/etc/letsencrypt)にアクセスできる必要があります。例えばdockerホスト上で/etc/letsencryptにファイルが存在する場合、docker-compose.ymlに「/etc/letsencrypt:/etc/letsencrypt」のエントリを追加します。

docker-compose.yml
    volumes:
      - ./docker-data/dms/mail-data/:/var/mail/
      - ./docker-data/dms/mail-state/:/var/mail-state/
      - ./docker-data/dms/mail-logs/:/var/log/mail/
      - ./docker-data/dms/config/:/tmp/docker-mailserver/
      - /etc/localtime:/etc/localtime:ro
      - /etc/letsencrypt:/etc/letsencrypt

自分で取得したサーバ証明書を使う

自分で取得したサーバ証明書を使う場合、証明書・鍵ファイルの形態により以下の2通りの方法があります。

  • サーバ証明書と鍵を別々のファイルとして使用する
  • サーバ証明書と鍵を1つのファイルにまとめて使用する

サーバ証明書と鍵を別々のファイルとして使用する

mailserver.envのSSL_TYPEにmanualを指定し、SSL_CERT_PATHと証明書ファイル名、SSL_KEY_PATHにプライベートキーファイル名を指定してください。この時指定するファイル名はコンテナ上でのファイル名となりますので注意。

mailserver.env
SSL_TYPE=manual
SSL_CERT_PATH=/tmp/dms/custom-certs/public.crt
SSL_KEY_PATH=/tmp/dms/custom-certs/private.key

サーバ証明書と鍵を1つのファイルにまとめて使用する

サーバ証明書と鍵を1つのファイルにまとめる場合、SSL_TYPEにcustomを指定します。サーバ証明書&鍵ファイルは
設定ファイルディレクトリ配下にssl/ホスト名-full.pemとして配置する必要があります。今回の例ではdockerホスト上で./docker-data/dms/config/ssl/mailsv.mydomain.exmaple.com-full.pemとして格納します。

mailserver.env
SSL_TYPE=custom
サーバ証明書と鍵を1つのファイルにまとめる方法

鍵、サーバ証明書の順番でファイルを結合します(順番が重要)。例えば、サーバ証明書public.crtと鍵private.keyを結合する場合、以下のようなコマンドになります。

$ cat private.key public.crt> mailsv.mydomain.exmaple.com-full.pem

オレオレ証明書を使用する

省略。後で書くかも。

DKIM設定

DKIMのドメイン鍵生成を行うことができます。鍵生成対象のドメインは追加されたメールアドレスのドメインとなります。

$ ./setup.sh config dkim
Creating network "mail_default" with the default driver
Creating mail_mailserver_run ... done
Creating DKIM private key /tmp/docker-mailserver/opendkim/keys/mydomain.example.com/mail.private
Creating DKIM KeyTable
Creating DKIM SigningTable
Creating DKIM TrustedHosts

./docker-data/dms/config/opendkim/keys/mydomain.example.com/mail.txtの内容をDNSサーバ側でレコードに登録します。

明示的にドメインを指定してドメイン鍵生成を行うこともできます。

$ ./setup.sh config dkim domain mydomain.example.com

DNSブロックリスト有効化

DNSブロックリストはmailserver.envのENABLE_DNSBLで設定できます。1に設定することで有効化されます。

mailserver.sv
ENABLE_DNSBL=1

mailserver.envのコメントにもありますが、使用するリストはzen.spamhaus.orgとその他さまざまです。

Fail2ban有効化

何度も何度もアタックを仕掛けてくる相手はFail2banでブロックしましょう。
mailserver.envのENABLE_FAIL2BANで設定できます。1に設定することで有効化されます。

mailserver.env
# If you enable Fail2Ban, don't forget to add the following lines to your `docker-compose.yml`:
#    cap_add:
#      - NET_ADMIN
# Otherwise, `iptables` won't be able to ban IPs.
ENABLE_FAIL2BAN=1

docker-compose.ymlでcap_addにNET_ADMINが必要ですが、公式のdocker-compose.ymlにデフォルトで入っていますので、こちらは設定不要です。

Fail2ban設定変更

Fail2banのデフォルト設定は「10分間に3回引っかかったら3時間隔離」となっています。個人や身内で使っているサーバの場合、この設定だと緩すぎることもあります。変更方法は以下の通りです。

定義ファイルひな型を作成

定義ファイルははconfig配下(デフォルトだと./docker-data/dms/config)にfail2ban-jail.cfとして作成します。

公式の手順では、githubから定義ファイルのひな型を取得する方法が提示されています。

$ wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/config-examples/fail2ban-jail.cf

2022年4月5日以降、docker-mailserverの10.5.0では上記手順で問題が発生します。おそらく10.6以降で問題は解決されると思われます。リリース履歴チェックして、0.6が出てたら本手順は不要だと考えてください。

docker-mailserverのコンテナイメージは2022年3月2日にリリースされた10.5.0が最新です。一方、github上では開発が進められており、定義や仕組みの実装がどんどん変更されています。
2022年4月5日にdocker-mailserverの実装がiptablesからnftablesに変更されました。これにより、定義ファイルの一部(banaction)がnftables変更されています。

nftables用の定義ファイルを、iptablesで動く10.5に適用すると、隔離の際エラーとなります。
10.6が出るまでは、以下のように定義ファイルのひな型を作成してください。

$ docker-compose run mailserver cat /etc/fail2ban/jail.local > ./docker-data/dms/config/fail2ban-jail.cf

取得した定義ファイルをカスタマイズ

定義ファイルのひな型は以下の通りです。
定義ファイルひな型を必要に応じて変更します。パラメータの意味はそれぞれ以下の通りです。必要に応じて変更してください。

パラメータ 意味 デフォルト値
findtime banを判断する時間 10m
maxretry 何回引っかかたらbanするか 3
bantime banを判断する時間 3h

アップデートチェックの設定

デフォルトでは1日ごとにdocker-mailserverのアップデートをチェックし、アップデートがあった場合はPOSTMASTERあてにメールで通知してくれます。チェック不要であればENABLE_UPDATE_CHECKを0にしてください。

mailserver.env
# Check for updates on container start and then once a day
# If an update is available, a mail is sent to POSTMASTER_ADDRESS
# 0 => Update check disabled
# 1 => Update check enabled
ENABLE_UPDATE_CHECK=1

ログ保持期間の設定

デフォルトでは1週間でログローテートし、4世代保持します。保持世代数は変更できず、ローテートの間隔を設定することができます。LOGROTATE_INTERVALでローテートの間隔を指定できます。

mailserver.env
# Changes the interval in which log files are rotated
# **weekly** => Rotate log files weekly
# daily => Rotate log files daily
# monthly => Rotate log files monthly
#
# Note: This Variable actually controls logrotate inside the container
# and rotates the log files depending on this setting. The main log output is
# still available in its entirety via `docker logs mail` (Or your
# respective container name). If you want to control logrotation for
# the Docker-generated logfile see:
# https://docs.docker.com/config/containers/logging/configure/
#
# Note: This variable can also determine the interval for Postfix's log summary reports, see [`PFLOGSUMM_TRIGGER`](#pflogsumm_trigger).
LOGROTATE_INTERVAL=weekly

選択肢はdaily、weekly、monthlyで、それぞれ日毎、週毎、月毎でのローテーションとなります。

なお、LOGROTATE_INTERVALで指定できるのは、mail.logのみです。その他ログ(mail.err, mail.info, mail.warn)のローテーションはweekly固定となります。
mail.logはその他ログ全てを含んでいるので、万が一昔のログを見たい、という要望にはLOGROTATE_INTERVALをmonthlyにすることで達成できると思います。

その他postfixの設定

mailserver.envやdocker-compose.ymlで設定できないものについては、2つの設定方法が提供されています。

  • postconf
  • シェルを実行する

postconf

postconfで実行する内容を./docker-data/dms/config/配下のpostfix-main.cfもしくはpostfix-master.cfに記載することで、postfixに反映することができます。postfix-main.cfに記載された内容はpostconf -e、postfix-master.cfに記載された内容はpostconf -Pで反映されます。

例として、当方の環境で行った設定を示します。
当方環境では、リレーサーバからEHLOの応答は以下の通りであり、リレーホストがSTARTTLSに対応していません。

220 smtp-gw ESMTP
EHLO user@example.com
250-smtp.example.com
250-PIPELINING
250-SIZE 14336000
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

docker-mailserverのデフォルトではメール送信時のSTARTTLSが必須(smtp_tls_security_level=encrypt)であるため、メール送信時に以下のように送信できません。

Feb 10 07:54:17 www postfix/smtp[1886]: B2AB0600006B: to=<メール送信先>, relay=relaysv.isp.example.org[yyyy.yyyy.yyyy.yyyy]:587, delay=0.2, delays=0.01/0.03/0.16/0, dsn=4.7.4, status=deferred (TLS is required, but was not offered by host relaysv.isp.example.org[yyyy.yyyy.yyyy.yyyy])

そのため、当方環境では./docker-data/dms/config/postfix-main.cfとしてsmtp_tls_security_level=mayを設定しています。これにより、リレーホストがSTARTTLSをサポートしていなくても、メールを送信できるようになります(STARTTLSは使わなくなります)。

docker-data/dms/config/postfix-main.cf
smtp_tls_security_level=may

シェル

コンテナ起動時各デーモンを起動する直前に./docker-data/dms/config/user-patches.shを実行してくれます。
公式のひな型は以下のようになっています。

user-patches.sh
#! /bin/bash
##
# This user patches script runs right before starting the daemons. That means, all the other configuration is in place, so the script can make final adjustments.
# If you modify any supervisord configuration, make sure to run "supervisorctl update" or "supervisorctl reload" afterwards.
# To enable the script, you must save it in your config directory as "user-patches.sh".
##
echo "Default user-patches.sh successfully executed"

導入編(コンテナ起動)

お待たせしました。「導入編(設定が必須の項目)」と「導入編(必要に応じて行う項目)」の設定が完了したらコンテナの起動が可能です。

$ docker-compose up -d

docker-composeのバージョンが低い場合、以下のようなエラーが出ます。

$ docker-compose up -d
ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services: 'mailserver'

この場合、docker-composeのバージョンをあげるか、docker-compose.ymlの頭にversionの定義を追加してあげてください。

docker-compose.yml
version: '3.8'

services:
  mailserver:
    image: docker.io/mailserver/docker-mailserver:latest

運用編

クライアントからのアクセス

メールクライアントの設定を行います。ポート番号はポート設定で行ったものに合わせてください。
参考に、Thunderbirdでの設定例を示します。受信サーバの「接続の保護」を「自動検出」にすると、うまく認識できなかったので、明示的に「SSL/TLS」を指定しました。

メールアドレスの操作

メールアドレスの操作(追加・削除・パスワード変更)、エイリアスの操作(追加・削除)など、一通りsetup.shから実行できます。実行中のコンテナにも反映されますが、postfix, dovecotは再起動されます。

メールキュー操作

運用中メールキューが詰まった場合、setup.shでは対処できないようです。そのため、コンテナに入って通常のpostfixの手順(postqueueやpostqueue)を用いてキューの操作を行います。
コンテナ内でコマンドを実行するには、「setup.sh debug login」が利用できます。実行するコマンドはダブルクォートでくくってあげないと、引数が渡せないようです。

$ ./setup.sh debug login "postqueue -p"
1238822073C96     443 Fri Apr  1 10:09:14  root@mailsv.mydomain.example.com
(host relaysv.isp.example.org[xxx.xxx.xxx.xxx] said: 450 4.1.8 <root@mailsv.mydomain.example.com>: Sender address rejected: Domain not found (in reply to RCPT TO command))
                                         user1@mydomain.example.com

いろいろ作業したい場合、以下のようにbashを実行してしまうのがよさそうです。

$ ./setup.sh debug login bash
root@mailsv:/#

docker-composeのexecでも同じことができます。お好きな方法でどうぞ。

$ docker-compose exec mailserver bash
root@mailsv:/#

docker-mailserverのアップデート

コンテナイメージのアップデートは、pull & down & upで行えます。

$ docker-compose pull
Pulling mailserver ... done
$ docker-compose down
Stopping mailserver ... done
Removing mailserver ... done
Removing network docker-mailserver_default
$ docker-compose up -d
Creating network "docker-mailserver_default" with the default driver
Creating mailserver ... done

各種ファイルについては、インストールと同じように再度取得してください。setup.shはカスタマイズすることもないのでそのまま上書きでよいです。

DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master'
wget -O setup.sh "${DMS_GITHUB_URL}/setup.sh"
chmod a+x ./setup.sh

docker-compose.ymlが更新されることはまれであり、docker-compose.ymlをカスタマイズすることを考えると、githubで更新内容を確認し、必要であれば取り込む、くらいの対応でよいです。

mailserver.envはカスタマイズされることが前提ですので、単純に置き換えができません。新しい変数が定義された場合、定義がなくてもデフォルトで動作します。これもgithubで変更内容を確認し、使えそうな定義が追加されていたら取り込む、という運用がよさそうです。

最終的な設定ファイル

設定ファイル更新部分についてdiffを載せておきます。

mailserver.env

mailserver.env
--- mailserver.env.orig 2022-02-10 15:31:48.780777775 +0900
+++ mailserver.env      2022-02-10 15:33:25.228250513 +0900
@@ -30,7 +30,7 @@

 # empty => postmaster@domain.com
 # => Specify the postmaster address
-POSTMASTER_ADDRESS=
+POSTMASTER_ADDRESS=user1@mydomain.example.com

 # Check for updates on container start and then once a day
 # If an update is available, a mail is sent to POSTMASTER_ADDRESS
@@ -100,13 +100,13 @@
 # Note: Emails will be rejected, if they don't pass the block list checks!
 # **0** => DNS block lists are disabled
 # 1     => DNS block lists are enabled
-ENABLE_DNSBL=0
+ENABLE_DNSBL=1

 # If you enable Fail2Ban, don't forget to add the following lines to your `docker-compose.yml`:
 #    cap_add:
 #      - NET_ADMIN
 # Otherwise, `iptables` won't be able to ban IPs.
-ENABLE_FAIL2BAN=0
+ENABLE_FAIL2BAN=1

 # Fail2Ban blocktype
 # drop   => drop packet (send NO reply)
@@ -133,7 +133,7 @@
 # custom => Enables custom certificates
 # manual => Let's you manually specify locations of your SSL certificates for non-standard cases
 # self-signed => Enables self-signed certificates
-SSL_TYPE=
+SSL_TYPE=custom

 # These are only supported with `SSL_TYPE=manual`.
 # Provide the path to your cert and key files that you've mounted access to within the container.
@@ -479,7 +479,7 @@
 #
 # empty => don't configure default relay host
 # default host and optional port to relay all mail through
-DEFAULT_RELAY_HOST=
+DEFAULT_RELAY_HOST=[relaysv.isp.example.org]

 # -----------------------------------------------
 # --- Multi-Domain Relay Section ----------------
@@ -490,16 +490,16 @@
 #
 # empty => don't configure relay host
 # default host to relay mail through
-RELAY_HOST=
+RELAY_HOST=relaysv.isp.example.org

 # empty => 25
 # default port to relay mail
-RELAY_PORT=25
+RELAY_PORT=587

 # empty => no default
 # default relay username (if no specific entry exists in postfix-sasl-password.cf)
-RELAY_USER=
+RELAY_USER=relayuser1

 # empty => no default
 # password for default relay user
-RELAY_PASSWORD=
+RELAY_PASSWORD=relayPassWord

docker-compose.yml

SSL_TYPEはcustomとし、証明書・鍵ファイルは./docker-data/dms/config/ssl/mydomain.example.com-full.pemとして配置しています。

docker-compose.yml
--- docker-compose.yml.orig     2022-02-10 15:35:57.368840244 +0900
+++ docker-compose.yml  2022-02-10 15:38:37.179308467 +0900
@@ -4,17 +4,15 @@
     container_name: mailserver
     # If the FQDN for your mail-server is only two labels (eg: example.com),
     # you can assign this entirely to `hostname` and remove `domainname`.
-    hostname: mail
-    domainname: example.com
+    hostname: mailsv
+    domainname: mydomain.example.com
     env_file: mailserver.env
     # More information about the mail-server ports:
     # https://docker-mailserver.github.io/docker-mailserver/edge/config/security/understanding-the-ports/
     # To avoid conflicts with yaml base-60 float, DO NOT remove the quotation marks.
     ports:
       - "25:25"    # SMTP  (explicit TLS => STARTTLS)
-      - "143:143"  # IMAP4 (explicit TLS => STARTTLS)
       - "465:465"  # ESMTP (implicit TLS)
-      - "587:587"  # ESMTP (explicit TLS => STARTTLS)
       - "993:993"  # IMAP4 (implicit TLS)
     volumes:
       - ./docker-data/dms/mail-data/:/var/mail/

postfix-virtual.cf

postfix-virtual.cfは新規で作成しました。
私が使っているリレーサーバの制約により、「smtp_tls_security_level=may」を定義しています。これは環境依存となります。

smtp_tls_security_level=may
myorigin=$mydomain

docker-data/dms/config/fail2ban-jail.cf

「1時間に2回引っかかったら12時間隔離」という厳しめのルールにしたかったので、デフォルトから変更しています。

./docker-data/dms/config/fail2ban-jail.cf
[DEFAULT]

# "bantime" is the number of seconds that a host is banned.
bantime = 12h

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 1h

# "maxretry" is the number of failures before a host get banned.
maxretry = 2

終わりに

DKIMの設定とともにDNS設定としてSPF、DMARCまで設定すれば、今どきのメールサーバとして運用できるのではないかと思います。

構成のアイコンはさくらのアイコンセットを使用しています。

Discussion