Tag: 联网

使用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->dst和skb->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->dst和skb->dev 。 然后我接受带有NF_ACCEPT的数据包 所以,碰巧我也收到了defrags传入的数据包,我有点混乱他们应该如何处理。 我希望碎片整理数据包排队,然后接收整个数据包。 任何想法。 我一直在经历可用的function ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER); 但这似乎是用于在NF_IP_LOCAL_IN阶段组装数据包,但我希望在NF_IP_PRE_ROUING阶段组装数据包。 任何有关这方面的帮助将不胜感激。