Общая информация
Публикация сетевых портов из docker-контейнеров в хост-систему по умолчанию работает через DNAT трафика на сетевой интерфейс контейнера с приложением. В связи с этим привычная многим фильтрация трафика в цепочке INPUT
для docker-контейнеров не применяется, что может привести к несанкционированному доступу к приложениям извне.
Чтобы полностью контролировать доступ к серверу с приложениями в docker'е, необходимо фильтровать трафик также в цепочке FORWARD
, а точнее в ее дочерней цепочке DOCKER-USER
.
Пример
Warning |
---|
Применение приведённых в примере правил без адаптации к конкретному серверу может привести к недоступности сервисов |
...
- Доступ к docker-контейнерам фильтруется в цепочке
DOCKER-USER
, а доступ к приложениям хост-системы — традиционно в цепочкеINPUT
. - Для разрешающих правил цепочки
DOCKER-USER
применяется действиеRETURN
, потому что трафик дальше продолжает обрабатываться служебными правилами Docker Engine. - Порты назначения в
DOCKER-USER
определяются с помощью модуляconntrack
, поскольку на данном этапе пакеты уже прошли через DNAT.
Рекомендации
Список правил iptables стоит вести в отдельном файле (например, в /etc/network/iptables.up.rules
) и загружать в систему до запуска Docker Engine.
...
Применять правила iptables в Debian Linux рекомендуется с использованием утилиты iptables-apply (в случае если эта утилита не получит подтверждения доступа к серверу, изменения в правилах будут отменены). При возникновении ошибок некорректные правила необходимо удалить из файла с правилами iptables, чтобы они не применялись при перезагрузке сервера.
Не рекомендуется
- Применять правила iptables «на горячую». Это может привести к расхождению между файлом с правилами и реальным состоянием iptables, которое станет явно заметным после перезагрузки сервера.
- Сохранять все правила iptables при выключении сервера и восстанавливать их при включении. Это приводит к восстановлению неактуальных («мусорных») правил docker'а по уже несуществующим экземплярам контейнеров, а также может привести к потере новых правил, если сервер был перезагружен по питанию.