Перенаправление пакетов в стек TCP пользователя без изменения приложения - PullRequest
4 голосов
/ 08 июня 2009

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

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

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

Ответы [ 2 ]

1 голос
/ 08 июня 2009

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

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

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

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

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

0 голосов
/ 06 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...