2013-04-03 3 views
0

Прежде всего, я пытаюсь получить адрес источника и dest-порт из полезной нагрузки полезной нагрузки очереди Netfilter (полезная нагрузка извлекается с помощью функции nfq_get_payload). Следующий вопрос задает то же самое и получает правильный ответ:Как nfq_get_payload структурирует возвращаемые данные?

How to extract source and destination port number from packet in queue of iptables

К сожалению, нет никакого объяснения, почему добавление 20 и 22 по адресу ставит вас в нужном месте, чтобы прочитать информацию. Я предполагаю, что это из-за структуры данных (очевидно), но если есть определенная структура, что это такое?

В документации явно не указано, как форматируются данные, а только то, что «тип данных, полученных этой функцией, будет зависеть от режима, установленного с помощью функции nfq_set_mode()», но тогда документы для set_mode не упомянуть что-нибудь о типе данных, и источник ничего не обнаруживает сразу.

Я чувствую, что это должно быть что-то очень важное для общих структур сетевого программирования, которые я пропускаю или не понимаю.

Примечания: Функция nfq_get_payload: http://www.netfilter.org/projects/libnetfilter_queue/doxygen/group__Parsing.html#gaf79628558c94630e25dbfcbde09f2933

ответ

7

мне удалось понять это, и я оставлю это здесь для других, чтобы найти.

Полезная нагрузка начинается с структуры iphdr. Структура iphdr имеет поле протокола, например tcp, если это tcp, то данные после структуры iphdr являются структурой tcphdr, если это udp, то для этого есть другая структура hdr и т. Д. Для icmp и т. Д.

для того, чтобы получить доступ к порту, предположим, что q_data является указателем на nfq_data структуры:

unsigned char *data; 
nfq_get_payload(q_data, (unsigned char**)&data); 
struct iphdr * ip_info = (struct iphdr *)data; 
if(ip_info->protocol == IPPROTO_TCP) { 
    struct tcphdr * tcp_info = (struct tcphdr*)(data + sizeof(*ip_info)); 
    unsigned short dest_port = ntohs(tcp_info->dest); 
} else if(ip_info->protocol == IPPROTO_UDP) { 
    //etc etc 
} 
+0

не должно быть: 'структура iphdr * ip_info = (структура iphdr *) (данные + SizeOf (структура ethhdr))'? Почему вы не пропустите 'struct ethhdr', чтобы перейти к' struct iphdr '? – elmazzun

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