我用netfilter hooks
编写了一个应用程序。
似乎skb_transport_header
函数无法正确计算(有时但并非总是如此):
struct tcphdr* tcp_header = NULL;
tcp_header = (struct tcphdr*)skb_transport_header(skb); // somtimes incorrect address.
tcp_header = (struct tcphdr*)((char*)ip_header + (ip_header->ihl * 4));// always correct address.
我哪里错了?
答案 0 :(得分:4)
你可以在这里查看: http://www.roman10.net/how-to-filter-network-packets-using-netfilterpart-2-implement-the-hook-function/ 问题是netfilter在网络层实现,当数据包从物理层上传时,你在到达tcp层之前捕获数据包,有些功能没有处理。
答案 1 :(得分:0)
内核版本是非常重要的信息。在Linux网络内核中,SKB的transport_header(以及许多其他属性)在首次创建时(由驱动程序)未设置,SKB被逐层处理,而SKB的数据指针被移动。因此,如果您的钩子较低,也就是BRIDGE级别,则在您访问它时可能尚未设置。