Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

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

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

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

Пример

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

# DO NOT FORGET TO RESTART DOCKER AFTER APPLYING IPTABLES RULES

*mangle
:EXT-MANGLE - [0:0]
-A EXT-MANGLE -m state --state RELATED,ESTABLISHED -j ACCEPT
-A EXT-MANGLE -i lo -j ACCEPT
# Docker traffic
-A EXT-MANGLE -i docker0 -j ACCEPT
-A EXT-MANGLE -i br-+ -j ACCEPT
# ICMP
-A EXT-MANGLE -p icmp -j ACCEPT
# Latera GWs
-A EXT-MANGLE -s 188.120.244.146 -j ACCEPT
-A EXT-MANGLE -s 5.63.158.193 -j ACCEPT
# HTTP(S)
-A EXT-MANGLE -p tcp -m multiport --dports 80,443 -j ACCEPT
-A EXT-MANGLE -j RETURN
:PREROUTING ACCEPT [0:0]
-A PREROUTING -j EXT-MANGLE
-A PREROUTING -j MARK --set-xmark 0xffff
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*filter
:INPUT ACCEPT [0:0]
-A INPUT -m mark ! --mark 0xffff -j ACCEPT
-A INPUT -j DROP
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -m mark --mark 0xffff -j DROP
-A DOCKER-USER -j RETURN
COMMIT

В данном примере:

  1. Используется одна общая цепочка EXT-MANGLE в таблице mangle для фильтрации всего входящего трафика (для цепочек INPUT и FORWARD таблицы filter). Правила EXT-MANGLE отрабатывают в рамках цепочки PREROUTING (до замены порта при DNAT'е в таблице nat).
  2. В EXT-MANGLE перечисляются разрешающие правила с действием (целью) ACCEPT, после которого обработка трафика в mangle.PREROUTING прекращается.
  3. Трафик, который не попал под действие ACCEPT в EXT-MANGLE, помечается специальной отметкой.
  4. «Помеченный» трафик фильтруется при обработке в цепочках INPUT и FORWARD (в дочерней цепочке DOCKER-USER).

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

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

Изменение правил необходимо выполнять в следующем порядке:

  1. Исправление правил в файле с правилами iptables;
  2. Остановка docker'а (это приведёт к остановке всех приложений, работающих на сервере!);
  3. Применение правил iptables;
  4. Запуск docker'а;
  5. Проверка работы и доступности приложений (за основу можно взять карту проверок работы биллинга после обновлений).

Остановка docker'а для применения правил требуется для переинициализации правил iptables по контейнерам. К сожалению, переинициализировать их без остановки всего docker'а невозможно (см. https://github.com/moby/moby/issues/12294).

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

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

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