Как извлечь номер порта источника и получателя из пакета в очереди iptables

Я использую библиотеку libnetfilter_queue. Но я не мог найти способ извлечь номер порта в функции обратного вызова. Я немного новичок. Подробная помощь будет высоко оценена!


person adnan kamili    schedule 01.10.2012    source источник


Ответы (1)


Это можно сделать следующим образом в функции обратного вызова:

len = nfq_get_payload(nfa, &buffer);
src_port = *((unsigned short*) (buffer + 20));
dst_port = *((unsigned short*) (buffer + 22));
person adnan kamili    schedule 02.10.2012
comment
Почему 22 и 20? Откуда вы знаете, как организована полезная нагрузка? - person ; 03.04.2013
comment
@RodrigoSalazar Это было только для TCP и предполагает, что заголовок IP имеет длину 20 байтов, как и в большинстве случаев, поэтому 20 и 21 байт, то есть первые два байта заголовка tcp, относятся к порту src, а 22 и 23 байта относятся к порту назначения, согласно tcp/ структура IP-пакета - person adnan kamili; 04.04.2013
comment
Спасибо за ответ, я действительно задал вопрос об этом на днях, а затем сам понял это на следующий день :) payload-structure-its-return-data" title="как nfq получает структуру полезной нагрузки своих возвращаемых данных"> stackoverflow.com/questions/15782630/ - person ; 05.04.2013
comment
В конечном итоге это было намного менее «волшебным», когда вы сначала приводили буфер + 20 к структуре tcphdr, а затем вытаскивали оттуда порт. Похоже, во всех других сообщениях в Интернете об этом все решают реализовать это, напрямую приводя буфер + 20 к беззнаковому шорту. Не уверен, есть ли какой-либо выигрыш в производительности, если делать это напрямую, только путаница для тех, кто менее информирован, кто читает код. - person ; 05.04.2013
comment
@RodrigoSalazar Может не быть заметного прироста производительности, но имейте в виду, что вы создаете пакеты для входа в пространство пользователя из пространства ядра, что повлияет на скорость вашего интернета, в зависимости от того, сколько правил iptables вы написали и сколько пакетов направлены на ваш модуль. Если вас интересует только порт и IP-адрес в пакетах, то использование netfilter не лучший выбор, в этом случае вам следует использовать libpcap, а код почти такой же. Используйте netfilter, если хотите изменить или выборочно заблокировать пакеты. - person adnan kamili; 05.04.2013