首先,我尝试从 Netfilter 队列有效负载的有效负载中获取源地址和目标端口(使用 nfq_get_payload 函数检索有效负载)。下面的问题提出了同样的问题并得到了正确的答案:
如何从 iptables 队列中的数据包中提取源端口号和目标端口号 https://stackoverflow.com/questions/12673079/how-to-extract-source-and-destination-port-number-from-packet-in-queue-of-iptabl/12685540#12685540
不幸的是,没有解释为什么在地址中添加 20 和 22 可以让您在正确的位置阅读信息。我认为这是因为数据的结构(显然),但如果有一个定义的结构,它是什么?
该文档没有明确解释数据的格式,只是“此函数检索的数据类型将取决于 nfq_set_mode() 函数设置的模式”,但 set_mode 的文档没有提及任何有关数据的内容类型和来源不会立即透露任何内容。
我觉得这一定是我所缺少或不理解的常见网络编程结构的核心内容。
注:nfq_get_payload函数:http://www.netfilter.org/projects/libnetfilter_queue/doxygen/group__Parsing.html#gaf79628558c94630e25dbfcbde09f2933 http://www.netfilter.org/projects/libnetfilter_queue/doxygen/group__Parsing.html#gaf79628558c94630e25dbfcbde09f2933
我设法解决了这个问题,我将把它留在这里供其他人找到。
有效负载以 iphdr 结构开始。 iphdr 结构体有一个协议字段,例如 tcp,如果是 tcp 那么 iphdr 结构体后面的数据就是 tcphdr 结构体,如果是 udp,那么还有另一个 struct 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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)