Я новичок в докере, в настоящее время хочу настроить докер на 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, если вы не отключите или не удалите их.