Я новачок у докері, зараз хочу налаштувати докер на 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) ghost, мій інший контейнер використовуватиме мережу докерів і спілкуватиметься безпосередньо з диспетчером проксі-сервера nginx, як-от навчальний посібник, і відповідно відображатиме субдомен. Мені не подобається оприлюднювати порт 81, 9443, тому я створив правило ufw і дозволив лише локальну IP-адресу vpn, яка може підключитися до цього порту. Моя проблема полягає в тому, що контейнер докерів, здається, ігнорує правило ufw і робить порт все ще доступним із публічною IP-адресою. Я спробував [https://github.com/chaifeng/ufw-docker](https://github.com/chaifeng/ufw-docker), і це вирішило проблему portainer і NPM.. але ghost та інший мій контейнер вийшли з ладу щоб з’єднатися з менеджером проксі-сервера nginx, якщо якимось чином перезапустився ящик або контейнер. Моя робота зараз полягає в тому, щоб відкрити привид, інший контейнер для порту хоста, а потім зіставити його з NPM за ip-адресою. це працює, але здається неправильним, тому що зі збільшенням кількості контейнерів потреба в порту також зростатиме. Яке чисте рішення для цього? Спасибі Docker досить рано вставляє своє перше правило в iptables, у nat PREROUTING. Переглянути правила можна за допомогою: iptables -t nat -S ufw часто розміщує правила в INPUT, який знаходиться після PREROUTING і FORWARD! Однак у PREROUTING є два місця перед nat! сирець і калечить. Mangle може робити більшість речей, які INPUT може робити в будь-якому разі, тож ви можете запобігти потраплянню пакетів, що надходять до загальнодоступного інтерфейсу, на nat, не кажучи вже про мережу докерів, створивши правила для інтерфейсу pub, такі як: iptables -t mangle -A PRERUING -i eth0 -p tcp --dport 9443 -j ПРИЙНЯТИ iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 81 -j ПРИЙНЯТИ # Щоб ви не заблокували себе від ssh: iptables -t mangle -A PRERUING -i eth0 -p tcp --dport 22 -j ПРИЙНЯТИ Потім видаліть решту tcp після того, як ви приймаєте в інтерфейсі pub (не забудьте udp): iptables -t mangle -A PREROUTING -i eth0 -p tcp -j DROP Для довідки, подібно до посібників, еквівалентне правило для INPUT виглядатиме так: iptables -A INPUT -i eth0 -p tcp --dport 22 -j ПРИЙНЯТИ звичайно, припускаючи, що ім’я вашого загальнодоступного інтерфейсу – eth0. Змініть це в правилах, якщо потрібно :) Альтернативою є те, що запропонував hypgn0sis за допомогою ланцюжка DOCKER-USER. Однак це буде менш ефективним і пакети все одно досягають мережі (включаючи FORWARD приймає). Також ufw і firewalld заважатимуть вашим правилам iptables, якщо ви їх не вимкнете або не видалите.