2016-12-12 8 views
4

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

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

Мы хотели бы остановить только исходящий трафик, а не входящий с 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 

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

+0

Я не эксперт iptables, но вы можете остановить Docker, изменяя ваши iptables, передав '--iptables = false' в качестве флага для демона при его запуске. – johnharris85

+0

Спасибо за совет, но мы хотим, чтобы Docker добавил свои собственные правила брандмауэра. –

+0

Все или ничего атм afaik. – johnharris85

ответ

3

Вы добавляете правила в неправильную цепочку. Трафик, созданный из контейнера докера, проходит через цепочку 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, чтобы лучше понять, как преобразуются адреса.

+0

Исходный ответ не сработал, пока мы не введем правила в цепочку 'FORWARD' в первых позициях с' -I FORWARD 1'. Я отредактировал ваш ответ, но если он противоречит правилам, пожалуйста, обновите его самостоятельно, чтобы другие люди могли воспользоваться. –

+0

Вставка этих правил в начало цепочки FORWARD не является хорошей идеей, поскольку она предотвратит входящий трафик с этих диапазонов IP (которые вы хотите разрешить). Или добавьте в конец цепочку FORWARD, или если у вас есть цепочка с именем 'DOCKER-ISOLATION', добавьте к ней. – Tanmay

+0

Исходный ответ не работает, потому что цепочка DOCKER используется только для исходящего трафика (док-станция0 до физического интерфейса). Я отредактировал ответ. – Tanmay

 Смежные вопросы

  • Нет связанных вопросов^_^