Docker & Shorewall

16

Estou usando o Shorewall no meu servidor como um firewall autônomo simples e também gostaria de usar o Docker .

Usando um contêiner do Docker e seu redirecionador de portas, o docker configura suas próprias regras / cadeias de iptables, que serão eliminadas se o shorewall for reiniciado. Portanto, o contêiner ficará inacessível .

Alguém conseguiu salvar / restaurar as regras da janela de encaixe em uma reinicialização em shorewall ou alguém tem outra solução alternativa?

Veja também:

jaltek
fonte

Respostas:

19

As seguintes alterações na configuração devem garantir o fluxo de tráfego entre o Docker e o host Shorewall. Testado no Shorewall 4.5.21.9, mas deve ser aplicado às versões mais recentes:

/etc/shorewall/shorewall.conf

Verifique se o encaminhamento de IP está ativado (a maioria dos itens de configuração é Sim / Não, mas esse é "Ativado"):

IP_FORWARDING=On

/ etc / shorewall / masq

Habilite o mascaramento (NAT) para sua rede privada do Docker (se você usar uma rede diferente, por exemplo, você iniciar o docker com e --bip=#.#.#.#/#, em seguida, alterar). Mude eth0para qualquer interface na máquina host com conectividade externa:

#INTERFACE:DEST         SOURCE
eth0                    172.17.0.0/16

/ etc / shorewall / interfaces

Adicione uma entrada de interface para que o Shorewall saiba a qual interface a dockzona se relaciona:

#ZONE           INTERFACE               OPTIONS
dock            docker0

/ etc / shorewall / areas

Crie uma nova zona; note, dockeré muito longo e causará um erro "nome de zona inválido".

#ZONE   INTERFACE
dock    ipv4

/ etc / shorewall / policy

Você provavelmente deseja permitir que os contêineres do Docker conversem com a máquina host e a Internet, portanto, este é um bom ponto de partida:

#SOURCE         DEST            POLICY
# ...(other policies)...
dock            all             ACCEPT
# ...(other policies, catch-all)...

Você também pode precisar de um semelhante ACCEPTpolítica para o tráfego a partir fwde dock, se você já não abri-lo com fwa all.

Você pode reforçar isso ainda mais nos arquivos de políticas ou regras, conforme necessário. Por exemplo, o acima exposto não permite explicitamente que o tráfego externo alcance seus contêineres do Docker; verifique suas outras zonas / políticas / regras para isso.

inquieto
fonte
11
IP_FORWARDING=Yese IP_FORWARDING=Truetrabalhar também. Eu o tenho em vários roteadores de produção, mas sua resposta é muito mais clara que a minha. Ótimo trabalho.
Aaron C. de Bruyn
Perdoe minha ignorância - quando reinicio o shorewall após adicionar as regras fornecidas, recebo um aviso de que o dock é uma "INTERFACE VAZIA" ... e, de fato, lendo o acima, não está claro para mim como o shorewall pode inferir a conexão entre o 172.17 endereços e a zona 'dock'. Estou perdendo algo óbvio sobre como o shorewall funciona?
John Clements
Desculpe por isso, perdi uma alteração no arquivo de interfaces. Eu editei a resposta, consulte a nova seção /etc/shorewall/interfaces.
Fazy
Obrigado. Também está funcionando bem com o shorewall 5 (que reconhece o docker), para que o host junte seus contêineres.
Drasill
as configurações Masq são muito importantes, caso contrário, uma janela de encaixe-container não será capaz de acessar um outro recipiente usando um IP externo - ele vai ficar bloqueado
Eugen Mayer
6

Desde que o Docker introduziu seu recurso de isolamento de rede, as outras soluções mencionadas aqui não serão mais suficientes se você desejar usar redes personalizadas. O Shorewall 5.0.6 apresenta suporte para o Docker, incluindo redes Docker. Este:

  • Permite que shorewall e docker sejam iniciados / parados / reiniciados em qualquer ordem
  • Evita a necessidade de manter um script de extensão
linuxhackerman
fonte
2

Só descobri na minha caixa. Verifique se o /etc/shorewall.conf possui:

IP_FORWARDING=Yes

O Docker depende do encaminhamento, e eu espaçei que 'fantoche' o define como 'Não' em todos os meus servidores.

Atualização: você provavelmente também precisará mascarar o tráfego proveniente do docker na sua interface WAN.

Edite /etc/shorewall/masqe você precisará de uma linha semelhante a:

br0 172.17.0.0/12

Nesse caso, minha interface WAN é realmente br0 (uma ponte), mas a sua provavelmente será algo como eth0. (Use ifconfigpara ver suas interfaces e seus endereços IP). Na minha máquina, a janela de encaixe usa 172.17.0.0/24, que é um intervalo de endereços privados RFC1918. Isso pode ser diferente em outros sistemas, mas você pode ver o intervalo usando ifconfigmais uma vez para procurar a interface docker0.

Aaron C. de Bruyn
fonte
2

Você pode garantir que o conjunto de regras do Docker sobreviva a uma reinicialização em shorewall criando scripts de extensão que salvam a DOCKERcadeia antes da reinicialização e depois restauram-na novamente. Acabei de publicar um post com um exemplo de como fazer isso , embora tenha certeza de que está longe de ser o único método possível.

mulher
fonte
0

O serviço de docker pode ser reiniciado sem afetar os contêineres em execução e pode ser executado após uma reinicialização do Shorewall para recarregar as regras específicas do docker. Obviamente haverá um curto período de tempo em que a rede do (s) contêiner (es) será interrompida.

Isso é verdade pelo menos nas minhas poucas instalações do Archlinux.

átomo
fonte
0

A ação de atualização não limpa a tabela de ip, portanto, se você quiser atualizar regras ou políticas, execute a atualização em vez de reiniciar:

sudo shorewall refresh

Obviamente, o problema ainda permanece se você realmente precisar reiniciar o shorewall. Em seguida, você deve reiniciar a janela de encaixe e recarregar seus contêineres.

lenybernard
fonte
0

Uma opção possível é executar o Docker com a opção --net = host, para permitir que o aplicativo em contêiner acesse a rede do host sem encaminhamento de IP e NAT.

DukeLion
fonte