Docker и UFW: безопасная настройка и исправление

Быстрые ссылки
- Почему Docker не работает с UFW
- Исправление конфигурации Docker
- Как белить (whitelist) порты контейнеров Docker в UFW
Почему Docker не работает с UFW
UFW — это упрощённый фронтенд для iptables. Docker тоже управляет iptables, создавая собственные цепочки и перенаправления (NAT), чтобы пробрасывать порты и организовывать сетевые мосты. Когда оба инструмента модифицируют одни и те же низкоуровневые правила, возникает конфликт: UFW может показывать «закрытые» порты, тогда как Docker перенаправил трафик прямо в контейнеры. Результат — ложное ощущение безопасности и непреднамеренная публикация сервисов.
Типичный сценарий:
- Вы включаете UFW и разрешаете только SSH и HTTP.
- Docker запускает контейнер с пробросом порта 8000: контейнер доступен извне, но UFW не покажет это как открытый порт.
- Вы считаете, что доступ ограничен, но на деле сервис открыт для всего Интернета.

Важно: проблема не в ошибке UFW или Docker как таковой, а в пересечении областей ответственности сетевых правил.
Что происходит под капотом
Коротко: Docker добавляет свои цепочки (DOCKER, DOCKER-USER и т. п.) в iptables и управляет правилами NAT. UFW генерирует правила, которые обычно располагаются в начале/конце наборов iptables. Если Docker вставляет свои правила позже или обходит UFW, пакеты попадают прямо в контейнер.
Определения в одну строку:
- iptables: набор правил ядра Linux для фильтрации пакетов и NAT.
- UFW: пользовательская обёртка для iptables, упрощающая правила для администратора.
- DOCKER-USER: цепочка, которую Docker вызывает для пользовательских правил до основных действий Docker.
Исправление конфигурации Docker (временное и постоянное)
Есть два подхода:
- Отключить управление iptables в Docker. В файле /etc/default/docker или /etc/docker/daemon.json установить опцию, чтобы Docker не менял iptables:
DOCKER_OPTS="--iptables=false"Плюсы: Docker не трогает iptables; UFW остаётся единственным управителем правил. Минусы: контейнеры могут потерять доступ в Интернет, нужно вручную писать правила NAT и FORWARD для каждой сети Docker.
- Корректно интегрировать UFW и Docker (рекомендуется). Это означает добавление блока правил в /etc/ufw/after.rules, который создаёт цепочки DOCKER-USER и маршрутизирует трафик через правила UFW до применения Docker-правил.
Ниже пример блока, который добавляют в конец /etc/ufw/after.rules:
# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward
-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16
-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12
-A DOCKER-USER -j RETURN
-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP
COMMIT
# END UFW AND DOCKERЭтот блок перенаправляет пакеты через пользовательские правила UFW до того, как Docker применит свои NAT/форвардинг-правила.
Утилита ufw-docker
Есть готовая утилита, которая автоматизирует установку вышеописанного блока и предоставляет команды для проверки статуса.
Установка:
sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
sudo chmod +x /usr/local/bin/ufw-dockerЗатем примените конфигурацию и перезапустите UFW:
ufw-docker install
sudo systemctl restart ufwЕсли изменения не вступили в силу, попробуйте перезапустить Docker или весь хост. После успешной установки порты контейнеров будут фильтроваться по правилам UFW.

