Я ищу помощь и рекомендации для сетевого проекта, в котором я работаю в последнее время. Для этого требуется, чтобы компьютер Linux был пассивным сетевым устройством.Кадры Ethernet от NIC
Сетевые пакеты поступают из одного сетевого интерфейса и выходят из другого интерфейса (net - eth0 -> Linux PC - eth1 -> net) без внесения каких-либо изменений в данные.
Приложение, которое будет запущено в системе Linux, изменит только порядок пакетов. Это будет «глупое» приложение для сетевого эмулятора.
Первая реализация была выполнена с использованием RAW-сокетов, где read() вызывается каждый раз, когда пакет поступает в пользовательское пространство, а write() вызывается, когда пакет Ethernet должен быть отправлен в сетевой адаптер.
Я хотел бы знать, есть ли более практичный и прямой путь, чем RAW-сокеты, минуя сетевой стек Linux.
вы не можете обойти сетевой стек Linux, и они, как вы делаете это, вероятно, самый простой способ. Что вы подразумеваете под практическим? –
Практический путь идет к технической части реализации. Для реализации сокетов требуется механизм tx-rx с неблокирующим IO, это как я реализовал на первом месте, используя select() и pthreads под C. Есть ли лучшая философия дизайна? Также я ищу способ, которым промежуточная система не будет обрабатывать весь этот сетевой трафик. Между этими двумя интерфейсами должно выполняться только приложение эмуляции. – cyberrobot
Что вы можете сделать, так это создать «netfilter» hook и получить его пакеты, а затем отправить их немедленно. Таким образом, вашим пакетам не придется перемещаться в пользовательское пространство, и вы можете выполнять обработку в пространстве ядра, которое выполняется быстрее. –