У меня проблема, когда порты, открытые для приложений, работающих в нашей системе, в контейнерах докеров остаются открытыми для всего мира, несмотря на конфигурацию iptables, предназначенную для ограничения доступа.
Мне кажется, что проблема может быть связана с тем, что демон docker добавляет правила в iptables при запуске. Я также знаю флаги --icc=true|false
, --ip-forward=true|false
и --iptables=true|false
но я не уверен, какую комбинацию этих флагов мне следует применять. я пытался --icc=false
и --ip-forward=false
но ни один из них не дал желаемого эффекта. Я ненавижу использовать --iptables=false
потому что демон 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
А вот как обстоят дела с запущенным демоном докера:
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 является источником проблемы, но я не вижу, как решить эту проблему, потому что кажется, что оно вставлено демоном докера в начало цепочки.
Итак, может ли кто-нибудь посоветовать мне, что мне нужно сделать, чтобы убедиться, что порты 7990, 8090 и т. Д. Не открыты миру при запуске докера?
Спасибо
Ричард
В DOCKER
chain - это настраиваемая цепочка, определенная в цепочке FORWARD. Когда пакет попадает any
интерфейс и привязан к интерфейсу моста docker0, он отправляется в настраиваемую цепочку DOCKER.
pkts bytes target prot opt in out source destination 54492 21M DOCKER all -- any docker0 anywhere anywhere
Теперь цепочка DOCKER будет принимать все входящие пакеты, кроме пакетов, исходящих от docker0, и отправлять их на IP-адрес контейнера (172.x.x.x) и порт, в данном случае, скажем, 7990.
pkts bytes target prot opt in out source destination 86 7048 ACCEPT tcp -- !docker0 docker0 anywhere 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 FORWARD '!' -s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 7990 -j DROP
Это предотвратит пересылку любых пакетов в контейнер с указанным IP: Port, если они не поступают из внутренней сети. Вы можете изменить IP-адрес источника / назначения и порт в зависимости от ваших настроек.
Итак, это был бы комментарий, но не stree .. serverfault rep для него.
Вы пробовали решение, размещенное здесь: http://blog.viktorpetersson.com/post/101707677489/the-dangers-of-ufw-docker
использования этого флага --iptables=false
как такой DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"
?