Как белить (whitelist) порты контейнеров Docker в UFW
После интеграции Docker и UFW вы можете использовать ufw-docker для упрощённой работы с контейнерами:
ufw-docker allow httpd 80Если требуется более тонкая настройка (например, белый список по IP), используйте команды маршрутизации UFW:
ufw route allow proto tcp from 1.2.3.4 to any port 9443Заметьте: используйте “ufw route” для проброшенных портов Docker, потому что они обрабатываются на уровне маршрутизации (FORWARD), а не локальных сервисов.
Пошаговый план внедрения (SOP)
- Оцените текущую конфигурацию:
- docker ps –format “{{.Names}} {{.Ports}}”
- sudo ufw status verbose
- sudo iptables -L -n -v; sudo iptables -t nat -L -n -v
- Сделайте резервную копию /etc/ufw/after.rules и /etc/docker/daemon.json:
- sudo cp /etc/ufw/after.rules /etc/ufw/after.rules.bak
- sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
- Предпочтительный вариант: установить ufw-docker и выполнить ufw-docker install.
- Перезапустить UFW: sudo systemctl restart ufw
- Перезапустить Docker при необходимости: sudo systemctl restart docker
- Тестирование:
- Проверить, что личные порты действительно закрыты с внешнего IP (используйте nmap или curl из сети извне).
- sudo ufw status numbered и sudo iptables -L DOCKER-USER -n -v
- Применить белые списки по IP через ufw route или ufw-docker allow.
- Наблюдать логи: sudo tail -F /var/log/ufw.log
Критерии приёмки
- Все порты контейнеров доступны только при явном правиле UFW.
- Пробрасываемые порты видны в sudo iptables -L DOCKER-USER и проходят через ufw-user-forward.
- Логи UFW показывают попытки блокировки (если применимо).
- Сервисы сохраняют доступность для нужных клиентов после внесённых правил.
Отладка и откат
Если после правок что-то сломалось:
- Откат одного файла:
- sudo cp /etc/ufw/after.rules.bak /etc/ufw/after.rules
- sudo systemctl restart ufw
- Если вы отключили iptables в Docker и потеряли доступ в Интернет контейнеров, верните опцию и перезапустите Docker.
- Проверяйте журнал ошибок Docker: sudo journalctl -u docker -n 200
Когда это не сработает или не подходит
- Управляемые облачные брандмауэры (например, security groups в AWS) могут перехватывать правила на другом уровне — изменение UFW не решит проблему на уровне провайдера.
- Если у вас сложная сеть с несколькими мостами Docker и нестандартными сетевыми драйверами, простого блока в after.rules может быть недостаточно.
- В средах Kubernetes решение совсем другое — там лучше использовать сетевые политики CNI.
Роль‑ориентированные чек‑листы
Администратор системы:
- Сделать бэкапы конфигураций.
- Применить ufw-docker и перезапустить службы.
- Проверить iptables и логи.
DevOps-инженер:
- Добавить проверки в CI (посмотреть, что контейнеры не открывают неожиданные порты).
- Описать правила в инфраструктуре как код (Ansible/Terraform).
Команда безопасности:
- Запланировать сканирование портов и аудит правил.
- Убедиться, что журналы UFW сохраняются и анализируются.
Короткий словарь
- UFW: упрощённый интерфейс к iptables для быстрых правил брандмауэра.
- DOCKER-USER: цепочка iptables, которую Docker вызывает до применения собственных правил.
- NAT: трансляция сетевых адресов, используемая для проброса портов.
Простые тесты и критерии приёмки
Тест 1: внешний скан портов
- Шаг: запустить контейнер с пробросом 8000, но без явного правила UFW.
- Ожидаемое: порт 8000 не должен отвечать извне после установки интеграции.
Тест 2: белый список по IP
- Шаг: разрешить доступ на порт 9443 только с IP 1.2.3.4.
- Ожидаемое: доступ только с указанного IP.
Дополнительные советы и безопасность
- Логируйте и анализируйте попытки доступа: это поможет отлавливать пробросы, которые вы не планировали.
- В production избегайте отключения управления iptables у Docker — поддерживать NAT вручную трудно.
- Рассмотрите использование сетевых политик на уровне оркестрации для более тонкого контроля.
Решение: краткое резюме
Интеграция Docker и UFW требует явной настройки: либо отключить iptables в Docker (не рекомендуется для продакшена), либо добавить блок правил в /etc/ufw/after.rules или воспользоваться ufw-docker. После внесённых изменений необходимо провести тесты доступа и настроить белые списки через ufw route или ufw-docker для проброшенных портов.
Важно: всегда делайте резервные копии конфигураций и план отката перед изменениями сетевых правил.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента