How does nfq_get_payload structure its return data

2019-08-19 05:09发布

首先,我想从一个Netfilter队列中的载荷的有效载荷中的源地址和目的端口(有效载荷使用nfq_get_payload功能检索)。 下面的问题是问同样的事情,并得到一个正确的答案:

如何提取从分组的源和目的地端口号的iptables的队列

不幸的是,没有解释为什么增加20和22的地址让你在正确的位置读取信息。 我想这是因为数据(显然)的结构,但如果有一个定义的结构,它是什么?

该文件没有明确说明数据是如何格式化的,只有“通过该功能获取的数据类型将取决于与nfq_set_mode()函数设置模式”,但后来SET_MODE的文档没有提及有关数据什么类型和来源并不立刻露出任何东西。

我觉得这一定是要的东西我失踪或不理解常见的网络编程结构非常集中。

注:nfq_get_payload功能: http://www.netfilter.org/projects/libnetfilter_queue/doxygen/group__Parsing.html#gaf79628558c94630e25dbfcbde09f2933

Answer 1:

我设法弄清楚了这一点,我会在这里把这个留给他人找到。

有效载荷开始与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
}


文章来源: How does nfq_get_payload structure its return data?