Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Общая информация

Публикация сетевых портов из docker-контейнеров в хост-систему по умолчанию работает через DNAT трафика на сетевой интерфейс контейнера с приложением. В связи с этим привычная многим фильтрация трафика в цепочке INPUT для docker-контейнеров не применяется, что может привести к несанкционированному доступу к приложениям извне.

Чтобы полностью контролировать доступ к серверу с приложениями в docker'е, необходимо фильтровать трафик также в цепочке FORWARD, а точнее в ее дочерней цепочке DOCKER-USER.

Пример

Warning

Применение приведённых в примере правил без адаптации к конкретному серверу может привести к недоступности сервисов

...

  1. Доступ к docker-контейнерам фильтруется в цепочке DOCKER-USER, а доступ к приложениям хост-системы — традиционно в цепочке INPUT.
  2. Для разрешающих правил цепочки DOCKER-USER применяется действие RETURN, потому что трафик дальше продолжает обрабатываться служебными правилами Docker Engine.
  3. Порты назначения в DOCKER-USER определяются с помощью модуля conntrack, поскольку на данном этапе пакеты уже прошли через DNAT.

Рекомендации

Список правил iptables стоит вести в отдельном файле (например, в /etc/network/iptables.up.rules) и загружать в систему до запуска Docker Engine.

...

Применять правила iptables в Debian Linux рекомендуется с использованием утилиты iptables-apply (в случае если эта утилита не получит подтверждения доступа к серверу, изменения в правилах будут отменены). При возникновении ошибок некорректные правила необходимо удалить из файла с правилами iptables, чтобы они не применялись при перезагрузке сервера.

Не рекомендуется

  1. Применять правила iptables «на горячую». Это может привести к расхождению между файлом с правилами и реальным состоянием iptables, которое станет явно заметным после перезагрузки сервера.
  2. Сохранять все правила iptables при выключении сервера и восстанавливать их при включении. Это приводит к восстановлению неактуальных («мусорных») правил docker'а по уже несуществующим экземплярам контейнеров, а также может привести к потере новых правил, если сервер был перезагружен по питанию.