Назад | Перейти на главную страницу

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

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