Гид по технологиям

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

• 6 min read • DevOps • Обновлено 18 Nov 2025
Docker и UFW: безопасная настройка
Docker и UFW: безопасная настройка

Иллюстрация: конфликт между 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

Важно: проблема не в ошибке UFW или Docker как таковой, а в пересечении областей ответственности сетевых правил.

Что происходит под капотом

Коротко: Docker добавляет свои цепочки (DOCKER, DOCKER-USER и т. п.) в iptables и управляет правилами NAT. UFW генерирует правила, которые обычно располагаются в начале/конце наборов iptables. Если Docker вставляет свои правила позже или обходит UFW, пакеты попадают прямо в контейнер.

Определения в одну строку:

  • iptables: набор правил ядра Linux для фильтрации пакетов и NAT.
  • UFW: пользовательская обёртка для iptables, упрощающая правила для администратора.
  • DOCKER-USER: цепочка, которую Docker вызывает для пользовательских правил до основных действий Docker.

Исправление конфигурации Docker (временное и постоянное)

Есть два подхода:

  1. Отключить управление iptables в Docker. В файле /etc/default/docker или /etc/docker/daemon.json установить опцию, чтобы Docker не менял iptables:
DOCKER_OPTS="--iptables=false"

Плюсы: Docker не трогает iptables; UFW остаётся единственным управителем правил. Минусы: контейнеры могут потерять доступ в Интернет, нужно вручную писать правила NAT и FORWARD для каждой сети Docker.

  1. Корректно интегрировать 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.

Скриншот: вывод утилиты ufw-docker

Как белить (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)

  1. Оцените текущую конфигурацию:
    • docker ps –format “{{.Names}} {{.Ports}}”
    • sudo ufw status verbose
    • sudo iptables -L -n -v; sudo iptables -t nat -L -n -v
  2. Сделайте резервную копию /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
  3. Предпочтительный вариант: установить ufw-docker и выполнить ufw-docker install.
  4. Перезапустить UFW: sudo systemctl restart ufw
  5. Перезапустить Docker при необходимости: sudo systemctl restart docker
  6. Тестирование:
    • Проверить, что личные порты действительно закрыты с внешнего IP (используйте nmap или curl из сети извне).
    • sudo ufw status numbered и sudo iptables -L DOCKER-USER -n -v
  7. Применить белые списки по IP через ufw route или ufw-docker allow.
  8. Наблюдать логи: 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 для проброшенных портов.

Важно: всегда делайте резервные копии конфигураций и план отката перед изменениями сетевых правил.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро