Configure iptables para proteger um servidor que esteja executando contêineres do Docker

2

Eu tento usar o Docker para executar dois contêineres (o problema não é específico para eles):

  • MySQL (contêiner oficial)
  • Redmine (contêiner oficial)

Cada contêiner tem uma porta encaminhada:

  • MySQL: 127.0.0.1:3000 -> 3000/tcp
  • Redmine: 127.0.0.1:3306 -> 3306/tcp

Como você pode ver, o objetivo é torná-los acessíveis somente dentro do host .

Um servidor Nginx (não instalado via Docker) ouve a porta 80 e redireciona qualquer solicitação para a porta do contêiner Redmine (usando funcionalidades de proxy: proxy_pass etc.).

Tudo funciona perfeitamente neste momento, quando eu vou ao ip do servidor, posso acessar o Redmine.

Mas, eu gostaria de adicionar alguma segurança usando o iptables. Então, o objetivo é:

  • DROP all por padrão (este ponto é ok)
  • Permitir que o Docker faça seus negócios somente dentro do host local
  • Permitir que os contêineres acessem a Internet (para baixar dependências, atualizações ...)
  • Permitir o acesso a SSH e Nginx (ok também)

Primeiro, tentei adicionar a opção --iptables=false para impedir que o docker mexesse em meus iptables. Depois de uma reinicialização, pensei que, com o iptables limpo (todas as políticas estão definidas como ACCEPT por padrão, então nada é feito ainda), tudo funcionaria bem. Mas esse não é o caso, eu recebo uma resposta "502 Bad Gateway" do Nginx. Eu realmente não entendo porque o Docker é incapaz de trabalhar sem adicionar regras adicionais (se tudo estiver aberto, deve funcionar ... Não?).

Eu tentei ler os documentos sobre redes avançadas no Docker, eu também tentei vários tutoriais, mas não consigo encontrar o que está bloqueando o Docker:

Eu não sou um especialista em Linux / Docker / SysAdmin, então talvez seja óbvio para alguns de vocês (pelo menos, eu desejo!).

Não hesite em me perguntar mais detalhes, se necessário.

Agradecemos antecipadamente pela sua resposta.

    
por Gaël 29.09.2016 / 13:08

1 resposta

0

O

Docker, por padrão, adiciona regras iptables para que as portas expostas ao host possam ser acessadas. Você pode tentar adicionar isso à cadeia DOCKER-USER:

iptables -I DOCKER-USER -i eth0 ! -s 127.0.0.0/8 -j DROP

Isso eliminará todos os pacotes provenientes da interface externa (neste caso, eth0) e não terá origem de loopback. Isso pode precisar ser executado após iniciar o serviço de encaixe.

Atualização: Como Luca disse, você provavelmente só precisa

iptables -I DOCKER-USER -i eth0 -j DROP

ou

iptables -I DOCKER-USER ! -s 127.0.0.0/8 -j DROP
    
por 07.04.2018 / 12:40