Я пытаюсь разрешить только определенные IP-адреса для доступа к портам, отображаемым контейнерами Docker на хосте.Все остальные внешние IP-адреса не должны иметь к ним доступа (даже если я выставлю порт на 0.0.0.0
).В Интернете есть множество обходных путей, как этого добиться - начиная с отключения управления iptables для докера и управления всеми правилами iptables вручную (что не так круто, особенно если вам приходится иметь дело с входящей роутерной маршрутизацией Docker и т. Д.),до грязных решений со сбросом правил iptables с помощью cronjobs и пользовательских скриптов.Но, эй, у нас есть цепочка DOCKER-USER
, которая кажется подходящей для такого рода вещей?
Проблема Docker-vs-Firewall
Как мы знаем, при запуске Docker добавляет несколькоЦепочки и правила iptables, чтобы творить магию в сети.Дело в том, что он добавляет эти цепочки в самый верх цепочки FORWARD
при каждом перезапуске службы Docker, что означает, что все ваши предопределенные правила с отклонениями в этой цепочке становятся совершенно бесполезными. Докерская документация предлагает использовать цепочку DOCKER-USER
для такого рода вещей (правила в этой цепочке остаются постоянными с точки зрения докера и выполняются до любых других правил докера).
Из примераВ документации докера мы видим, что мы можем разрешить доступ для одного IP (и запретить для других), используя
-I DOCKER-USER -i eth0 ! -s 1.2.3.4 -j DROP
Эта команда работает, и только IP 1.2.3.4
может получить доступ к открытым портам докера.Но проблема в том, что в этом случае контейнеры не могут подключиться к Интернету .
Итак, ситуация такая ...
С
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
все работает и весь внешний трафик разрешен, а с:
Chain DOCKER-USER (1 references)
target prot opt source destination
DROP all -- !1.2.3.4 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
только IP 1.2.3.4
разрешен для доступа к открытым службам докера (что приятно!), но нет подключения к Интернету изнутри контейнеров.Это проблема.Другие правила iptables не добавляются - только по умолчанию для докера + этот пользовательский DROP в цепочке DOCKER-USER
.Я пытался RETURN
внутренних диапазонов IP-адресов, таких как 10.0.0.0/8
, 172.16.0.0/12
и 192.168.0.0/16
в этой цепочке (некоторые ветки форума предлагали попробовать это), поэтому моя цепочка выглядела так:
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- 192.168.0.0/16 0.0.0.0/0
RETURN all -- 172.16.0.0/12 0.0.0.0/0
RETURN all -- 10.0.0.0/8 0.0.0.0/0
ACCEPT all -- 1.2.3.4 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
, но все еще безуспешно - открытые порты докера доступны только с 1.2.3.4
(что опять хорошо), но все еще нет подключения к Интернету из контейнера.
Любые идеи о том, почему это происходит и как я могу это сделатьразрешить контейнерам общаться с внешним миром, ограничивая входящий трафик?
Заранее спасибо!