【Docker】Port25 の罠にハマった話【Mailserver】

はじめに

メールサーバーの導入は毎度苦労します。
GWということで重い腰を上げることにしました。

今回は こちら 様を参考に docker-mailserver で導入させていただきました。
導入方法は紹介サイトが多くあるので省きます。

mailserver port 25 …
OP25B(Outbound Port 25 Blocking) の苦労話でしょ?
自分もそう思いましたが、別の問題が原因でした。

導入と不具合

まず失敗の設定ファイルです。 hostname domainname などは仮です。
どこが問題かわかりますか?

version: '3.8'

services:
  mailserver:
    image: ghcr.io/docker-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: hostname
    domainname: domainname
    env_file: mailserver.env
    # More information about the mail-server ports:
    # https://docker-mailserver.github.io/docker-mailserver/latest/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)
      - 465:465  # ESMTP (implicit TLS)
      - 993:993  # IMAP4 (implicit TLS)
    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
    cap_add:
      - NET_ADMIN
    restart: always

導入が完了し 自分宛てにメールを送信…送受信成功
GMail へ送信… 送信成功
ICloud へ送信… 送信成功
GMail から自分宛てに送信

あれれ?おかしいぞ?

iCloud から送信

だめだ、外部から受信できないみたいです。

GMail の詳細も

The recipient server did not accept our requests to connect. Learn more at https://support.google.com/mail/answer/7720 
受信側サーバーが接続要求を受け入れませんでした。 詳しくは https://support.google.com/mail/answer/7720

とのことで、当方サーバーが拒否っているようです。

当方 OP25B 制限はない環境で、リレーサーバーは不要な環境です。
検索しても OP25B 対策しかヒットしない状況でした。

ルーターの NAT設定
ダイナミックDNSの設定
などもチェックしましたが問題なし…

解決

色々検索し解決方法が見つけました。
こちら

Could you try if it works if you put the 25:25 in quotes? I.e., "25:25"; this is a known issue with the way the yaml is parsed; see this note in the documentation; https://docs.docker.com/compose/compose-file/#ports

感謝!

docker ps でポートを確認してみると

2204735f2342   ghcr.io/docker-mailserver/docker-mailserver:latest   "/usr/bin/dumb-init …"   4 seconds ago   Up 3 seconds   25/tcp, 110/tcp, 143/tcp, 0.0.0.0:465->465/tcp, :::465->465/tcp, 587/tcp, 995/tcp, 4190/tcp, 0.0.0.0:993->993/tcp, :::993->993/tcp, 0.0.0.0:32829->1525/tcp, :::32829->1525/tcp   mailserver

確かに 25/tcp が外から見えなく
よくわからんポート 0.0.0.0:32829->1525/tcp, :::32829->1525/tcp が開いている。
どうやら 25:25 を YAML が60進数で解釈され 25*60+25 = 1525 へ変換されているようです。
ポート設定は “” をつけるのを徹底したほうが良さそうです。

で修正後の設定がこちら

version: '3.8'

services:
  mailserver:
    image: ghcr.io/docker-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: hostname
    domainname: domainname
    env_file: mailserver.env
    # More information about the mail-server ports:
    # https://docker-mailserver.github.io/docker-mailserver/latest/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)
      - "465:465"  # ESMTP (implicit TLS)
      - "993:993"  # IMAP4 (implicit TLS)
    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
    cap_add:
      - NET_ADMIN
    restart: always

ports の設定を “” ダブルクォーテーション でくくってます。

docker ps の結果は

a9113d712b83   ghcr.io/docker-mailserver/docker-mailserver:latest   "/usr/bin/dumb-init …"   5 seconds ago   Up 3 seconds   110/tcp, 0.0.0.0:25->25/tcp, :::25->25/tcp, 143/tcp, 0.0.0.0:465->465/tcp, :::465->465/tcp, 587/tcp, 995/tcp, 0.0.0.0:993->993/tcp, :::993->993/tcp, 4190/tcp   mailserver

0.0.0.0:25->25/tcp, :::25->25/tcp,
ちゃんと外にポートがつながったようです。

GMail からも iCloud からもメールが届くようになりました。

あーこれは仕様知らないとわからんですね。

あとがき

GW を半分使い切ってしまいました。
全然メール環境不要なのですが、動かないと気になって夜しか眠れないですもんね。
Docker で楽しようと思ったら思わぬ落とし穴に落ちた感じでした

その後 Gmail や iCloud から送ったテストメールが山のように届きました。

One Comment