У меня сложный случай:
+---+ +----+
|D1 +->eth0---------<-eth0-+D2 |
| | | |
| +->eth1---------<-eth1-+ |
+---+ +----+
На D2 eth0
и eth1
имеют IP-адреса из одной подсети: eth0
10.1.1.1/24
, eth1
10.1.1.2/24
. Интерфейсам на D1 не назначены адреса, и он действует как коммутатор.
Теперь я хочу, чтобы D2 мог отправлять трафик 10.1.1.2
через eth0
, поэтому путь пакета должен быть следующим: D2(eth0)--D1(eth0)--D1(eth1)--D2(eth1).
В данный момент, когда я пингую 10.1.1.2
с D2, он посылает пакеты локально, т.е. D1 не получает ни одного. Что мне нужно изменить на D2, чтобы добиться желаемого поведения?
Спасибо.
решение1
То, что вы хотите, невозможно с Linux. По крайней мере, на уровне маршрутизации. Если целевой адрес принадлежит локальному интерфейсу, то пакет всегда проходит через интерфейс loopback, откуда он не может (по RFC) быть направлен наружу.
Я думал, что можно использовать iptables
и DNAT
изменить цель на неиспользуемый адрес в подсети и использовать ip neigh
для установки статического MAC-адреса на одну из других сетевых карт, но даже DNAT
правило не срабатывает для пакетов на локальные адреса.
Это может быть возможно с виртуальной машиной или с сетевыми пространствами имен, так что ядро не видит 10.1.1.1
на eth0
. Но вам понадобятся proxy ARP и DNAT для перемещения входящих пакетов с физического на виртуальный интерфейс.
Стоит ли это таких усилий?
решение2
Сетевые пространства имен могут быть вариантом. Они по сути являются независимыми экземплярами сетевого стека, поэтому они должны, по крайней мере, теоретически иметь возможность разделять два интерфейса.
В последний раз, когда я пытался с ними поиграться, мне не удалось заставить их работать как следует.