Docker Error: failed to create bridge network: iptables failed — Решение
Взаимодействие Docker Engine с подсистемами Netfilter / Iptables
Ошибка Error response from daemon: failed to create bridge network: iptables failed: No chain/target/match by that name возникает при инициализации сетевого моста (bridge) или публикации портов контейнера (флаг -p / -P). Демон dockerd при запуске автоматически создает в ядре Linux кастомные цепочки правил: DOCKER, DOCKER-INGRESS, DOCKER-ISOLATION-STAGE-1 в таблицах nat и filter. Если сторонний фаервол (UFW, Firewalld, Fail2ban) перезапускается и очищает (flush) таблицы iptables, либо происходит рассинхронизация между legacy iptables и nftables, Docker теряет доступ к своим цепочкам и блокирует запуск сети.
Бизнес-риски:
Полный отказ сетевой связности всех контейнеров на хосте, невозможность запуска новых сервисов, дыры в безопасности из-за сброса правил изоляции портов.
Таблица компонентов сетевой фильтрации Docker
| Цепочка iptables | Таблица Netfilter | Функциональное назначение |
|---|---|---|
DOCKER | nat / filter | Проброс внешних портов на внутренние IP-адреса контейнеров (DNAT). |
DOCKER-ISOLATION | filter | Изоляция трафика между различными пользовательскими мостами bridge. |
POSTROUTING | nat | Маскарадинг исходящего трафика контейнеров во внешнюю сеть (SNAT/MASQUERADE). |
Пошаговое восстановление цепочек iptables и интеграции с фаерволом
Сценарий 1: Перезапуск демона Docker для пересоздания цепочек
Самый быстрый способ вернуть служебные цепочки после сброса правил фаерволом:
# Перезапуск службы Docker для повторной инициализации правил iptables
systemctl restart docker
# Проверка наличия цепочек DOCKER в таблице nat
iptables -t nat -L DOCKER -n -vСценарий 2: Переключение бэкенда iptables на legacy (Debian / Ubuntu / RHEL)
В современных дистрибутивах Linux подсистема nftables может конфликтовать с классическим синтаксисом Docker:
# Переключение альтернатив на iptables-legacy (для Debian/Ubuntu):
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
update-alternatives --set arptables /usr/sbin/arptables-legacy
update-alternatives --set ebtables /usr/sbin/ebtables-legacy
# Перезапуск демона Docker
systemctl restart dockerСценарий 3: Корректная интеграция с UFW / Firewalld
Настройте фаервол так, чтобы он не затирал правила Docker при перезагрузке:
# Для Firewalld (RHEL/CentOS/AlmaLinux):
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --reload
systemctl restart docker
# Проверка включения IP Forwarding в ядре:
sysctl -w net.ipv4.ip_forward=1Типовые ошибки администраторов
- Полное отключение iptables в daemon.json: Это лишает Docker возможности пробрасывать порты и изолировать контейнеры, требуя ручного написания сотен правил.
- Перезапуск UFW (ufw reload) на живом production-сервере: UFW стирает цепочки Docker, что моментально ломает сеть у всех работающих контейнеров до перезапуска dockerd.
Инженеры ITSTM настроят безопасную связку UFW/Firewalld/nftables с Docker без разрывов соединений и уязвимостей.
Частые вопросы (FAQ)
Почему после ufw reload перестают открываться сайты из контейнеров?
UFW при перезагрузке удаляет цепочки DOCKER из таблицы nat. Необходимо перезапустить службу Docker командой systemctl restart docker.
Открывает ли Docker порты наружу в обход настроек UFW?
Да. Docker вставляет правила в таблицу nat до правил UFW. Для защиты используйте цепочку DOCKER-USER или привязывайте порт к 127.0.0.1.
Как разрешить маршрутизацию трафика между контейнерами на уровне ядра?
Убедитесь, что параметр 'net.ipv4.ip_forward = 1' активен в sysctl. Без него ядро блокирует пересылку пакетов через мост docker0.
Что делать, если ошибка указывает на отсутствие модуля ip_tables в ядре?
Загрузите необходимые модули ядра: modprobe ip_tables && modprobe iptable_nat && modprobe nf_conntrack.