Почему опубликованный порт Docker не закрывается UFW
Классическая ловушка: в UFW стоит deny на порт, а сервис в контейнере с -p 8080:8080 всё равно доступен снаружи.
В чём дело
Docker сам добавляет правила iptables для проброса портов: DNAT в таблице nat и разрешения в цепочке FORWARD. Трафик к контейнеру после DNAT идёт через FORWARD, а правила UFW для входящих соединений висят на INPUT — до них пакет просто не доходит.
Что делать
- Не публиковать лишнее. Если порт нужен только локально:
-p 127.0.0.1:8080:8080. - Ограничивать в самом сервисе. Например,
allow/denyилиgeoв nginx. - Цепочка
DOCKER-USER. Docker её не трогает и проверяет раньше своих правил:
iptables -I DOCKER-USER -i eth0 -p tcp --dport 8080 ! -s 198.51.100.10 -j DROP
Учтите, что в DOCKER-USER порт уже после DNAT — это порт контейнера, а не хоста. Правило нужно сохранить так, чтобы оно переживало перезагрузку.