Configurando o iptables para permitir que os contêineres do Docker acessem

1

Eu tenho um servidor CentOS executando o Docker e estou tentando protegê-lo usando o iptables. E eu não posso descobrir como deixar os contêineres acessarem a internet, sem que suas portas sejam acessíveis de fora.

Eu parei o Docker mexendo com o meu iptables usando o comando '--iptables = false' e agora estou lutando para configurar o iptables manualmente.

Eu quero configurar o firewall para que:

  • As entradas são descartadas, a menos que eu as abra especificamente
  • Os contêineres podem se comunicar entre si por meio da conexão localhost
  • Os contêineres podem fazer conexões com a internet para fazer o download do código, etc.

Eu tenho os dois primeiros, mas o que eu tente habilitar o terceiro invalida o primeiro!

Eu tenho dois contêineres de teste. Um contêiner httpd encaminhando sua porta de saída da web 3333 - e outro contêiner executando o Debian.

O IPTables é configurado com

 iptables -P INPUT DROP
 iptables -P FORWARD DROP
 iptables -P OUTPUT ACCEPT

 iptables -A INPUT -i lo -j ACCEPT

Então, do lado de fora, não consigo acessar o myserver: 3333. Mas eu posso executar a partir do host: curl localhost: 3333 e ter acesso.

Eu adicionei então:

iptables -A INPUT -i docker0 -j ACCEPT

E agora posso rodar em meu contêiner de teste de teste debian 172.17.0.1:3333 e isso funciona bem também.

Mas se eu estiver no contêiner de teste e tentar: curl httpbin.org/ip não obtenho resposta.

Eu estava lendo no link e tentei o sugerido:

iptables-A FORWARD -i docker0 -o eth0 -j ACCEPT
iptables-A FORWARD -i eth0 -o docker0 -j ACCEPT

Com isso, posso agora sair do contêiner de teste, mas isso também abre o 3333 para o mundo! Como configuro o iptables para permitir que o contêiner acesse, mas impede o acesso em?

    
por Dave Alger 11.11.2017 / 06:26

2 respostas

1

O comportamento padrão do firewall irá atendê-lo bem. Para limitar o acesso de saída, use um proxy com ACLs nos domínios de destino. Você pode até limitar o acesso com base no contêiner; Fiz algumas funcionalidades para fazer isso na semana passada usando o tipo de ACL ident do Squid e um servidor de ident personalizada que retorna o nome do container.

Detalhes no link

Você também precisaria impedir que seu servidor de contêiner fizesse conexões diretamente sem passar pelo proxy.

    
por 11.11.2017 / 08:20
1

A solução que encontrei, que parece fornecer o que eu quero é:

iptables -A INPUT -i docker0 -j ACCEPT
iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Isso parece permitir

  • Comunicação entre contêineres docker
  • Comunicação de containers para a internet (através da eth0 no meu servidor)
  • Comunicação de volta em resposta (relacionada / estabelecida)

Mas, o acesso a essas portas não é aberto ao mundo externo.

Eu acho que o meu problema é que eu não entendi que a instrução relacionada / estabelecida que eu adicionei ao INPUT não traduziu para FORWARD.

    
por 13.11.2017 / 13:18