Разрешение некоторых IP-адресов в цепочке DOCKER-USER для входящего трафика, отклонение всех остальных - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь разрешить только определенные 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 (что опять хорошо), но все еще нет подключения к Интернету из контейнера.

Любые идеи о том, почему это происходит и как я могу это сделатьразрешить контейнерам общаться с внешним миром, ограничивая входящий трафик?

Заранее спасибо!

...