Hintergrundinformation
Ich habe einen Server mit zwei Netzwerkschnittstellen, auf dem Docker ausgeführt wird. Docker erstellt wie einige Virtualisierungstools eine Linux-Bridge-Schnittstelle mit dem Namen docker0
. Diese Schnittstelle ist standardmäßig mit einer IP von konfiguriert, 172.17.42.1
und alle Docker-Container kommunizieren mit dieser Schnittstelle als Gateway und erhalten IP-Adressen im selben /16
Bereich. Soweit ich weiß, wird der gesamte Netzwerkverkehr zu / von Containern über ein NAT abgewickelt, so dass er anscheinend von einem NAT ausgeht 172.17.42.1
und an einen eingehenden Datenverkehr gesendet wird 172.17.42.1
.
Mein Setup sieht so aus:
+------------+ /
| | |
+-------------+ 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| |
+------------+
Das Problem
Ich möchte den gesamten Datenverkehr von / zu Docker-Containern aus der zweiten eth1
192.168.1.2
Schnittstelle an ein Standard-Gateway von leiten 192.168.1.1
, während der gesamte Datenverkehr vom / zum Host-Computer über die eth0
10.1.1.2
Schnittstelle an ein Standard-Gateway von leiten soll 10.1.1.1
. Ich habe eine Reihe von Dingen bisher erfolglos ausprobiert, aber das, was meiner Meinung nach am ehesten zu korrigieren ist, ist, iproute2 wie folgt zu verwenden:
# 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
Wenn ich einen Container aufbringe, kann ich danach gar nicht mehr herauspingen. Ich bin nicht sicher, ob Bridge-Schnittstellen genauso behandelt werden wie physische Schnittstellen für diese Art von Routing. Ich möchte lediglich eine Überprüfung der Integrität sowie Tipps, wie ich diese scheinbar einfache Aufgabe ausführen kann.