Usando Docker com firewalld

TL; DR tentando mascarar tudo, desde Docker com firewalld manualmente.

Eu apenas comecei a usar firewalld na minha máquina Debian 10 desde que eu quero aprender como funciona.

Eu tenho Docker instalado no host e quero gerenciar o firewall sozinho para saber mais sobre o que o Docker faz, quais regras etc. aplica-se quando os contêineres são criados e como o firewalld funciona.

Como o Debian 10 usa nftables por padrão e usar algum tipo de iptables wrapper para poder usar iptables comandos para criar regras de firewall. Docker funciona muito bem quando --iptables está ativado.

No entanto, eu quero usar firewalld com nftables backend e pular tudo o que tem a ver com iptables já que é apenas confuso. Então em /etc/systemd/system/multi-user.target.wants/docker.service Eu adicionei --iptables=false portanto, o Docker não mexe com o firewall.Eu corei todas as regras iptables etc. e tudo é bom até agora.

Agora para o meu problema.

Todos os contêineres podem acessar o host e uns aos outros, mas não a internet.Como todos eles estão sendo executados em 172.17.0.0/16 e meu host está em 192.168.9.0 / 24, preciso mascarar o tráfego dos contêineres.

Não consigo encontrar muitas informações sobre como gerenciar o firewall manualmente ao usar o Docker e, como sou novo no firewalld, estou apenas supondo.

Minhas interfaces são as seguintes:

eno1 (main interface)docker0 (docker bridge)veth******* (one for each container)

todos os veth as interfaces estão no docker0 ponte.

Então eu pensei que poderia criar uma nova zona chamada docker e mascarar tudo, desde o docker0 ponte.

~# firewall-cmd --permanent --new-zone=docker~# firewall-cmd --permanent --zone=docker --change-interface=docker0~# firewall-cmd --permanent --zone=docker --add-rich-rule='rule family="ipv4" source address=172.17.0.0/16 masquerade'~# firewall-cmd --reload

Listar as zonas ativas me dá isso:

~# firewall-cmd --get-active-zonesdocker  interfaces: docker0public  interfaces: eno1

Ainda não consigo acessar a internet a partir dos contêineres.Não tenho ideia se esse é o caminho certo ou o que estou perdendo.Qualquer ajuda é apreciada.

Em firewalld, masquerading precisa ser definido na zona que leva à Internet. No seu caso, isso parece ser o public zona.