2009-06-08 1 views
4

Я использую стек TCP для пользовательского пространства на основе стека Linux, работающего под Linux. К сожалению, он требует, чтобы приложения специально вызывали свои собственные модифицированные версии функций API обычных сокетов, а затем просто захватывали входящие пакеты, которые он получает в ответ, используя libpcap.Перенаправление пакетов в пользовательское пространство Стек TCP без изменения приложения

Теперь мой вопрос заключается в том, есть ли способ перенаправлять пакеты из приложения в этот стек TCP без необходимости изменения самого приложения. Иными словами, я ищу способ перехватить вызовы в API сокетов и перенаправить их на эквивалент пространства пользователя.

Надеюсь, что это более или менее понятно, что я имею в виду.

+2

Какое пространство пользовательского пространства TCP вы используете? – fadedbee

ответ

1

две идеи (тестировался, первый Google их, чтобы увидеть, если кто-то сделал это раньше):

  1. установить замену stdlib, который использует TCP LIB вместо системных вызовов. затем используйте ld.so, чтобы переопределить его при загрузке.

    • набор в tun чистое устройство, убедитесь, что приложения говорить об этом, и написать еще одну задачу, которая соединяет другую сторону чана в пользовательском пространстве TCP Lib.

Я думаю, первый один работает лучше и может быть менее хрупким. Он нуждается в тонком знании stdlib, думал. Кроме того, устройство tun, похоже, дает вам только IP-пакеты.

Ваш лучший выбор - искать других пользователей библиотеки TCP, вполне возможно, что уже есть какой-то «загрузчик», который делает именно это.

0

Использовать tuntap как мост - хорошая идея, а tap (not tun) может дать вам полный пакет ethernet, включая ehternet (mac) header. Здесь у меня есть вопрос к вам, как ваш стек пользовательского пространства обрабатывает входящие пакеты. В вашем сообщении вы упомянули, что он использует libpcap для захвата пакетов, но, как я знаю, libpcap просто получит копию входящего пакета, а затем этот пакет все равно перейдет в обычный путь стека ядра, и это может быть не то, что вы хотеть. Например, если это tcp-пакет для вашего приложения, который работает на основе пользовательского пространства tcp/ip stack, а ядро ​​его не знает и, возможно, просто отправит первый пакет, который может нарушить нормальное соединение. Поэтому я думаю, что ваш стек tcp/ip в пользовательском пространстве может применять некоторые специальные методы для предотвращения передачи входящего пакета в ядро, правильно? Как это сделать?