Я работаю с сетью докер-контейнеров. Таблица маршрутизации C1 ниже, это шлюз по умолчанию 172.17.0.1
это докер-бридж. Его интерфейс eth1 подключен к eth2 в C2, и он направляет все назначения с префиксом 192.1 на eth2 в C2.
Dest Gateway Genmask Iface
default 172.17.0.1 0.0.0.0 eth0
192.1.0.0 0.0.0.0 255.255.0.0 eth1
Таблица маршрутизации C2 приведена ниже. Он подключен к C3 между eth3 на C2 и eth4 на C3.
Dest Gateway Genmask Iface
192.1.2.0 192.1.2.1 255.255.254.0 eth3
Я могу пинговать C2 из C1, используя ping 192.1.1.2
, однако я не могу пинговать C3 из C1, используя ping 192.1.2.2
. Когда я пытаюсь проверить связь с C3, C1 отправляет ARP-запрос, ищущий Mac-адрес C3, который получает только C2, и терпит неудачу. Я могу успешно выполнить эхо-запрос на C3, если я вручную обновлю таблицу ARP C1 и дам ей Mac-адрес eth2 в C2 для 192.1.2.2
.
Я полагаю, что я мог бы также выполнить эту работу, изменив таблицу маршрутов C1, чтобы она находилась в другой подсети, чем C3, и использовала C2 в качестве шлюза по умолчанию. Таким образом, он хочет, чтобы MAC-адрес C2 проверял связь с C3.
Dest Gateway Genmask Iface
default 192.1.1.2 0.0.0.0 eth1
192.1.2.0 0.0.0.0 255.255.254.0 eth1
Однако меня заставили поверить, что можно будет отправить эхо-запрос C3 из C1, изменив только таблицу маршрутов C2. Это возможно?
Вы можете добиться этого с помощью proxy-arp
функциональность. Когда proxy-arp включен на C2, он будет отвечать на запросы ARP собственным MAC-адресом в ответе ARP. Это то, что вам нужно.
Чтобы включить proxy arp на eth0
интерфейс C2, вам нужно запустить
sysctl -w net.ipv4.conf.eth2.proxy_arp=1
Для включения на всех интерфейсах выполните:
sysctl -w net.ipv4.conf.all.proxy_arp=1
Чтобы сделать это изменение постоянным, вы должны отредактировать файл настроек sysctl.