0

我正在构建一个模块,对其中包含的协议进行大量修改。我只处理第 4 层数据包。我在另一端将它们转换回应有的状态。数据包大小仍然是 1:1,所以真的不需要重新分配 skb...

也就是说,我改变了skb->data,然后NF_ACCEPT从我的NF_IP_LOCAL_OUT钩子中返回。我有另一个钩子显示 sk_buff 已传递给NF_IP_POST_ROUTING,但数据包实际上从未离开主机(因为我在 Wireshark 中看不到它)。我不知道发生了什么。数据包是否被丢弃在某个地方?除了 netfilter 钩子之外,我没有使用任何其他内核钩子,也没有操纵目的地,所以它应该毫无疑问地离开机器。

有什么想法可能导致它吗?我需要向内核注册我的自定义 IPPROTO 吗?我有它,/etc/protocols我认为这就足够了。还是我完全走错了路?我尝试使用 IPsec 内核中的 ESP 和 AH 代码,因为它也会破坏数据包,但是所有转换代码都比我正在做的事情更复杂。

4

1 回答 1

0

解析度

似乎我做的一切都是正确的,只有一个例外。我没有重新计算 IP 标头的校验和(因为我正在更改协议 ID 本身,这是强制性的)。

代码

iph->check = 0;
iph->check = ip_fast_csum(iph, iph->ihl);

并且很快就奏效了。

于 2013-08-14T20:51:37.563 回答