Некоторые открытые порты Докера недоступны извне (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,
Саша