Я настроил три машины в статическом режиме proxy_arp:
----------------------+ +-----------------------------------------------+ +---------------------- Machine A | | Machine B | | Machine C ----------------------+ +-----------------------------------------------+ +---------------------- eth0|---|tap0 tap1|---|eth0 mac: 52:54:00:12:34:56| |mac: b6:e0:11:97:fd:5f mac: 36:46:74:b1:92:71| |mac: 52:54:00:22:22:22 ip: 192.168.12.2/24| |ip: 0.0.0.0 ip: 0.0.0.0| |ip: 192.168.12.4/24 | |promisc up promisc up| | Machine A: arp -i eth0 -s 192.168.12.4 b6:e0:11:97:fd:5f Machine C: arp -i eth0 -s 192.168.12.2 36:46:74:b1:92:71 Machine B: echo 1 > /proc/sys/net/ipv4/ip_forward route add 192.168.12.4 dev tap1 route add 192.168.12.2 dev tap0
С этой конфигурацией я могу успешно пропинговать 192.168.12.4 с машины A.
Вопрос в том, заменю ли я статический маршрут arp на машина C с:
arp -i eth0 -s 192.168.12.2 22:22:22:22:22:22
Почему перестает работать? ответ ping получен tap1 на машине B (отображается на wirehark), но по какой-то причине, хотя tap1 является беспорядочным режимом, пакет не передается на уровень IP и не пересылается на tap0, как должен!
Знаете ли вы, какой компонент ядра отвечает за отбрасывание такого входящего пакета на основе MAC-адреса назначения, даже если интерфейс находится в беспорядочном режиме?
Сетевой уровень получает пакет для MAC 22:22:22:22:22, но так как MAC-адрес не принадлежит tap1, пакет игнорируется. Установка интерфейса на promiscuous не отключает эту проверку, а только переносит ее на более поздний уровень в сетевом коде.
Пересылка пакетов, которые имеют MAC назначение, отличное от интерфейса, на котором получен пакет, называется bridging (мостом). Если вы пересылаете пакеты по мосту через машину B, вы сможете настроить машины A и C обычно без статических ARP маршрутов, и кажется, что это то, что вы хотите сделать.
.