nfq_get_payload如何构造其返回数据?

时间:2013-04-03 08:44:38

标签: c++ linux network-programming iptables netfilter

首先,我正在尝试从Netfilter队列有效负载的有效负载中获取源地址和目标端口(使用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

1 个答案:

答案 0 :(得分: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
}