Informazioni di base
Ho un server con due interfacce di rete che esegue Docker. Docker, come alcuni strumenti di virtualizzazione, crea un'interfaccia bridge Linux chiamata docker0. Questa interfaccia è configurata per impostazione predefinita con un IP di 172.17.42.1e tutti i contenitori Docker comunicano con questa interfaccia come gateway e vengono assegnati indirizzi IP nello stesso /16intervallo. A quanto ho capito, tutto il traffico di rete da / verso i container passa attraverso un NAT, quindi sembra in uscita da cui proviene 172.17.42.1e in entrata viene inviato a 172.17.42.1.
La mia configurazione è simile al seguente:
+------------+ /
| | |
+-------------+ Gateway 1 +-------
| | 10.1.1.1 | /
+------+-------+ +------------+ |
| eth0 | /
| 10.1.1.2 | |
| | |
| DOCKER HOST | |
| | | Internet
| docker0 | |
| (bridge) | |
| 172.17.42.1 | |
| | |
| eth1 | |
| 192.168.1.2 | \
+------+-------+ +------------+ |
| | | \
+-------------+ Gateway 2 +-------
| 192.168.1.1| |
+------------+
Il problema
Voglio instradare tutto il traffico da / verso qualsiasi contenitore Docker dalla seconda eth1 192.168.1.2interfaccia a un gateway predefinito di 192.168.1.1, mentre tutto il traffico da / verso la macchina host esce eth0 10.1.1.2dall'interfaccia verso un gateway predefinito di 10.1.1.1. Finora ho provato una varietà di cose senza risultati, ma l'unica cosa che penso sia la più vicina da correggere è usare iproute2 in questo modo:
# Create a new routing table just for docker
echo "1 docker" >> /etc/iproute2/rt_tables
# Add a rule stating any traffic from the docker0 bridge interface should use
# the newly added docker routing table
ip rule add from 172.17.42.1 table docker
# Add a route to the newly added docker routing table that dictates all traffic
# go out the 192.168.1.2 interface on eth1
ip route add default via 192.168.1.2 dev eth1 table docker
# Flush the route cache
ip route flush cache
# Restart the Docker daemon so it uses the correct network settings
# Note, I do this as I found Docker containers often won't be able
# to connect out if any changes to the network are made while it's
# running
/etc/init.d/docker restart
Quando apro un contenitore non riesco più a eseguire il ping da esso dopo averlo fatto. Non sono sicuro che le interfacce bridge siano gestite allo stesso modo delle interfacce fisiche per questo tipo di instradamento, e voglio solo un controllo di integrità e qualsiasi suggerimento su come potrei realizzare questo compito apparentemente semplice.