2015-10-17 2 views
0

Я хочу инкапсулировать весь трафик в UDP. Я могу захватить его уже и отправить вперед. Но теперь я хочу сделать инкапсуляцию. Для этой задачи мне нужно получить полный пакет в необработанной форме. Но как я могу это сделать? Мой код:Получить пакет в необработанном виде с netfilter

while ((rv = recv(fd, buf, sizeof(buf), 0))) 
{ 
     printf("pkt received\n"); 
     nfq_handle_packet(h, buf, rv); 
} 

Должен ли я сделать это в своем обратном вызове? Если да, то как? Или я могу просто установить NF_DROP в своем обратном вызове и использовать buf и rev от while loop? Я могу найти функцию от netfilter, чтобы получить полезную нагрузку, dst, src и т. Д., Но не пакет в необработанном виде. Или я могу как-то переосмыслить nfq_data на char *?

+1

вы найдете здесь легковесную библиотеку TCP/IP, в файле rawapi.txt есть интересная документация в папке doc, я думаю, что это поможет вам, я не знаю, что вы используете для сырой библиотеки tcp/ip. ссылка: http://savannah.nongnu.org/projects/lwip/ – HDJEMAI

ответ

1

Вы действительно захотите сделать это в своем обратном вызове. Вам нужно будет вызвать nfq_get_payload, который даст вам указатель на все содержимое пакета, включая заголовки IP и UDP. В зависимости от того, как вы будете инкапсулировать пакет, вы можете вызвать nfq_set_verdict с указателем на новые пакетные данные или удалить пакет с помощью NF_DROP, а затем повторно проинсталлировать вновь инкапсулированный пакет через сырой сокет или что-то подобное.

+0

Спасибо! Я просто подумал, что nfq_get_payload возвращает только полезную нагрузку (только полезную нагрузку IP-пакета без заголовков IP и т. Д.), Но не весь пакет. ps: извините за оффтоп, но есть ли у вас полезные ссылки на руководство по libnetfilter? По-моему, официальная документация по doxygen не является полностью информативной. – user2123079

+0

Я честно получаю большинство из того, что мне нужно от кода Doxygen и libnetfilter_queue. Я вообще не рассматривал raw libnetfilter/libnetlink. –

Смежные вопросы