Настройка SMTP с использованием localhost или 172.17.0.1 не работает: как отладить

Продолжаем обсуждение из темы Как настроить SMTP для использования localhost?:

Я пытаюсь подключиться к Protonmail Bridge, запущенной на хост-машине, но получаю ошибку «connection refused». Мои настройки:

  DISCOURSE_SMTP_ADDRESS: 172.17.0.1
  DISCOURSE_SMTP_PORT: 1025

Тесты nmap:

Команда nmap 127.0.0.1 на хост-машине выводит:

Nmap scan report for localhost (127.0.0.1)
Host is up (0.000010s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
1025/tcp open  NFS-or-IIS
1042/tcp open  afrog

Команда nmap 172.17.0.1 внутри контейнера Docker не показывает порт 1025.

Я также пробовал в файле app.yml в секции expose:

172.17.0.1:1025:1025

Но тогда контейнер Docker не запускался с ошибкой «порт уже занят».

Наконец, если я пытаюсь подключиться с помощью openssl с localhost:

openssl s_client -connect 127.0.0.1:1025 -starttls smtp

это работает; но не работает, когда я пытаюсь подключиться из контейнера Docker:

openssl s_client -connect 172.17.0.1:1025 -starttls smtp

Проверка с помощью ss на хост-машине:

ss -plnt
State  Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN   0      4096       127.0.0.1:1025      0.0.0.0:*    users:(("proton-bridge",pid=953,fd=12))

Что я делаю не так?


Один из ответов в этой теме на Stack Overflow гласит:

  • вы сможете получить доступ только к службам хоста, которые либо (a) прослушивают INADDR_ANY (то есть 0.0.0.0), либо явно прослушивают интерфейс docker0.

Сначала я проверил iptables --list, который, как я полагаю, выводит настройки по умолчанию:

iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:https
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:http

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Теперь я задаюсь вопросом: не принимает ли служба Protonmail Bridge, прослушивающая 127.0.0.1:1025, подключения из контейнера Docker, потому что они приходят не точно с адреса 127.0.0.1?

Оказывается, трафик нужно перенаправлять. Подробнее читайте здесь: