
У меня возникла проблема, из-за которой порты, доступные приложениям, работающим в нашей системе в контейнерах Docker, остаются открытыми для всего мира, несмотря на конфигурацию iptables, предназначенную для ограничения доступа.
Мне кажется, что проблема может быть связана с тем, что демон docker добавляет правила в iptables при запуске. Я также знаю о флагах --icc=true|false
, --ip-forward=true|false
но --iptables=true|false
не уверен, какую комбинацию этих флагов мне следует применять. Я пробовал --icc=false
, --ip-forward=false
но ни один из них не дал желаемого эффекта. Я не хочу использовать их, --iptables=false
потому что демон docker явно добавляет ряд правил, которые мне придется настраивать вручную, если они все еще нужны.
Вот состояние правил перед запуском демона Docker:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 REJECT all -- !lo any anywhere loopback/8 reject-with icmp-port-unreachable
0 0 DROP tcp -- any any anywhere anywhere tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
0 0 DROP all -f any any anywhere anywhere
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
82 8831 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
0 0 ACCEPT tcp -- any any anywhere anywhere multiport dports ssh
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 1> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 2> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
0 0 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
24 2489 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
77 10080 ACCEPT all -- any any anywhere anywhere
А вот как это выглядит при запущенном демоне Docker:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 REJECT all -- !lo any anywhere loopback/8 reject-with icmp-port-unreachable
0 0 DROP tcp -- any any anywhere anywhere tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
0 0 DROP all -f any any anywhere anywhere
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
1335 230K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
1 32 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
7 380 ACCEPT tcp -- any any anywhere anywhere multiport dports ssh
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 1> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 2> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
35 2016 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
62 3672 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
54492 21M DOCKER all -- any docker0 anywhere anywhere
51882 20M ACCEPT all -- any docker0 anywhere anywhere ctstate RELATED,ESTABLISHED
58371 9122K ACCEPT all -- docker0 !docker0 anywhere anywhere
0 0 DROP all -- docker0 docker0 anywhere anywhere
1186 121K REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2090 263K ACCEPT all -- any any anywhere anywhere
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
86 7048 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:7990
1639 395K ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:7999
791 151K ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.3 tcp dpt:http-alt
20 1898 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.4 tcp dpt:8090
49 4561 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.5 tcp dpt:18080
25 3642 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.6 tcp dpt:8095
Также есть ряд правил POSTROUTING & MASQUERADE, которые не отображаются с iptables -L
, только когда вы используете iptables-save
. Я также не уверен в значимости этих правил.
Я подозреваю, что источником проблемы является целевое правило DOCKER в цепочке FORWARD, но не вижу, как решить эту проблему, поскольку оно, по-видимому, вставляется демоном Docker в начало цепочки.
Итак, может ли кто-нибудь посоветовать мне, что мне нужно сделать, чтобы убедиться, что порты 7990, 8090 и т. д. не будут видны внешнему миру при работе Docker?
Спасибо
Ричард
решение1
Цепочка DOCKER
— это пользовательская цепочка, определенная в цепочке FORWARD. Когда пакет достигает any
интерфейса и привязывается к интерфейсу моста docker0, он отправляется в пользовательскую цепочку DOCKER.
pkts байт цель prot opt in out источник назначение 54492 21M DOCKER все -- любой docker0 где угодно где угодно
Теперь цепочка DOCKER будет принимать все входящие пакеты, за исключением тех, которые поступают от docker0, и отправлять их на IP-адрес контейнера (172.xxx) и порт, в данном случае, скажем, 7990.
pkts байт цель prot opt in out источник назначение 86 7048 ПРИНЯТЬ tcp -- !docker0 docker0 где угодно 172.17.0.2 tcp dpt:7990
Если бы вы опубликовали вывод iptables -t nat -L -n
, вы бы увидели DNAT
правило, которое выполняет переадресацию портов с хоста на контейнер, например, пакеты, поступающие на интерфейс хоста на 49154, будут переадресовываться на IP-адрес контейнера 172.17.0.2 и порт 7990.
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49154 to:172.17.0.2:7990
Вы можете заблокировать попадание пакетов в контейнер, ограничив исходный IP любого 0.0.0.0, например, разрешая только пакеты, исходящие из вашей внутренней сети. Чтобы разрешить соединения с портом контейнера 7990 только из вашей внутренней сети, скажем, 192.168.1.0/24, вы можете выполнить следующую команду -
/sbin/iptables -I ПЕРЕНАПРАВИТЬ '!' -s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 7990 -j ОТБРОСИТЬ
Это предотвратит пересылку любых пакетов в контейнер указанного IP:Port, если только они не поступают из внутренней сети. Вы можете изменить исходный/целевой IP и порт в зависимости от ваших настроек.
решение2
Итак, это был бы комментарий, но не ул.. представитель serverfault для него.
Пробовали ли вы решение, размещенное здесь:http://blog.viktorpetersson.com/post/101707677489/опасности-ufw-docker
использовать этот флаг --iptables=false
таким образом DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"
?