
DR Tentando mascarar tudo Docker
manualmente firewalld
.
Acabei de começar a usar firewalld
na minha máquina Debian 10 porque quero aprender como funciona.
Eu Docker
instalei no host e quero gerenciar o firewall sozinho para saber mais sobre o que o Docker faz, quais regras etc. ele se aplica quando os contêineres são criados e como o firewalld funciona.
Já o Debian 10 usa nftables
por padrão e usa algum tipo de iptables
wrapper para poder usar iptables
comandos para criar regras de firewall. Docker
funciona bem quando --iptables
está ativado.
Porém quero usar firewalld
com nftables
backend e pular tudo o que tem a ver, iptables
pois é confuso. Então /etc/systemd/system/multi-user.target.wants/docker.service
adicionei --iptables=false
para que o Docker não mexa no firewall. Eu limpei todas as regras do iptables etc. e tudo está bem até agora.
Agora vamos ao meu problema.
Todos os contêineres podem acessar o host e uns aos outros, mas não a Internet. Como todos eles estão rodando 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)
todas as veth
interfaces estão na docker0
ponte.
Então pensei que poderia criar uma nova zona chamada docker
e mascarar tudo da 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á o seguinte:
~# firewall-cmd --get-active-zones
docker
interfaces: docker0
public
interfaces: eno1
Ainda não consigo acessar a internet dos contêineres. Não tenho ideia se esse é o caminho certo a seguir ou o que estou perdendo. Qualquer ajuda é apreciada.
Responder1
No firewalld, o mascaramento precisa ser definido na zona que leva à Internet. No seu caso, essa parece ser a public
zona.