Usando o iptables do host para impedir o acesso às portas expostas do contêiner do docker

1

Eu tenho um host que executa alguns contêineres do Docker.

Esse host tem algumas interfaces de rede, meu objetivo é tornar algumas portas expostas a partir de contêineres acessíveis apenas por determinadas interfaces e impedir o acesso de outras pessoas.

Eu gostaria de usar o iptables do host para isso.

Mas é impossível fazer simplesmente com:

iptables -I INPUT -i vlan2 --dport 80 -j DROP

porque os pacotes são encaminhados pelo pré-layout.

iptables -t nat -L PREROUTING                                                                                                                               2
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain DOCKER (2 references)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere             tcp dpt:mysql to:172.17.0.2:33066
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:172.17.0.4:80

Existem duas portas expostas 80 e 3306 em contêineres diferentes, e eu quero torná-lo inacessível a partir da interface vlan2

Depois que adicionei isso:

iptables -I FORWARD -i vlan2 -p tcp --dport 80 -j REJECT

O servidor da Web parou para funcionar, mas

iptables -I FORWARD -i vlan2 -p tcp --dport 3306 -j REJECT

não impede a conexão com o mysql, eu ainda sou capaz de se conectar. E o tcpdump prova isso:

tcpdump -n -i vlan2 port 3306
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vlan2, link-type EN10MB (Ethernet), capture size 262144 bytes
22:48:13.066636 IP 3.2.2.2.47259 > 1.1.2.3.3306: Flags [S], seq 3619220560, win 29200, options [mss 1460,sackOK,TS val 90183390 ecr 0,nop,wscale 7], length 0
22:48:13.066740 IP 1.1.2.3.3306 > 3.2.2.2.47259: Flags [S.], seq 2743923517, ack 3619220561, win 28960, options [mss 1460,sackOK,TS val 10989883 ecr 90183390,nop,wscale 7], length 0

E não consigo entender a diferença entre essas duas regras.

Como usar o iptables do host para impedir o acesso a contêineres

    
por Korjavin Ivan 24.03.2015 / 18:56

1 resposta

1

O problema é que sua regra NAT na cadeia PREROUTING da tabela nat traduz a porta 3306 do host para 172.17.0.2: 33066 e não para 172.17.0.2: 3306 Assim, a regra na cadeia FORWARD da tabela de filtros não corresponde a nada, pois tenta descartar o tráfego encaminhado para a porta de destino 3306 .

    
por 24.03.2015 / 21:35