это сводит меня с ума, но по какой-то причине я не могу получить доступ к некоторым портам извне. Я проверил почти все возможные настройки, но я понятия не имею, почему это не работает. Я не знаю, где исправить эту проблему (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,
Саша