
Tenho um problema onde as portas expostas a aplicativos em execução em nosso sistema em contêineres docker permanecem abertas para o mundo, apesar da configuração do iptables projetada para restringir o acesso.
Parece-me que o problema pode estar relacionado ao daemon do docker adicionando regras ao iptables na inicialização. Também estou ciente dos sinalizadores --icc=true|false
, --ip-forward=true|false
mas --iptables=true|false
não tenho certeza de qual combinação desses sinalizadores devo aplicar. Eu tentei --icc=false
e --ip-forward=false
mas nenhum deles teve o efeito desejado. Detesto usar --iptables=false
porque o daemon docker está claramente adicionando uma série de regras, que eu teria que configurar manualmente se ainda fossem necessárias.
Este é o estado das regras antes do daemon do docker ser iniciado:
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
E é assim que acontece com o daemon docker em execução:
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
Há também uma série de regras POSTROUTING & MASQUERADE, que não são exibidas com iptables -L
, apenas quando você usa iptables-save
. Também não tenho certeza do significado disso.
Suspeito que a regra de destino DOCKER na cadeia FORWARD seja a origem do problema, mas não consigo ver como resolver esse problema porque parece ter sido inserida pelo daemon docker no início da cadeia.
Então, alguém pode me aconselhar sobre o que preciso fazer para garantir que as portas 7990, 8090 etc. não sejam expostas ao mundo ao executar o docker?
Obrigado
Ricardo
Responder1
A DOCKER
cadeia é uma cadeia personalizada definida na cadeia FORWARD. Quando um pacote atinge any
a interface e é vinculado à interface da ponte docker0, ele é enviado para a cadeia DOCKER personalizada.
pacotes bytes alvo prot opt in out origem destino 54492 21M DOCKER all -- qualquer docker0 em qualquer lugar em qualquer lugar
Agora a cadeia DOCKER pegará todos os pacotes recebidos, exceto aqueles vindos do docker0, e os enviará para um IP de contêiner (172.xxx) e porta, neste caso, digamos 7990.
pacotes bytes alvo prot opt in out origem destino 86 7048 ACEITAR tcp -- !docker0 docker0 em qualquer lugar 172.17.0.2 tcp dpt:7990
Se você postasse a saída de iptables -t nat -L -n
, veria a DNAT
regra que faz o encaminhamento da porta do host para o contêiner, digamos que os pacotes que atingem a interface do host em 49154 seriam encaminhados para a porta do contêiner IP 172.17.0.2 e porta 7990.
DNAT tcp - 0.0.0.0/0 0.0.0.0/0 tcp dpt:49154 a:172.17.0.2:7990
Você pode impedir que os pacotes cheguem ao contêiner limitando o IP de origem de qualquer 0.0.0.0 para permitir apenas os pacotes originados de sua rede interna, por exemplo. Para permitir conexões com a porta do contêiner 7990 apenas de sua rede interna, digamos 192.168.1.0/24, você pode executar o seguinte comando -
/sbin/iptables -I FORWARD '!' -s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 7990 -j DROP
Isso impediria o encaminhamento de quaisquer pacotes para um contêiner do IP:Port especificado, a menos que eles viessem da rede interna. Você pode modificar o IP e a porta de origem/destino dependendo da sua configuração.
Responder2
Então, isso seria um comentário, mas nenhum representante stree.. serverfault para isso.
Você já tentou a solução postada aqui:http://blog.viktorpetersson.com/post/101707677489/the-dangers-of-ufw-docker
de usar esse sinalizador --iptables=false
assim DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"
?