2014-04-23 84 views
1

我在netfilter框架中有兩個鉤子。使用Netfilter封裝和解封IPv4包

一個在NF_IP_PRE_ROUTING用於傳入數據包,另一個在NF_IP_LOCAL_OUT用於傳出數據包。

發出的數據包:

現在,所有的IPv4數據包從特定的IP地址發送出去,被封裝在另一個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階段的組裝包。

任何幫助,將不勝感激。

+0

您有一段我標記爲* Duplicated Text *的段落 - 如果無意中包含,則應該刪除該段落。請幫我幫助你做出一個好問題。 –

+0

嗨jonathon,謝謝我糾正了這一點。 – innosam

回答

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去你的鉤子,應該是一個組裝的數據包。

+0

感謝您的想法,我實際上最終使用ip_derag收集PRE_ROUTING STAGE中的數據包。 'ret = ip_defrag(skb,IP_DEFRAG_CONNTRACK_IN);如果(ret)返回NF_STOLEN;' – innosam