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 eth0
para 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 dock
zona 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 ACCEPT
política para o tráfego a partir fw
de dock
, se você já não abri-lo com fw
a 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.
IP_FORWARDING=Yes
eIP_FORWARDING=True
trabalhar também. Eu o tenho em vários roteadores de produção, mas sua resposta é muito mais clara que a minha. Ótimo trabalho./etc/shorewall/interfaces
.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:
fonte
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/masq
e 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
ifconfig
para 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 usandoifconfig
mais uma vez para procurar a interfacedocker0
.fonte
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
DOCKER
cadeia 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.fonte
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.
fonte
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:
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.
fonte
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.
fonte