Правила брандмауэра не ограничивают доступ к Docker Web Apps

Правила брандмауэра не ограничивают доступ к Docker Web Apps

У меня возникла проблема, из-за которой порты, доступные приложениям, работающим в нашей системе в контейнерах 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"?

Связанный контент