【協議森林】詳解Netfilter(三)

1、主要處理部分

再來回顧一下Netfilter的框架。如果不存在Netfilter框架,則包的流程就是圖中的函數調用,比如到本地的是:
ip_rcv()->ip_rcv_finish()->ip_local_deliver()->ip_local_deliver_finish()
當加上Netfilter的時候,就會在鉤子點的地方先調用註冊的函數,然後再調用正常流程中的函數。還拿到本地的包舉例:
ip_rcv()->ipv4_conntrack_defrag()->nf_conntrack_in()->其他鉤子處理……->ip_rcv_finish()->ip_local_deliver()->ipv4_confirm()->其他鉤子處理……->ip_local_deliver_finish
在這裏插入圖片描述
從會話跟蹤的角度上看,當一個數據包流經Netfilter的時候,主要是經歷了幾個函數
在這裏插入圖片描述
當數據包流經LOCAL_OUT鉤子點的時候,調用的是ipv4_conntrack_local,只不過ipv4_conntrack_local最終還是調用了函數nf_conntrack_in函數,所以這裏沒畫出ipv4_conntrack_local函數。ipv4_conntrack_defrag主要是完成ip報文分片的重新組裝,將屬於一個IP報文的多個分片組成一個真正的報文。連接跟蹤只跟蹤完整的IP報文,這裏不關心IP分片重組的函數ipv4_conntrack_defrag,所以這裏着重分析nf_conntrack_in和ipv4_confirm函數。
來自網絡的數據包(本地、內網、外網),都會經過函數nf_conntrack_in,首先來看nf_conntrack_in都做了哪些操作,
在這裏插入圖片描述
在這裏插入圖片描述
structsk_buff{}中有兩個元素與連接跟蹤有關係,分別是nfct和nfctinfo。nf_conntrack.h中提供了一個函數staticinlinestructnf_conn*nf_ct_get(skb,*ctinfo),此函數可獲取到skb的指針nfct(與此數據相關聯的連接),從而得知該數據包的連接狀態和該連接狀態的相關信息ctinfo。從連接跟蹤的角度來看,這個ctinfo表示了每個數據包的幾種連接狀態:
IP_CT_ESTABLISHED
Packet是一個已建連接的一部分,在其初始方向。
IP_CT_RELATED
Packet屬於一個已建連接的相關連接,在其初始方向。
IP_CT_NEW
Packet試圖建立新的連接
IP_CT_ESTABLISHED+IP_CT_IS_REPLY
Packet是一個已建連接的一部分,在其響應方向。
IP_CT_RELATED+IP_CT_IS_REPLY
Packet屬於一個已建連接的相關連接,在其響應方向。
流程中間有一部分是涉及到期望連接的部分,下文再講。再來看下出口做的操作:
在這裏插入圖片描述
出口的函數主要是從‘非確認’的鏈表中摘下來,然後加入到確認的鏈表中(net->ct.hash[])。入口函數nf_conntrack_in中,查找是否存在tuple就是從net->ct.hash[]這個哈希鏈表中查找的。定時器超時的時間是在4層協議的回調函數packet中指定的,當超時的時候,會調用函數death_by_timeout(在初始化ct的時候,指定)。

2、連接跟蹤的銷燬

(1)death_by_timeout函數,當會話超時的時候,會調用這個回調。
超時銷燬:當一個會話經歷了入口和出口以後,會添加一個超時的timer,等到timer超時的時候,就會調用回調函數。
(2)內核程序主動進行銷燬
對於會話的銷燬,也主要是通過nf_ct_put->nf_conntrack_put函數來進行。nf_conntrack_put函數的作用是對於這條連接會話的引用次數減1,如果被引用次數爲0,則釋放該條會話的相關資源。當是一條新會話的時候,會將引用計數設置爲1,當該會話被確認過了之後,該引用計數會被加1。
當釋放skb的時候,調用kfree_skb函數,然後涉及到會話的部分最終也是調用nf_conntrack_put函數來對於會話的引用減1。
當Netfilter執行鉤子函數的過程中,只要有一個返回NF_DROP,這個時候,就會調用kfree_skb的操作,這時候,如果此時Netfilter還沒有執行到nf_conntrack_confirm函數,則這條會話可能會被釋放掉(因爲此時會話的引用計數爲1)。調用關係如下:在這裏插入圖片描述
在這裏插入圖片描述
從以上的流程圖可以看出,最終都是通過nf_conntrack_put這個函數銷燬的。

加入討論

在這裏插入圖片描述

發佈了164 篇原創文章 · 獲贊 85 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章