2

我用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.

我哪里错了?

4

2 回答 2

4

你可以在这里查看: http ://www.roman10.net/how-to-filter-network-packets-using-netfilterpart-2-implement-the-hook-function/ 问题是netfilter在网络层实现,当数据包从物理层上升时,您在数据包到达 tcp 层之前捕获数据包,某些功能未处理。

于 2013-05-01T11:56:20.123 回答
0

内核版本是非常重要的信息。在Linux网络内核中,SKB的transport_header(和许多其他属性)在第一次创建时(由驱动程序)是没有设置的,SKB在移动SKB的数据指针的同时被逐层处理。因此,如果您的挂钩较低,也就是桥级别,则可能在您访问它时尚未设置。

于 2012-05-08T13:07:48.097 回答