iptables configuração para contêineres docker

4

Estou usando o Docker 0.7.0 para criar contêineres no RedHat Enterprise Linux 6.5. Quando o firewall está desativado, os contêineres podem conversar com o mundo externo, mas quando o firewall está ativado, o contêiner não pode ser acessado de fora.

É assim que estou executando a janela de encaixe e mapeando uma porta do host para o contêiner

$ docker run -i  -t -p 3838:3838  shiny  "shiny-server"

Sem firewall, posso acessar o servidor Node.js em execução em um contêiner na porta 3838 da rede externa como http://servername:3838 , mas não com o firewall ativado.

Estas são as minhas regras de firewall padrão -

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Eu tentei abrir uma porta 3838 adicionando uma regra como abaixo, mas isso não funciona

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3838 -j ACCEPT

Docker está criando um NAT virtual na máquina host, estou sentindo que, de alguma forma, o firewall está bloqueando o encaminhamento de pacotes de eth0 para docker 0

Preciso de ajuda na configuração do iptables para que os contêineres docker possam ser acessados a partir da rede externa, sem a necessidade de desativar o firewall inteiro.

Esta é a saída de $ ifconfig (eu masquei o IP do servidor)

docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::87d:8dff:fed0:f16d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:408321 errors:0 dropped:0 overruns:0 frame:0
          TX packets:681809 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:126511933 (120.6 MiB)  TX bytes:924200959 (881.3 MiB)

eth0      Link encap:Ethernet  HWaddr 00:25:64:A8:5B:8F  
          inet addr:XXX.XXX.XXX.XXX  Bcast:XXX.XXX.XXX.XXX  Mask:255.255.240.0
          inet6 addr: XXXX::XXX:XXXX:XXXX:XXXX/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:29786186 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1137982 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4209047011 (3.9 GiB)  TX bytes:234657696 (223.7 MiB)
          Interrupt:17 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8444 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8444 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:4701771 (4.4 MiB)  TX bytes:4701771 (4.4 MiB)

Saída da versão do $ docker:

Client version: 0.7.0
Go version (client): go1.1.2
Git commit (client): 0ff9bc1/0.7.0
Server version: 0.7.0
Git commit (server): 0ff9bc1/0.7.0
Go version (server): go1.1.2
Last stable version: 0.7.2, please update docker

Saída de informações do $ docker:

Containers: 321
Images: 278
Driver: devicemapper
 Pool Name: docker-8:17-13239310-pool
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 56464.5 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 59.5 Mb
 Metadata Space Total: 2048.0 Mb
    
por Ajinkya Kulkarni 02.01.2014 / 21:47

2 respostas

4

Eu acredito que você também tem que permitir que os pacotes entrem na cadeia FORWARD. Você também precisa ter certeza de que as regras ALLOW que você está adicionando vêm antes das regras REJECT, já que o iptables trabalha em uma base de vitórias na primeira partida.

    
por 02.01.2014 / 21:53
4

Eu tive um problema semelhante, e a solução estava faltando Masquarading - também isso não explicaria porque funciona para você sem nenhuma regra de filtro.

Que tal você tentar adicionar as seguintes regras:

*filter
[...]
-A FORWARD -d 172.17.42.0/16 -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 172.17.42.0/16 -i docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o docker0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i docker0 -j REJECT --reject-with icmp-port-unreachable

*nat
[...]
-A POSTROUTING -s 172.17.42.0/16 ! -d 172.17.42.0/16 -p tcp -j MASQUERADE --to-ports 1016-65535
-A POSTROUTING -s 172.17.42.0/16 ! -d 172.17.42.0/16 -p udp -j MASQUERADE --to-ports 1016-65535
-A POSTROUTING -s 172.17.42.0/16 ! -d 172.17.42.0/16 -j MASQUERADE
    
por 11.06.2014 / 18:04