У меня есть контейнер Docker, открывающий порт 3306 для Интернета. Я хочу ограничить доступ к определенным публичным IP-адресам. В качестве примера возьмем 1.2.3.4.
В качестве дополнительного условия я хочу, чтобы правила сохранялись после перезапуска демона Docker и перезагрузки сервера. Это позволяет мне использовать iptables-persistent
(iptables-save
/iptables-restore
) для восстановления правил при перезагрузке сервера без dockerd
стартап мешает этому.
Я пробовал следующее:
Изменение 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 вставляет дополнительные правила в начало цепочки, и мои пользовательские правила в конечном итоге игнорируются.
Изменение 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
цепочка при перезапуске, и все пользовательские правила исчезнут.
Использовать --iptables=false
. Хотя это в принципе работает, это решение нарушает стандартные функции пересылки Docker и требует настройки правил пересылки вручную.
Я был бы удивлен, если бы не было правильного способа сделать это. Любые идеи?
PS: Я прочитал, но безрезультатно (например, Шаги по ограничению внешних подключений к контейнеру докеров с помощью iptables?, Docker - открытые порты, доступные извне - правила iptables игнорируются, но эти вопросы, похоже, не связаны с проблемой перезапуска.)
Dockersd можно запустить с опцией:
--iptables = ложь
Если не запускается вручную, а используется как служба, достаточно добавить или изменить следующую строку в файле конфигурации /etc/docker/daemon.json :
"iptables": ложь,
Более подробную документацию можно найти Вот