2

Я работаю в производственной среде, и мне нужно общаться с 50 устройствами, работающими на 192.168.0.2, с одного (Windows) компьютера. Предположим, что у меня нет возможности изменять IP-адреса на этих устройствах.

У меня есть пара решений на данный момент. Тот, который я подтвердил, является функциональным, а другой, который почти всегда работает. Я в основном пытаюсь выяснить, что сделали другие, или есть что-то лучше, или есть ли способ исправить мой почти рабочий метод.

Аппаратная настройка одинакова для обоих и очень похожа на настройку, описанную в этом вопросе. У меня есть ПК с Windows, подключенный к управляемому коммутатору. Управляемый коммутатор настроен таким образом, что каждый порт vlan'd подключается к своему собственному немаркированному vlan, и все эти vlans помечаются на порту, подключенном к ПК.

Вариант A (Варианты -почти-работ)

Я запускаю одну виртуальную машину Linux с последней версией Ubuntu Server на ПК с Windows и запускаю следующие команды

# eth1 connects to the managed switch.
# eth2 connects to the Windows PC (Windows PC is at 192.168.1.50).

# This handles the initial setup and the first device
sudo ifconfig eth2 192.168.1.51/24
sudo vconfig add eth1 101
sudo ifconfig eth1.101 192.168.0.1
sudo ip route del 192.168.0.0/24
sudo ip addr add 192.168.1.61/24 dev eth2
sudo ip rule add fwmark 101 table 101
sudo ip route add 192.168.0.0/24 dev eth1.101 table 101
sudo ip route add 192.168.1.0/24 dev eth2 table 101
sudo iptables -t mangle -A PREROUTING -i eth2 -d 192.168.1.61 -j MARK --set-mark 101
sudo iptables -t nat -A PREROUTING -m mark --mark 101 -j DNAT --to-destination 192.168.0.2

#this handles a second device and is modified for each additional device
sudo vconfig add eth1 102
sudo ip addr add 192.168.1.62/24 dev eth2
sudo ifconfig eth1.102 192.168.0.1/24
sudo iptables -t mangle -A PREROUTING -i eth2 -d 192.168.1.62 -j MARK --set-mark 102
sudo iptables -t nat -A PREROUTING -m mark --mark 102 -j DNAT --to-destination 192.168.0.2
sudo ip rule add fwmark 102 table 102
sudo ip route del 192.168.0.0/24
sudo ip route add 192.168.0.0/24 dev eth1.102 table 102

По сути, у меня есть несколько виртуальных IP-адресов на сетевой плате, обращенной к ПК с Windows, и каждый виртуальный IP-адрес использует IPTables и правила маршрутизации для сопоставления и перенаправления его на конкретный виртуальный сетевой адаптер, представляющий vlan. Теперь я думаю, что что-то напортачило в таблице ARP, судя по выводу, который я видел через TCPDump (в большинстве случаев ничего не отвечает на запрос ARP от устройства). Я могу заставить его работать, если я удаляю правила IP-маршрута и имею "глобальный" IP-маршрут до 192.168.0.0/24, но тогда он, очевидно, не работает для нескольких устройств.

** Вариант B (отлично работает, но немного глупо)

Я запускаю 50 виртуальных машин на ПК под управлением Windows, на котором установлена последняя версия DSL Linux. Каждая виртуальная машина в основном обрабатывает маршрутизацию для одного устройства. Команды следующие.

# eth1 connects to the managed switch.
# eth2 connects to the Windows PC
ifconfig eth1 up
vconfig add eth1 101
ifconfig eth1.101 192.168.0.1
ip addr add 192.168.56.2/24 dev eth2
iptables -t nat -A PREROUTING -i eth2 -d 192.168.56.2 -j DNAT --to-destination 192.168.0.2

И, как бы глупо ни было запустить 50 виртуальных машин на одном настольном ПК, он работает и прекрасно работает.

Я бы с удовольствием выбрал вариант А, если бы смог заставить его работать, но я думаю, что ударил его кирпичной стеной. Вариант B - это мое последнее усилие, если я не могу заставить его работать. Я мог бы в конечном итоге поставить все эти виртуальные машины на отдельное оборудование, если бы мне пришлось это сделать. Так что мой вопрос к суперпользователю: могу ли я заставить работать вариант А? Какие еще есть решения? Есть ли аппаратные маршрутизаторы /NAT, которые могут делать то, что я хочу?

0