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

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

一个在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; 

传入数据包:

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

所以,碰巧我也收到了defrags传入的数据包,我有点混乱他们应该如何处理。

我希望碎片整理数据包排队,然后接收整个数据包。 任何想法。 我一直在经历可用的function

 ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER); 

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

任何有关这方面的帮助将不胜感激。

设置CONFIG_NF_DEFRAG_IPV4 ,它在/net/ipv4/netfilter/Kconfig ,其挂钩ipv4_defrag_ops[]将位于NF_INET_PRE_ROUTINGNF_INET_LOCAL_OUT 。 并且你的钩子的优先级应该大于NF_IP_PRI_CONNTRACK_DEFRAG ,因此,你的钩子在ipv4_defrag_ops[]之后执行,这将为你做组装,在NF_IP_PRE_ROUING阶段。 之后, skb进入你的钩子,应该是一个组装的包。