Я использую клиентскую библиотеку (https://github.com/Beckhoff/ADS) для подключения к ПЛК с Linux-машины через TCP. Однако библиотека может выполнять только одно соединение между IP-адресом источника и IP-адресом назначения ПЛК. Моя цель - подключиться к удаленному IP/ПЛК с несколькими клиентами, т.е. удаленный ПЛК должен иметь возможность различать клиентские подключения на основе (другого) IP-адреса клиента.
Я надеялся добиться этого с помощью какого-нибудь умного iptables
правила; в качестве альтернативы, возможно, сработают и сетевые пространства имен Linux.
Для iptables
route (каламбур?), мой план состоит в том, чтобы назначить несколько IP-адресов одному и тому же сетевому адаптеру на машине с Linux.Поскольку удаленная служба прослушивает один порт (48898), я не могу просто использовать разные порты назначения в iptables
правила. Поэтому я думал примерно так:
Удаленный ПЛК: 192.168.1.10/24
ПК с Linux: 192.168.1.20/24 (ip-адрес добавить 192.168.1.20/24 dev enp2s0)
ПК с Linux: 192.168.1.21/24 (ip-адрес добавить 192.168.1.21/24 dev enp2s0)
- Клиент-А просто подключается с 192.168.1.20 на 192.168.1.10
- Клиент-А просто подключается с 192.168.1.21 к (виртуальному) 192.168.1.11.
Используя «виртуальный» IP-адрес для удаленного ПЛК, я хочу иметь возможность различать TCP-соединения, чтобы знать, какие пакеты исходят от Клиента-А и какие пакеты исходят от Клиента-Б. Теперь мне нужно сделать некоторые iptables
магия в строчках:
исходящий: если IP-адрес назначения == 192.168.1.11
1.1 -> переписать на IP-адрес назначения 192.168.1.10
1.1 -> переписать/убедиться, что исходный IP-адрес равен 192.168.1.21
входящий: если IP-адрес назначения == 192.168.1.21
2.1 -> переписать исходный IP-адрес на 192.168.1.11 (виртуальный IP-адрес удаленного ПЛК)
Возможно, даже можно «пометить» TCP-соединения, чтобы было легче различать, что есть что (шаг 2).