Я использую библиотеку libnetfilter_queue. Но я не мог найти способ извлечь номер порта в функции обратного вызова. Я немного новичок. Подробная помощь будет высоко оценена!
Как извлечь номер порта источника и получателя из пакета в очереди iptables
Ответы (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
Почему 22 и 20? Откуда вы знаете, как организована полезная нагрузка?
- person ; 03.04.2013
@RodrigoSalazar Это было только для TCP и предполагает, что заголовок IP имеет длину 20 байтов, как и в большинстве случаев, поэтому 20 и 21 байт, то есть первые два байта заголовка tcp, относятся к порту src, а 22 и 23 байта относятся к порту назначения, согласно tcp/ структура IP-пакета
- person adnan kamili; 04.04.2013
Спасибо за ответ, я действительно задал вопрос об этом на днях, а затем сам понял это на следующий день :) payload-structure-its-return-data" title="как nfq получает структуру полезной нагрузки своих возвращаемых данных"> stackoverflow.com/questions/15782630/
- person ; 05.04.2013
В конечном итоге это было намного менее «волшебным», когда вы сначала приводили буфер + 20 к структуре tcphdr, а затем вытаскивали оттуда порт. Похоже, во всех других сообщениях в Интернете об этом все решают реализовать это, напрямую приводя буфер + 20 к беззнаковому шорту. Не уверен, есть ли какой-либо выигрыш в производительности, если делать это напрямую, только путаница для тех, кто менее информирован, кто читает код.
- person ; 05.04.2013
@RodrigoSalazar Может не быть заметного прироста производительности, но имейте в виду, что вы создаете пакеты для входа в пространство пользователя из пространства ядра, что повлияет на скорость вашего интернета, в зависимости от того, сколько правил iptables вы написали и сколько пакетов направлены на ваш модуль. Если вас интересует только порт и IP-адрес в пакетах, то использование netfilter не лучший выбор, в этом случае вам следует использовать libpcap, а код почти такой же. Используйте netfilter, если хотите изменить или выборочно заблокировать пакеты.
- person adnan kamili; 05.04.2013