【问题标题】:Mangling sk_buff data in a Netfilter module在 Netfilter 模块中处理 sk_buff 数据
【发布时间】:2013-08-14 00:29:00
【问题描述】:

我正在构建一个模块,对其中包含的协议进行大量修改。我只处理第 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 代码,因为它也会破坏数据包,但所有转换代码都比我正在做的事情要复杂。

【问题讨论】:

  • 我没有关注你的所有帖子,所以只有一点:内核甚至不读取/etc/protocols,无论如何这只是一个将名称与数字相关联的数据库。该文件与任何内核编程都无关。
  • 我以为是这样。我发现与/etc/protocols 唯一有关的是netdb.h 标头。稍后我会在收到一篇博文后更新我的答案,并详细说明我的工作以及我是如何做到的,以便其他人可以了解更多信息。

标签: networking netfilter


【解决方案1】:

分辨率

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

代码

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

而且很快就奏效了。

【讨论】:

    猜你喜欢
    • 2015-01-13
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2022-08-03
    • 2018-03-12
    相关资源
    最近更新 更多