我正在构建一个模块,对包含在其中的协议进行大规模的破坏。我只是损坏了第4层的数据包。我把他们从另一端转变成他们应该做的样子。包的大小仍然是1:1,所以真的不需要重新分配skb.
也就是说,我更改了skb->data,然后从我的NF_IP_LOCAL_OUT钩子中返回NF_ACCEPT。我有另一个钩子,它显示sk_buff被传递给NF_IP_POST_ROUTING,但是数据包实际上从未离开主机(就像我在Wireshark中没有看到的那样)。我搞不懂到底是怎么回事。包裹是不是掉在什么地方了?除了netfilter钩子之外,我没有使用任何其他内核钩子,也没有操纵目标,所以它应该毫无疑问地离开机器。
有什么原因吗?我需要在内核中注册我的自定义IPPROTO吗?我把它放在/etc/protocols里,我想这就足够了。还是我完全走错了路?我尝试使用IPsec内核中的ESP和AH代码,因为它也破坏了数据包,但是所有的转换代码都比我所需要的要复杂。
发布于 2013-08-14 20:51:37
分辨率
似乎只有一个例外,我做的一切都是正确的。我没有重新计算IP报头的校验和(因为我更改了协议id本身,这是强制性的)。
代码
iph->check = 0;
iph->check = ip_fast_csum(iph, iph->ihl);而且它起了作用。
https://stackoverflow.com/questions/18246762
复制相似问题