Как передавать UDP пакеты через определенный интерфейс?
Приветствую!
На пк есть три интерфейса eth0, eth1, eth2. Каждый интерфейс подключен к оборудованию передачи данных.
Каждый интерфейс со своим статическим адресом, у eth0 к примеру 192.168.255.200/16, eth1 2.255.1.2/30, eth2 2.255.2.2/30. С последними двумя интерфейсами пробовала по разному, пока с роутингом у меня проблемы. Попытки жестко задать маршрут тоже не увенчались успехом.
Стоит задача проверки передачи пакетов UDP через оборудование. То есть пакет должен уходить в eth1, "пройти" через оборудование и попасть в eth2. Проблема в том, что система не отправляет пакеты в интерфейс и далее в оборудование, а сразу "получает" их на eth2.
ПО пишу на C++ под Astra Linux 1.5.
Каким образом принудить систему отправлять пакеты в нужный интейрфейс? Каким способом в общем возможно решить поставленную задачу?
пакет должен уходить в eth1, "пройти" через оборудование и попасть в eth2. Проблема в том, что система не отправляет пакеты в интерфейс и далее в оборудование, а сразу "получает" их на eth2.
Всё верно, без фокусов эта схема работать не будет.
Возможные фокусы:
- посылать пакет через RAW сокет, чтобы маршрутизатор ядра не вмешивался;
- посылать пакет не на адрес eth2, а на другой адрес. Править адрес назначения с помощью iptables, в таблице mangle, в цепочке POSTROUTING.
Попробую RAW сокеты на чтение.
На данный момент при использовании SO_BINDTODEVICE и отправке broadcast пакета, Wireshark'ом убедилась, что пакеты доходят до eth2 (при отключении кабеля, пакеты не доходят). Но при этом на eth2 пакеты на broadcast порт не приходят (не срабатывает udp сокет).
Iptables тоже хорошая мысль, но в этом я пока нубас. Если не получится с первым вариантом, буду разбираться.
Это потому, что linux все, что предназначено ему самому -- никогда и не будет слать наружу.
Возможный выход - один из интерфейсов переместить в выделенный Network Namespace. Тогда из основной системы этот интерфейс пропадет и появится уже в этом namespace, вместе со своей, отдельной таблицей маршрутизации и правилами фаервола.
Соответственно и одно из приложений так же запускать внутри этого namespace.
Но следует учитывать, что и приложение будет или работать в основной системе, или работать в этом namespace, и никакого сетевого взаимодействия кроме как через "снаружи" у них не будет (если не сделать этого явно)