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.1und alle Docker-Container kommunizieren mit dieser Schnittstelle als Gateway und erhalten IP-Adressen im selben /16Bereich. 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.1und 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.2Schnittstelle 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.2Schnittstelle 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.