Docker: правила брандмауэра конфликтуют с вашими
Docker создаёт правила преобразования адресов и пробрасывания портов при запуске. Перезапуск или очистка правил брандмауэра стирает их, и контейнеры теряют сеть, хотя демон работает.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Правила очищены перезапуском брандмауэра
Средства управления правилами при перезапуске сбрасывают всё, включая цепочки Docker. Демон об этом не знает.
-
Управление правилами отключено в настройках демона
При
iptables: falseв daemon.json Docker не создаёт правила вовсе. Это осознанный режим для тех, кто настраивает сеть сам. -
Порядок запуска брандмауэра и Docker
Если брандмауэр стартует после демона, он стирает уже созданные правила при загрузке.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Есть ли правила преобразования адресов Docker.
sudo iptables -t nat -L -n | head -20Работает ли сеть изнутри контейнера.
docker run --rm alpine ping -c1 1.1.1.1 2>&1 | tail -3Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Средства управления правилами при перезапуске сбрасывают всё, включая цепочки Docker. Демон об этом не знает.
- Как проверить
-
Посмотрите наличие цепочек Docker.
sudo iptables -t nat -L DOCKER -n 2>/dev/null | head sudo nft list ruleset 2>/dev/null | grep -c -i docker
- Как исправить
-
Перезапустите демон Docker после перезапуска брандмауэра: он создаст правила заново.
sudo systemctl restart docker
- Почему происходит
- При
iptables: falseв daemon.json Docker не создаёт правила вовсе. Это осознанный режим для тех, кто настраивает сеть сам.
- Как проверить
-
Посмотрите настройку.
sudo grep -i iptables /etc/docker/daemon.json 2>/dev/null
- Как исправить
- Либо включите управление обратно, либо настройте правила самостоятельно — но тогда проброс портов придётся описывать руками.
- Почему происходит
- Если брандмауэр стартует после демона, он стирает уже созданные правила при загрузке.
- Как проверить
-
Посмотрите порядок служб.
systemctl list-dependencies --before docker.service --no-pager | head systemctl is-enabled nftables ufw firewalld 2>/dev/null
- Как исправить
-
Добавьте порядок в переопределении unit Docker: он должен стартовать после брандмауэра.
sudo systemctl edit docker # [Unit]\nAfter=nftables.service
Пример вывода
Правила Docker стёрты перезапуском брандмауэра. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo systemctl restart nftables
$ docker run --rm alpine ping -c1 1.1.1.1
ping: sendto: Operation not permitted
$ sudo iptables -t nat -L DOCKER -n
iptables: No chain/target/match by that name.
Связанные ошибки
- Docker: имена не разрешаются внутри контейнера Контейнеры не разрешают имена: конфликт с локальным разрешателем, неверные серверы в daemon.json, отключённый проброс.
- Operation not permitted в журнале службы Операция запрещена: не хватает возможностей процесса, мешает seccomp или модуль безопасности. Отличие от Permission denied.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Broken pipe в журнале службы Запись в закрытый канал или соединение: клиент отключился, обработчик завершился, конвейер разорван.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
Где встречается чаще всего
Источники
- Документация Docker: пакетная фильтрация
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено перезапуском nftables при работающих контейнерах.