Meu objetivo é executar dois contêineres Docker em redes separadas e fazer com que meu host (Ubuntu 22.04) execute o NAT para que a primeira rede possa alcançar a segunda.
Minha configuração:
docker network create network1
docker network create network2
docker run --rm -it --network network1 ubuntu:22.04 bash
# In other terminal
docker run --rm -it --network network2 ubuntu:22.04 bash
O primeiro contêiner tem um endereço de 172.19.0.2 e o segundo tem um endereço de 172.20.0.2.
Executando ip addr
em meu host, vejo que as interfaces são br-deadbeef
e br-feedbeef
, respectivamente.
eu então corro
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i br-deadbeef -o br-feedbeef -j ACCEPT
iptables -A FORWARD -i br-feedbeef -o br-deadbeef -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o br-feedbeef -j MASQUERADE
no host como root.
No entanto, ping 172.20.0.2
desde o primeiro contêiner não é bem-sucedido. A execução do Wireshark no host mostra o pacote ICMP na br-deadbeef
rede indo de 172.19.0.2 para 172.20.0.2, mas não há resposta.
o que estou perdendo?
A questão são as seguintes
iptables
regras:Se você executar
iptables
com a opção verbose (-v
), verá que oDROP
alvo abaixoDOCKER-ISOLATION-STAGE-2
se refere àbr-deadbeef
interface (existe umaDROP
regra logo abaixo dela parabr-feedbeef
).Como você adicionou suas regras com
-A
, elas foram anexadas ao final da cadeia, o que significa que o salto paraDOCKER-ISOLATION-STAGE-1
e, portanto, paraDOCKER-ISOLATION-STAGE-2
teve prioridade.Uma correção simples seria adicionar suas regras com
-I
. Isso irá inseri-los no topo da corrente.