Пакеты должны идти в обоих направлениях, поэтому с обеих сторон необходимо выполнить множество изменений конфигурации.
Например, если вы измените маску сети на / 23 (255.255.254.0), этого недостаточно на устройстве A - да, оно сможет напрямую связаться с устройством B, но куда устройство B отправит ответ? Если B все еще думает, что он находится на / 24, он будет пытаться отправить ответ через шлюз.
Точно так же: даже если вы добавите правильный маршрут к устройству B, это не скажет устройству B, куда отправить ответ для устройства A. Оно все равно будет использовать то, что оно уже знает.
Предполагая, что вы вообще не можете перенастроить устройство B, но, по крайней мере, можете прочитать его конфигурацию, есть полтора способа сделать это.
Если вы знаете, какой IP-адрес «шлюза по умолчанию» настроен на устройстве-нарушителе, добавьте этот адрес в интерфейс локальной сети маршрутизатора - наряду с существующим адресом. (Это может называться «псевдонимом» в некоторых маршрутизаторах или «виртуальным IP» в других.)
Например, если устройство хочет использовать 192.168.1.254 в качестве своего шлюза:
ifconfig en0 192.168.1.254 netmask 255.255.255.0 alias # for FreeBSD ip addr add 192.168.1.254/24 dev eth0 # for Linux
Другой общий адрес - 192.168.1.1. Один из способов узнать правильный адрес - посмотреть, какие ARP-запросы запрашивает устройство.
Если устройство не имеет шлюза, сконфигурированный на всех, но вы знаете, по крайней мере, его размер подсети, вы можете 1) сделать выше, с некоторым произвольным адресом в той же подсети, и 2) настроить маршрутизатор таким образом, что он будет маскироваться (SNAT) все коммуникации.
Таким образом, устройство будет думать, что оно связывается только со своей подсетью.
Я не знаю, как это сделать, но это будет включать
pf
илиiptables
правила NAT.