我在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;
传入数据包:
现在,接收所有封装数据包并根据端口号识别。
并且,封装(IP+UDP+XYZ HEADER)
被拉出。和传出包类似
我使用ip_route_output_key
来获得rt(rtable)
使用rtable重新分配skb->dst
和skb->dev
。然后我接受NF_ACCEPT
所以,碰巧我也收到了defrags传入的数据包,我有点混乱,他们应该如何处理。
我希望将碎片整理数据包排队,然后再接收整个数据包。 任何想法。我一直在阅读可用的功能
ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER);
但这似乎是用于在NF_IP_LOCAL_IN
阶段组合数据包,但是我希望在NF_IP_PRE_ROUING
阶段组合数据包。
对此有任何帮助将不胜感激。
答案 0 :(得分:1)
设置CONFIG_NF_DEFRAG_IPV4
中定义的/net/ipv4/netfilter/Kconfig
,其挂钩ipv4_defrag_ops[]
将位于NF_INET_PRE_ROUTING
和NF_INET_LOCAL_OUT
。并且你的钩子的优先级应该大于NF_IP_PRI_CONNTRACK_DEFRAG
,因此,你的钩子会在ipv4_defrag_ops[]
之后执行,这会在NF_IP_PRE_ROUING
阶段为你做组装。在那之后,skb
进入你的钩子,应该是一个组装的包。