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.1
e tutti i contenitori Docker comunicano con questa interfaccia come gateway e vengono assegnati indirizzi IP nello stesso /16
intervallo. 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.1
e 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.2
interfaccia a un gateway predefinito di 192.168.1.1
, mentre tutto il traffico da / verso la macchina host esce eth0
10.1.1.2
dall'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.