核心版本:2.6.34
前面章節介紹過Netfilter的架構,地址見: http://blog.csdn.net/qy532846454/article/details/6605592,本章節介紹的串連跟蹤就是在Netfilter的架構上實現的,連 接跟蹤是實現DNAT,SNAT還有有狀態的防火牆的基礎。它的本質就是記錄一條串連,具體來說只要滿足一來一回兩個過程的都可 以算作串連,因此TCP是,UDP是,部分IGMP/ICMP也是,記錄串連的作用需要結合它的相關應用(NAT等)來理解,不是本文的重點 ,本文主要分析串連跟蹤是如何?的。
回想Netfilter架構中的hook點(下文稱為勾子),這些勾子相當於報文進出協議棧的 關口,報文會在這裡被攔截,然後執行勾子結點的函數,串連跟蹤利用了其中幾個勾子,分別對應於報文在接收、發送和轉寄中 ,如下圖所示:
串連跟蹤正是在上述勾子上註冊了相應函數(在nf_conntrack_l3proto_ipv4_init中被註冊),勾子為ipv4_conntrack_ops, 具體如下:
static struct nf_hook_ops ipv4_conntrack_ops[] __read_mostly = { { .hook = ipv4_conntrack_in, .owner = THIS_MODULE, .pf = NFPROTO_IPV4, .hooknum = NF_INET_PRE_ROUTING, .priority = NF_IP_PRI_CONNTRACK, }, { .hook = ipv4_conntrack_local, .owner = THIS_MODULE, .pf = NFPROTO_IPV4, .hooknum = NF_INET_LOCAL_OUT, .priority = NF_IP_PRI_CONNTRACK, }, { .hook = ipv4_confirm, .owner = THIS_MODULE, .pf = NFPROTO_IPV4, .hooknum = NF_INET_POST_ROUTING, .priority = NF_IP_PRI_CONNTRACK_CONFIRM, }, { .hook = ipv4_confirm, .owner = THIS_MODULE, .pf = NFPROTO_IPV4, .hooknum = NF_INET_LOCAL_IN, .priority = NF_IP_PRI_CONNTRACK_CONFIRM, }, };
從下面的表格中可以看得更清楚:
開頭說過,串連跟蹤的目的是記錄一條串連的資訊,對應的資料結構就是tuple,它分為正向(tuple)和反向(repl_tuple), 無論TCP還是UDP都是串連跟蹤的目標,當A向B發送一個報文,A收到B的報文時,我們稱一個串連建立,在串連跟蹤中為 ESTABLISHED狀態。特別要注意的是一條串連的資訊對雙方是相同的,無論誰是發起方,兩邊的串連資訊都保持一致,以方向為 例,A發送報文給B,對A來說,它先發送報文,因此A->B是正向,B->A是反向;對B來說,它先收到報文,但同樣A->B 是正向,B->A是反向。
弄清楚這一點後,每條串連都會有下面的資訊相對應
tuple [sip sport tip tport proto]
UDP的過程
UDP的串連跟蹤的建立實際是TCP的簡化版本,沒有了三向交握過程,只要收到+發送完成,連 接跟蹤也隨之完成。