Некоторые открытые порты Докера недоступны извне (dovecot, postfix)

это сводит меня с ума, но по какой-то причине я не могу получить доступ к некоторым портам извне. Я проверил почти все возможные настройки, но я понятия не имею, почему это не работает. Я не знаю, где исправить эту проблему (Ubuntu firewall vs. Docker vs. Dovecot vs. Postfix), и я действительно надеюсь, что вы, ребята, можете мне помочь.

FYI: mycooldomain.com - это просто место для моего домена, на котором я не хочу делиться в данный момент.

Я куплю пиво для того, кто помогает мне это исправлять!:)

Краткое введение

На моем корневом сервере я запускаю следующий контейнер почтового сервера докеров (https://github.com/tomav/docker-mailserver/), который предоставляет несколько портов (143, 25, 587, 993). Контейнер запускает dovecot (IMAP) и постфикс (SMTP).

TL;DR

У меня есть вышеупомянутый почтовый сервер (dovecot, postfix), запущенный в контейнере докеров, и может подключаться только к одному порту (143 - IMAP). Другие порты 25, 587 и 993 недоступны извне - только с хоста напрямую. Докер предоставляет их правильно, и они правильно перечислены в iptables. Журналы в контейнере (dovecot, postfix) не проявляют никакой реакции при поступлении запросов (без отклонения запроса или что-то в этом роде), поэтому я полагаю, что они никогда не доходят до службы в контейнере. Другие порты контейнера докеров (например, мой веб-сервер: 80, 443).

Здесь подробная информация:

Я могу напрямую подключиться к каждому порту с хоста (пусть проверяет безопасный порт IMAP):

[email protected]:~$ telnet mail.mycooldomain.com 993
Trying xxx.xxx.xxx.xxx…
Connected to mail.mycooldomain.com.
Escape character is '^]'.
220 mail.mycooldomain.com ESMTP Postfix (Ubuntu)

Но не с моей локальной машины:

mastixmc$ telnet mail.mycooldomain.com 993
Trying xxx.xxx.xxx.xxx…
telnet:connect to address xxx.xxx.xxx.xxx: Operation timed out
telnet: Unable to connect to remote host

docker-compose ps показывает мне, что они подвержены и связаны правильно:

110/tcp,
0.0.0.0:143-143/tcp,
0.0.0.0:25->25/tcp, 4190/tcp,     
0.0.0.0:587->587/tcp,             
0.0.0.0:993->993/tcp, 995/tcp

netstat -ntlp говорит мне то же самое:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 :::587                  :::*                    LISTEN      -
tcp6       0      0 :::143                  :::*                    LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      -
tcp6       0      0 :::25                   :::*                    LISTEN      -
tcp6       0      0 :::443                  :::*                    LISTEN      -
tcp6       0      0 :::2332                 :::*                    LISTEN      -
tcp6       0      0 :::993                  :::*                    LISTEN      -

Я могу получить доступ к моему веб-серверу (80/443) и к незащищенному IMAP (143), который я не допущу в будущем. Но все остальные порты недоступны.

Я даже настроил UFW (хотя это и не нужно), чтобы убедиться, что Ubuntu ничего не блокирует:

Added user rules (see 'ufw status' for running firewall):
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 25/tcp
ufw allow 587/tcp
ufw allow 143/tcp
ufw allow 993/tcp

При просмотре журналов (Dovecot, Postfix) я не вижу никакой информации, поэтому похоже, что запрос не доходит до сервисов.

I DID NOT коснитесь следующих настроек Docker/UFW:

/и т.д./по умолчанию /UFW

DEFAULT_FORWARD_POLICY="DROP"

И DID NOT измените iptables = false в двигателе докеров.

Здесь iptables -L вызов, где вы можете четко видеть, что цепочка DOCKER правильно добавляет правила (также есть мои правила UFW):

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ufw-before-logging-input  all  --  anywhere             anywhere
ufw-before-input  all  --  anywhere             anywhere
ufw-after-input  all  --  anywhere             anywhere
ufw-after-logging-input  all  --  anywhere             anywhere
ufw-reject-input  all  --  anywhere             anywhere
ufw-track-input  all  --  anywhere             anywhere

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-ISOLATION  all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ufw-before-logging-forward  all  --  anywhere             anywhere
ufw-before-forward  all  --  anywhere             anywhere
ufw-after-forward  all  --  anywhere             anywhere
ufw-after-logging-forward  all  --  anywhere             anywhere
ufw-reject-forward  all  --  anywhere             anywhere
ufw-track-forward  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ufw-before-logging-output  all  --  anywhere             anywhere
ufw-before-output  all  --  anywhere             anywhere
ufw-after-output  all  --  anywhere             anywhere
ufw-after-logging-output  all  --  anywhere             anywhere
ufw-reject-output  all  --  anywhere             anywhere
ufw-track-output  all  --  anywhere             anywhere

Chain DOCKER (3 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.19.0.3           tcp dpt:https
ACCEPT     tcp  --  anywhere             172.19.0.3           tcp dpt:http
ACCEPT     tcp  --  anywhere             172.19.0.7           tcp dpt:imaps
ACCEPT     tcp  --  anywhere             172.19.0.7           tcp dpt:submission
ACCEPT     tcp  --  anywhere             172.19.0.7           tcp dpt:imap2
ACCEPT     tcp  --  anywhere             172.19.0.7           tcp dpt:smtp

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere
[...]
Chain ufw-user-input (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:imaps
ACCEPT     udp  --  anywhere             anywhere             udp dpt:imaps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:2332
ACCEPT     udp  --  anywhere             anywhere             udp dpt:2332
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     udp  --  anywhere             anywhere             udp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     udp  --  anywhere             anywhere             udp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:submission
ACCEPT     udp  --  anywhere             anywhere             udp dpt:submission
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:imap2
ACCEPT     udp  --  anywhere             anywhere             udp dpt:imap2

Итак, все выглядит правильно для меня.

Обновление # 1:

nmap от хоста докеров (против mycooldomain.com):

PORT    STATE    SERVICE
25/tcp  filtered smtp
80/tcp  filtered http
143/tcp filtered imap
443/tcp filtered https
587/tcp filtered submission
993/tcp filtered imaps

nmap с моей локальной машины (против mycooldomain.com):

PORT    STATE SERVICE
80/tcp  open  http
143/tcp open  imap
443/tcp open  https

Как вы видите, порты не открыты, поэтому я не могу подключиться к удаленному порту с портами 25, 587 и 993.

ОБНОВЛЕНИЕ # 2:

Итак, я остановил все контейнеры и открыл простой HTTP-сервер python:

sudo python -m SimpleHTTPServer 993

Также не удается получить доступ к этому порту. Поэтому я открыл тот же сервер с портом 8080 = > успех.

Похоже, что Ubuntu или мой хост блокируют порт 993! Я нахожусь в контакте с тем, кто предоставляет корневой сервер.

Я уже задал вопрос в самом проекте (https://github.com/tomav/docker-mailserver/issues/602), но они тоже не могли мне помочь.

Спасибо вам большое,

Greetz,

Саша

Ответ 1

Я исправил это... или, по крайней мере, мой хостер. Был еще один аппаратный брандмауэр, блокирующий определенные порты. Им пришлось включить определенный набор правил брандмауэра "Почтовый сервер", который позволяет запускать почтовый сервер.

Спасибо за вашу помощь и подсказки!!!

Greetz,

Саша