Блокировать исходящие подключения к частным IP-адресам из контейнеров Docker.

Некоторые службы, которые мы запускаем на наших серверах с помощью Docker, пытаются подключиться к частным IP-адресам (10.0.0.0/8, 192.0.0.0/16, 172.16.0.0/12, 100.64.0.0/10).

Такое поведение является нормальным, но наш поставщик серверов обнаруживает этот трафик и отправляет нам предупреждения.

Мы хотели бы остановить только исходящий трафик, а не входящий с iptables.

Это наша текущая установка:

-A OUTPUT -d 192.168.0.0/16 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -d 100.64.0.0/10 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -d 172.16.0.0/12 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -d 10.0.0.0/8 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable

Однако это не работает, потому что Docker создает следующие правила:

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DOCKER-ISOLATION  all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere

Для услуг:

Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:1234
ACCEPT     tcp  --  anywhere             172.17.0.4           tcp dpt:1234

Окончательно:

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Любая обратная связь приветствуется.


person John L. Jegutanis    schedule 12.12.2016    source источник
comment
Я не эксперт по iptables, но вы можете запретить Docker изменять ваши iptables, передав демону --iptables=false в качестве флага при его запуске.   -  person johnharris85    schedule 12.12.2016
comment
Спасибо за совет, но мы хотим, чтобы Docker добавил свои собственные правила брандмауэра.   -  person John L. Jegutanis    schedule 12.12.2016
comment
Все или ничего на самом деле.   -  person johnharris85    schedule 12.12.2016


Ответы (1)


Вы добавляете правила не в ту цепочку. Трафик, исходящий из контейнера Docker, проходит через цепочку FORWARD таблицы filter, а не через цепочку OUTPUT. Это связано с тем, что с точки зрения хост-компьютера трафик поступает с интерфейса docker0, а хост-компьютер просто действует как сервер пересылки.

Чтобы различать входящий и исходящий трафик, используйте параметры -i и -o для указания интерфейса. Также вы не можете использовать uid, чтобы определить, исходит ли трафик из док-контейнера (поскольку данные не происходят локально). Для этого достаточно проверки входящего интерфейса.

Итак, добавьте следующие правила в цепочку DOCKER-ISOLATION (которая вызывается из цепочки FORWARD):

-A DOCKER-ISOLATION -d 192.168.0.0/16 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable
-A DOCKER-ISOLATION -d 100.64.0.0/10 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable
-A DOCKER-ISOLATION -d 172.16.0.0/12 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable
-A DOCKER-ISOLATION -d 10.0.0.0/8 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable

Замените docker0 именем виртуального интерфейса, созданного докером.

(Примечание. Если цепочка DOCKER-ISOLATION не существует, добавьте ее непосредственно в цепочку FORWARD).

Также посмотрите на вывод iptables -vL и iptables -t nat -vL, чтобы лучше понять, как переводятся адреса.

person Tanmay    schedule 14.12.2016
comment
Первоначальный ответ не работал, пока мы не вставили правила в цепочку FORWARD в первые позиции с -I FORWARD 1. Я отредактировал ваш ответ, но если он противоречит правилам, обновите его самостоятельно, чтобы другие люди могли получить пользу. - person John L. Jegutanis; 19.12.2016
comment
Вставлять эти правила в начало цепочки FORWARD — не лучшая идея, так как это предотвратит входящий трафик с этих диапазонов IP-адресов (которые вы хотите разрешить). Либо добавьте в конец цепочки FORWARD, либо, если у вас есть цепочка с именем DOCKER-ISOLATION, добавьте к ней. - person Tanmay; 27.12.2016
comment
Исходный ответ не сработал, потому что цепочка DOCKER используется только для исходящего трафика (от docker0 до физического интерфейса). Я отредактировал ответ. - person Tanmay; 27.12.2016