Довідкова інформація
У мене є сервер з двома мережевими інтерфейсами, на якому працює 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
Коли я піднімаю контейнер, я взагалі не можу з нього виїхати. Я не впевнений, чи використовуються мостові інтерфейси так само, як фізичні інтерфейси для такого роду маршрутизації, і я просто хочу перевірити обґрунтованість, а також будь-які поради щодо того, як я міг би виконати цю, здавалося б, просту задачу.