Información de contexto
Tengo un servidor con dos interfaces de red que ejecuta Docker. Docker, como algunas herramientas de virtualización, crea una interfaz de puente de Linux llamada docker0
. Esta interfaz está configurada de manera predeterminada con una IP 172.17.42.1
y todos los contenedores Docker se comunican con esta interfaz como su puerta de enlace y se les asignan direcciones IP en el mismo /16
rango. Según tengo entendido, todo el tráfico de red hacia / desde los contenedores pasa a través de un NAT, por lo que parece que proviene de salida 172.17.42.1
y de entrada se envía 172.17.42.1
.
Mi configuración se ve así:
+------------+ /
| | |
+-------------+ 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| |
+------------+
El problema
Quiero enrutar todo el tráfico desde / hacia cualquier contenedor Docker desde la segunda eth1
192.168.1.2
interfaz a una puerta de enlace predeterminada 192.168.1.1
, mientras que todo el tráfico desde / hacia la máquina host sale de la eth0
10.1.1.2
interfaz a una puerta de enlace predeterminada 10.1.1.1
. He intentado una variedad de cosas hasta ahora en vano, pero creo que lo más parecido a corregir es usar iproute2 así:
# 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
Cuando saco un contenedor, no puedo hacer ping fuera de él después de hacer esto. No estoy seguro de si las interfaces de puente se manejan de la misma manera que las interfaces físicas para este tipo de enrutamiento, y solo quiero una verificación de la cordura, así como algún consejo sobre cómo podría llevar a cabo esta tarea aparentemente simple.