Назад | Перейти на главную страницу

Docker: правильный способ ограничить доступ к определенным IP-адресам

У меня есть контейнер Docker, открывающий порт 3306 для Интернета. Я хочу ограничить доступ к определенным публичным IP-адресам. В качестве примера возьмем 1.2.3.4.

В качестве дополнительного условия я хочу, чтобы правила сохранялись после перезапуска демона Docker и перезагрузки сервера. Это позволяет мне использовать iptables-persistent (iptables-save/iptables-restore) для восстановления правил при перезагрузке сервера без dockerd стартап мешает этому.

Я пробовал следующее:

  1. Изменение FORWARD цепочка:

    iptables -I FORWARD -p tcp --dport 3306 -j REJECT
    iptables -I FORWARD -p tcp --dport 3306 -s 1.2.3.4 -j ACCEPT
    

    Это работает, когда это делается после запуска демона Docker. При перезапуске демона Docker вставляет дополнительные правила в начало цепочки, и мои пользовательские правила в конечном итоге игнорируются.

  2. Изменение DOCKER цепочка:

    iptables -N DOCKER # if chain does not yet exist
    iptables -I DOCKER -p tcp --dport 3306 -j REJECT
    iptables -I DOCKER -p tcp --dport 3306 -s 1.2.3.4 -j ACCEPT
    

    Это работает до тех пор, пока dockerd перезапускается. Это выглядит как dockerd очищает DOCKER цепочка при перезапуске, и все пользовательские правила исчезнут.

  3. Использовать --iptables=false. Хотя это в принципе работает, это решение нарушает стандартные функции пересылки Docker и требует настройки правил пересылки вручную.

Я был бы удивлен, если бы не было правильного способа сделать это. Любые идеи?

PS: Я прочитал, но безрезультатно (например, Шаги по ограничению внешних подключений к контейнеру докеров с помощью iptables?, Docker - открытые порты, доступные извне - правила iptables игнорируются, но эти вопросы, похоже, не связаны с проблемой перезапуска.)

Dockersd можно запустить с опцией:

--iptables = ложь

Если не запускается вручную, а используется как служба, достаточно добавить или изменить следующую строку в файле конфигурации /etc/docker/daemon.json :

"iptables": ложь,

Более подробную документацию можно найти Вот