Траблшутинг Docker и межсетевых экранов: конфликты iptables и обход UFW
- Docker пробрасывает порты наружу (
-p 8080:8080), полностью игнорируя запрещающие правилаufw deny 8080. - Внутренние службы (Redis, Elasticsearch, БД) случайно становятся доступны всему интернету.
- Сбои сети контейнеров после перезапуска службы
iptablesилиfirewalld.
1. Причина проблемы
Docker внедряет свои правила NAT в цепочку PREROUTING до того, как пакеты доходят до цепочек фильтрации UFW (цепочка INPUT). Контейнерный трафик обрабатывается в цепочке FORWARD.
2. Правильная блокировка через цепочку DOCKER-USER
Никогда не отключайте "iptables": false в daemon.json (это ломает исходящий NAT). Используйте штатную цепочку DOCKER-USER:
# Очистка цепочки DOCKER-USER
iptables -F DOCKER-USER
# Разрешить доступ к порту 3306 только с доверенного IP-адреса
iptables -I DOCKER-USER -i eth0 ! -s 192.168.1.50 -p tcp --dport 3306 -j DROP
# Разрешить уже установленные соединения
iptables -I DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Пропустить остальной трафик
iptables -A DOCKER-USER -j RETURN3. Сохранение правил iptables
# Ubuntu / Debian
apt-get install -y iptables-persistent
netfilter-persistent save
# RHEL / Rocky Linux
iptables-save > /etc/sysconfig/iptables4. Безопасная привязка портов только к Loopback интерфейсу
Если сервис нужен только локально или для Nginx reverse proxy:
docker run -d -p 127.0.0.1:5432:5432 postgres:alpine Частые вопросы (FAQ)
Почему опция 'iptables': false в /etc/docker/daemon.json приводит к проблемам?
При отключении iptables Docker перестает создавать правила Masquerade/SNAT. В результате контейнеры полностью теряют доступ к интернету и не могут резолвить внешние DNS-имена.
Как заставить UFW корректно фильтровать трафик Docker?
Используйте утилиту ufw-docker или пропишите правила перенаправления FORWARD в /etc/ufw/after.rules в цепочку DOCKER-USER.