gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:47:21 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com