歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux的ip_conntrack半景

Linux的ip_conntrack半景

日期:2017/2/28 15:55:17   编辑:Linux教程

ip_conntrack內置於Linux協議棧的Netfilter框架,其實現比較復雜,然而其邏輯卻很簡單。ip_conntrack追蹤每一個流,一個流由五元組來定義,五元組這個網絡基本術語就不解釋了。因此ip_conntrack必然能對“哪裡是一個流的開始”做出判斷,雖然這種判斷不總是精確的,詳見《linux之ip_conntrack容易混淆的問題點滴》http://www.linuxidc.com/Linux/2012-03/55823.htm。

ip_conntrack會為每一個到來的包綁定一個流,如果找不到遵照五元組可以綁定的流,則會認為這是個流頭,那麼就會根據該包所攜帶的五元組信息創建一個新的流,整個場景可以由下面的流程圖展示出來:

有了一個基本的認識,再遇到問題的時候就可以用知道的知識來解決了,比如《iptables和策略路由實現VPN感興趣流的截獲》一文中的問題,要截獲一個特定的流,然而由於拓撲復雜,還要支持任意點到任意點的互通,僅僅根據IP層的信息就很難分辨出一個雙向的數據流是由哪裡發起的,因此就必然要使用ip_conntrack。ip_conntrack有一個match,那就是ctdir,它可以分辨出方向信息,然而它是如何做到的呢?通過上圖就可以看出,ip_conntrack保存了一個哈希表,其中的表項內容就是一個五元組,然而兩個方向的五元組信息是分開存放的,這就便於根據單獨的五元組進行查找,雖然它們分開存放,屬於同一個流的雙向兩個五元組又由同一個nf_conn結構(不同內核版本名字可能不同)統一了起來。如此一來就很容易辨別方向了。流量截獲的mangle規則如下圖所示:

以下是策略路由規則:

上述的流量截獲方法其實就是使用ip_conntrack機制為IP數據報增加了方向的特征,然後你可以很方便的根據方向信息區分不同的流量,最終使用策略路由將數據包導向特定的目的地。

ip_conntrack雖然功能強大,然而卻也帶來不少爭議,幸運的是關於這些爭議的不好的方面都是有解決辦法的。

Copyright © Linux教程網 All Rights Reserved