Я новичок в докере, в настоящее время хочу настроить докер на vps, следуя этому руководству [https://www.howtoforge.com/how-to-install-and-use-nginx-proxy-manager/ ](https://www.howtoforge.com/how-to-install-and-use-nginx-proxy-manager/), поэтому мой план установки будет таким:
vps ubuntu 22.04, wireguard для vpn, ufw для брандмауэра:
Прокси-менеджер nginx (NPM) для обработки http, https, сертификата ssl (открытый порт 81)
portainer для управления докерами (открытый порт 9443)
Призрак, мой другой контейнер будет использовать сеть докеров и напрямую общаться с прокси-менеджером nginx, например с учебником, и соответствующим образом отображать поддомен.
Мне не нравится открывать порт 81, 9443 для публики, поэтому я делаю правило ufw и разрешаю только локальный IP-адрес vpn, который может подключаться к этому порту.
моя проблема в том, что контейнер Docker, похоже, игнорирует правило ufw и делает порт доступным с общедоступным IP-адресом.
Я пробовал [https://github.com/chaifeng/ufw-docker](https://github.com/chaifeng/ufw-docker), и это исправило проблему с портом и NPM... но призрак, и мой другой контейнер потерпел неудачу подключиться к прокси-менеджеру nginx, если каким-то образом перезапустился ящик или перезапустился контейнер.
моя работа прямо сейчас выставляется призраком, другим контейнером для хост-порта, а затем сопоставляет его с NPM по IP-адресу. это работает, но кажется неправильным, потому что по мере роста количества контейнеров потребности в порту также будут увеличиваться.
Какое чистое решение для этого? спасибо
Docker довольно рано вставляет свое первое правило в iptables, в nat PREROUTING. Вы можете просмотреть правила с помощью:
iptables -t физ -S
ufw часто помещает правила в INPUT после PREROUTING и FORWARD!
Однако в PREROUTING есть два места перед nat! сырой и калечить. Mangle может делать большинство вещей, которые INPUT может делать в любом случае, поэтому вы можете предотвратить попадание пакетов, входящих в общедоступный интерфейс, в сеть nat, не говоря уже о докере, создав правила для интерфейса паба, такие как:
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 9443 -j ПРИНЯТЬ
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 81 -j ПРИНЯТЬ
# Чтобы не заблокировать себя от ssh:
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 22 -j ПРИНЯТЬ
Затем отбросьте остальную часть tcp после того, как вы примете интерфейс паба (не забудьте udp):
iptables -t mangle -A PREROUTING -i eth0 -p tcp -j DROP
Для справки, как и в случае с руководствами, эквивалентное правило для ВВОДА будет выглядеть так:
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ПРИНЯТЬ
при условии, что имя вашего публичного интерфейса, конечно, eth0. Измените это в правилах, если нужно :)
Альтернативой является то, что предложил hypgn0sis, используя цепочку DOCKER-USER. Однако это будет менее эффективно, и пакеты по-прежнему достигают сети (включая прием FORWARD). Также ufw и firewalld будут мешать вашим правилам iptables, если вы не отключите или не удалите их.