Temos o seguinte cenário, um host do Docker com duas NICs em duas sub-redes, ens8: IP 192.168.100.74/24
e ens9: IP 172.20.102.24/25
, a ponte padrão docker0 IP 172.17.0.1/16
e uma segunda ponte app_net IP 172.21.0.1/24
. 192.168.100.1
é o gateway padrão no host (gateway de internet).
O contêiner docker tem um IP de saída fixo usando o SNAT, consulte Quatro maneiras de conectar um contêiner docker a uma rede local - Usando NAT . Isso é feito por dois comandos, designe o endereço de destino à interface do host ip addr add 192.168.100.234/24 dev ens8
e adicione a regra iptables iptables -t nat -I POSTROUTING -s 172.21.0.4 -j SNAT --to-source 192.168.100.234
. Os contêineres são criados usando IPs da bridge app_net.
No host, posso pingar / rastrear os IPs na sub-rede 192.168.100.x
e em 172.20.102.x
e na Internet, por exemplo, google.com. Dentro de um contêiner, eu posso pingar / traceroute IPs na sub-rede 192.168.100.x
, eu também posso pingar google.com, mas não consigo pingar nada em 172.20.102.x
, exceto 172.20.102.24
. Veja a seguinte saída.
# traceroute -I 192.168.100.10
traceroute to 192.168.100.10 (192.168.100.10), 30 hops max, 46 byte packets
1 172.21.0.1 (172.21.0.1) 0.004 ms 0.003 ms 0.002 ms
2 192.168.100.10 (192.168.100.10) 0.180 ms 0.158 ms 0.028 ms
# traceroute -I google.com
traceroute to google.com (216.58.214.46), 30 hops max, 46 byte packets
1 172.21.0.1 (172.21.0.1) 0.004 ms 0.013 ms 0.002 ms
2 fritz.box (192.168.100.1) 2.144 ms 3.114 ms 2.697 ms
3 server.provider.net (xx.yy.250.5) 6.947 ms 7.042 ms 4.305 ms
4 etc...
# traceroute -I 172.20.102.24
traceroute to 172.20.102.24 (172.20.102.24), 30 hops max, 46 byte packets
1 172.20.102.24 (172.20.102.24) 0.004 ms 0.003 ms 0.002 ms
# traceroute -I 172.20.102.9
traceroute to 172.20.102.9 (172.20.102.9), 30 hops max, 46 byte packets
1 172.21.0.1 (172.21.0.1) 0.004 ms 0.003 ms 0.002 ms
2 * * *
3 * * * (etc. no response)
Se eu não adicionar a regra SNAT do iptables, os containers podem pingar / rastrear tudo, também as máquinas na sub-rede 172.20.102.x
.
Eu encontrei um artigo sobre vários NICs e docker (#) com um despojado da solução no serverFault, mas nem isso, nem uma análise profunda da docker networking avançada (#) me deu uma pista, por que não consigo acessar outras máquinas no ens9 sub-rede, exceto a própria placa de rede de dentro de um contêiner docker.
Estou sentindo falta de algo ou esse cenário de rede está errado?
(#) Não é permitido postar mais de dois links por causa da reputação, mas o link serverFault juntamente com o Google "Docker em várias interfaces de rede" deve ajudar a encontrar os links.
Tags networking docker iptables