Я настроил три машины статическим образом, как 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, пакет игнорируется. Установка неразборчивого интерфейса не отключает эту проверку, а только перемещает ее на более позднюю позицию в сетевом коде.
Пересылка пакетов, адрес MAC которых не совпадает с адресом интерфейса, на котором был получен пакет, называется мостом. Если вы переадресуете пакеты через машину B, вы сможете нормально настроить машины A и C без статических маршрутов ARP, и, похоже, именно это вы и хотите.