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

时间:2014-04-23 03:43:26

标签: c networking linux-kernel netfilter

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

传入数据包:

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

的数据包

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

我希望将碎片整理数据包排队,然后再接收整个数据包。 任何想法。我一直在阅读可用的功能

ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER);

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

对此有任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

设置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进入你的钩子,应该是一个组装的包。