Informations d'arrière-plan
J'ai un serveur avec deux interfaces réseau qui exécute Docker. Docker, comme certains outils de virtualisation, crée une interface de pont Linux appelée docker0
. Cette interface est configurée par défaut avec une IP de 172.17.42.1
et tous les conteneurs Docker communiquent avec cette interface comme passerelle et se voient attribuer des adresses IP dans la même /16
plage. Si je comprends bien, tout le trafic réseau vers / depuis les conteneurs passe par un NAT, donc sortant il semble provenir 172.17.42.1
et entrant il est envoyé 172.17.42.1
.
Ma configuration ressemble à ceci:
+------------+ /
| | |
+-------------+ 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| |
+------------+
Le problème
Je veux acheminer tout le trafic depuis / vers n'importe quel conteneur Docker de la deuxième eth1
192.168.1.2
interface vers une passerelle par défaut de 192.168.1.1
, tout en ayant tout le trafic depuis / vers la machine hôte sortir de l' eth0
10.1.1.2
interface vers une passerelle par défaut de 10.1.1.1
. J'ai essayé une variété de choses jusqu'à présent en vain, mais la seule chose que je pense être la plus proche à corriger est d'utiliser iproute2 comme ceci:
# 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
Lorsque j'apporte un conteneur, je ne peux plus en sortir après avoir fait cela. Je ne suis pas sûr que les interfaces de pont soient gérées de la même manière que les interfaces physiques pour ce type de routage, et je veux juste un contrôle d'intégrité ainsi que des conseils sur la façon dont je pourrais accomplir cette tâche apparemment simple.