Рейтинг:4

Linux: сделать так, чтобы трафик с одного и того же хоста выглядел с разных IP-адресов

флаг cn

Я использую клиентскую библиотеку (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 магия в строчках:

  1. исходящий: если IP-адрес назначения == 192.168.1.11 1.1 -> переписать на IP-адрес назначения 192.168.1.10 1.1 -> переписать/убедиться, что исходный IP-адрес равен 192.168.1.21

  2. входящий: если IP-адрес назначения == 192.168.1.21 2.1 -> переписать исходный IP-адрес на 192.168.1.11 (виртуальный IP-адрес удаленного ПЛК)

Возможно, даже можно «пометить» TCP-соединения, чтобы было легче различать, что есть что (шаг 2).

Рейтинг:5
флаг cl
A.B

Для этого случая коннтрекNAT достаточно, чтобы изменить, пометить и правильно обработать ответный трафик для соединения. Можно использовать как DNAT, так и SNAT и связать их использование вместе или использовать сочетание DNAT и адекватных маршрутов.

ДНКТ

Эта цель действительна только в таблице nat, в ПРЕДВАРИТЕЛЬНАЯ МАРШРУТИЗАЦИЯ и ВЫВОД цепочки и пользовательские цепочки, которые вызываются только из те цепи. Указывает, что адрес назначения пакета должны быть изменены (и все будущие пакеты в этом соединении будут тоже заморочиться), и правила должны перестать проверяться. [...]

СНАТ

Эта цель действительна только в таблице nat, в РАЗМЕЩЕНИЕ и ВХОД цепочки и пользовательские цепочки, которые вызываются только из тех цепи. Он указывает, что исходный адрес пакета должен быть изменены (и все будущие пакеты в этом соединении также будут искалеченный), и правила должны перестать проверяться. [...]

iptables -t nat -A OUTPUT -d 192.168.1.11 -j DNAT --назначение 192.168.1.10
iptables -t nat -A OUTPUT -d 192.168.1.12 -j DNAT --назначение 192.168.1.10
iptables -t nat -A OUTPUT -d 192.168.1.13 -j DNAT --назначение 192.168.1.10
iptables -t nat -A OUTPUT -d 192.168.1.14 -j DNAT --назначение 192.168.1.10

установить дополнительные исходные адреса на клиенте:

IP-адрес добавить 192.168.1.21/24 dev enp2s0
IP-адрес добавить 192.168.1.22/24 dev enp2s0
IP-адрес добавить 192.168.1.23/24 dev enp2s0
IP-адрес добавить 192.168.1.24/24 dev enp2s0
  • и либо условно привязать действие SNAT к исходный адрес назначения (до выполнения DNAT), используя соответствующий фильтр с iptables' коннтрек соответствовать:

    iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.11 -j SNAT --к источнику 192.168.1.21
    iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.12 -j SNAT --to-source 192.168.1.22
    iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.13 -j SNAT --to-source 192.168.1.23
    iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.14 -j SNAT --to-source 192.168.1.24
    
  • или вместо SNAT, что намного чище, используйте маршрут, прямо намекающий на предполагаемый исходный адрес для каждого пункта назначения (даже если nat/OUTPUT перенаправляет, исходный адрес больше не будет меняться после установки). Это позволит клиенту и сс-тн дпорт == 48898 знать и отображать правильный исходный адрес.Это становится:

    ip маршрут добавить 192.168.1.11/32 dev enp2s0 src 192.168.1.21
    ip маршрут добавить 192.168.1.12/32 dev enp2s0 src 192.168.1.22
    ip маршрут добавить 192.168.1.13/32 dev enp2s0 src 192.168.1.23
    ip маршрут добавить 192.168.1.14/32 dev enp2s0 src 192.168.1.24
    

Это должно быть сделано следующим образом: один адрес за раз (DNAT можно упростить/разложить на множители, но не вторую часть, касающуюся источника).

Связь с настоящим 192.168.1.10 адрес оставлен без изменений.

флаг cn
большое спасибо @a-b - отличное решение и объяснение - с таким подходом мне удалось заставить все работать!!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.