c - 使用 Netfilter 封装和解封装 IPv4 数据包

标签 c networking linux-kernel netfilter

我在 netfilter 框架中有两个钩子(Hook)。

一个位于 NF_IP_PRE_ROUTING 用于传入数据包,另一个位于 NF_IP_LOCAL_OUT 用于传出数据包。

传出数据包:

现在,所有从特定 IP 地址发出的 IPv4 数据包都封装在另一个 IPv4-UDP 数据包中。

我使用 pskb_expand_head API 来为封装留出更多空间。并且,然后用ip_route_output_key找到合适的rtable。使用 rtable,我重新分配 skb->dstskb->dev。然后,我继续使用 NF_ACCEPT 接受数据包。

skb_dst_drop(skb);
skb_dst_set(skb, &rt->dst);
skb->dev = skb_dst(skb)->dev;

传入数据包:

现在,所有封装的数据包都被接收并根据端口号进行识别。 并且,封装(IP+UDP+XYZ HEADER)被拉出。类似于传出数据包 我使用 ip_route_output_key 获取 rt(rtable)。
使用 rtable 重新分配 skb->dstskb->dev。然后我用 NF_ACCEPT

接受数据包

所以,碰巧我也收到碎片整理传入的数据包,我有点困惑应该如何处理它们。

我希望对数据包进行碎片整理,然后再接收整个数据包。 对此有任何想法。我一直在浏览可用的功能

ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER);

但这似乎是用于在NF_IP_LOCAL_IN阶段组装数据包,但我想要在NF_IP_PRE_ROUING阶段组装数据包。

我们将不胜感激。

最佳答案

设置CONFIG_NF_DEFRAG_IPV4,定义在/net/ipv4/netfilter/Kconfig,它的钩子(Hook)ipv4_defrag_ops[]会位于 >NF_INET_PRE_ROUTINGNF_INET_LOCAL_OUT。并且你的钩子(Hook)的优先级应该大于 NF_IP_PRI_CONNTRACK_DEFRAG,因此,你的钩子(Hook)在 ipv4_defrag_ops[] 之后执行,它会在 NF_IP_PRE_ROUING< 为你组装阶段。之后,skb 进入你的钩子(Hook),应该是一个组装包。

关于c - 使用 Netfilter 封装和解封装 IPv4 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23234344/

相关文章:

c - 使用 libcurl 通过 HTTP POST 发送多个文件

android - curl_multi_wakeup 似乎没有唤醒关联的 curl_multi_poll - Android(但可能不限于)

c - 诸如 printf() 之类的函数在 Linux 和 Windows 上的实现方式是否不同?

linux - kmalloc 中 GFP_USER 标志的用途是什么?

linux-kernel - 关于 dma_alloc_coherent 的一些问题

linux-kernel - 有 copy_from_user 时 get_user 的应用

c - 这怎么可能?

java - address.isReachable 不会发现网络上的所有节点

iphone - 将音频流式传输到本地网络

python - 如何使用IPy确定IP地址是否在白名单中?