Linux的ip_conntrack半景
來源:互聯網
上載者:User
ip_conntrack內建於Linux協議棧的Netfilter架構,其實現比較複雜,然而其邏輯卻很簡單。ip_conntrack追蹤每一個流,一個流由五元組來定義,五元組這個網路基本術語就不解釋了。因此ip_conntrack必然能對“哪裡是一個流的開始”做出判斷,雖然這種判斷不總是精確的,詳見《linux之ip_conntrack容易混淆的問題點滴》。
ip_conntrack會為每一個到來的包綁定一個流,如果找不到遵照五元組可以綁定的流,則會認為這是個流頭,那麼就會根據該包所攜帶的五元組資訊建立一個新的流,整個情境可以由下面的流程圖展示出來:
有了一個基本的認識,再遇到問題的時候就可以用知道的知識來解決了,比如《iptables和策略路由實現VPN感興趣流的截獲》一文中的問題,要截獲一個特定的流,然而由於拓撲複雜,還要支援任意點到任意點的互連,僅僅根據IP層的資訊就很難分辨出一個雙向的資料流是由哪裡發起的,因此就必然要使用ip_conntrack。ip_conntrack有一個match,那就是ctdir,它可以分辨出方向資訊,然而它是如何做到的呢?通過就可以看出,ip_conntrack儲存了一個雜湊表,其中的表項內容就是一個五元組,然而兩個方向的五元組資訊是分開存放的,這就便於根據單獨的五元組進行尋找,雖然它們分開存放,屬於同一個流的雙向兩個五元組又由同一個nf_conn結構(不同核心版本名字可能不同)統一了起來。如此一來就很容易辨別方向了。流量截獲的mangle規則如所示:
以下是策略路由規則:
上述的流量截獲方法其實就是使用ip_conntrack機製為IP資料報增加了方向的特徵,然後你可以很方便的根據方向資訊區分不同的流量,最終使用原則路由將資料包導向特定的目的地。
ip_conntrack雖然功能強大,然而卻也帶來不少爭議,幸運的是關於這些爭議的不好的方面都是有解決辦法的。