Исходная информация
У меня есть сервер с двумя сетевыми интерфейсами, на котором работает Docker. Docker, как и некоторые инструменты виртуализации, создает интерфейс моста Linux под названием docker0
. Этот интерфейс по умолчанию настроен с IP-адресом, 172.17.42.1
и все контейнеры Docker обмениваются данными с этим интерфейсом в качестве своего шлюза, и им назначаются IP-адреса в том же /16
диапазоне. Насколько я понимаю, весь сетевой трафик в / из контейнеров проходит через NAT, поэтому исходящие данные, похоже, поступают 172.17.42.1
, а входящие отправляются 172.17.42.1
.
Моя настройка выглядит так:
+------------+ /
| | |
+-------------+ 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| |
+------------+
Проблема
Я хочу направить весь трафик от / к любым контейнерам Docker из второго eth1
192.168.1.2
интерфейса на шлюз по умолчанию 192.168.1.1
, при этом весь трафик с / на хост-машину выходитeth0
10.1.1.2
интерфейса на шлюз по умолчанию 10.1.1.1
. Я пробовал разные вещи, но безрезультатно, но единственное, что я считаю наиболее близким к исправлению, - это использовать iproute2 следующим образом:
# 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
Когда я поднимаю контейнер, я вообще не могу выскочить из него после этого. Я не уверен, обрабатываются ли мостовые интерфейсы таким же образом, как физические интерфейсы для такого рода маршрутизации, и я просто хочу проверить работоспособность, а также какие-либо советы о том, как я могу выполнить эту, казалось бы, простую задачу.