資源描述:
《Linux連接跟蹤源碼分析報告.doc》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Linux連接跟蹤源碼分析IPConnectiontracking連接跟蹤用來跟蹤和記錄連接狀態(tài),是netfilter的一部份,也是通過在hook點(diǎn)上注冊相應(yīng)的結(jié)構(gòu)來工作的。無論是發(fā)送,接收,還是轉(zhuǎn)發(fā)的數(shù)據(jù)包,都要經(jīng)過兩個conntrack模塊。第一個conntrack點(diǎn)的優(yōu)先級是最高的,所有數(shù)據(jù)包進(jìn)入netfilter后都會首先被它處理,其作用是創(chuàng)建ip_conntrack結(jié)構(gòu)。而最后一個conntrack的優(yōu)先級最低,總是在數(shù)據(jù)包離開netfilter之前做最后的處理,它的作用是將該數(shù)據(jù)包的連接跟蹤結(jié)構(gòu)添加到系統(tǒng)的連接狀態(tài)表中1.ip_conntarck結(jié)構(gòu)ip_co
2、nntrack.h內(nèi)核中用一個ip_conntrack結(jié)構(gòu)來描述一個連接的狀態(tài)structip_conntrack{/*nf_conntrack結(jié)構(gòu)定義于include/linux/skbuff.h,Line89,其中包括一個計數(shù)器use和一個destroy函數(shù)。計數(shù)器use對本連接記錄的公開引用次數(shù)進(jìn)行計數(shù)*/structnf_conntrackct_general;/*其中的IP_CT_DIR_MAX是一個枚舉類型ip_conntrack_dir(位于include/linux/netfilter_ipv4/ip_conntrack_tuple.h,Line65)的第
3、3個成員,從這個結(jié)構(gòu)實(shí)例在源碼中的使用看來,實(shí)際上這是定義了兩個tuple多元組的hash表項(xiàng)tuplehash[IP_CT_DIR_ORIGINAL/0]和tuplehash[IP_CT_DIR_REPLY/1],利用兩個不同方向的tuple定位一個連接,同時也可以方便地對ORIGINAL以及REPLY兩個方向進(jìn)行追溯*/structip_conntrack_tuple_hashtuplehash[IP_CT_DIR_MAX];/*這是一個位圖,是一個狀態(tài)域。在實(shí)際的使用中,它通常與一個枚舉類型ip_conntrack_status(位于include/linux/ne
4、tfilter_ipv4/ip_conntrack.h,Line33)進(jìn)行位運(yùn)算來判斷連接的狀態(tài)。其中主要的狀態(tài)包括:IPS_EXPECTED(_BIT),表示一個預(yù)期的連接IPS_SEEN_REPLY(_BIT),表示一個雙向的連接...IPS_ASSURED(_BIT),表示這個連接即使發(fā)生超時也不能提早被刪除IPS_CONFIRMED(_BIT),表示這個連接已經(jīng)被確認(rèn)(初始包已經(jīng)發(fā)出)*/unsignedlongstatus;/*其類型timer_list位于include/linux/timer.h,Line11,其核心是一個處理函數(shù)。這個成員表示當(dāng)發(fā)生連接超時
5、時,將調(diào)用此處理函數(shù)*/structtimer_listtimeout;/*所謂“預(yù)期的連接”的鏈表,其中存放的是我們所期望的其它相關(guān)連接*/structlist_headsibling_list;/*目前的預(yù)期連接數(shù)量*/unsignedintexpecting;/*結(jié)構(gòu)ip_conntrack_expect位于ip_conntrack.h,這個結(jié)構(gòu)用于將一個預(yù)期的連接分配給現(xiàn)有的連接,也就是說本連接是這個master的一個預(yù)期連接*/structip_conntrack_expect*master;/*helper模塊。這個結(jié)構(gòu)定義于ip_conntrack_help
6、er.h,這個模塊提供了一個可以用于擴(kuò)展Conntrack功能的接口。經(jīng)過連接跟蹤HOOK的每個數(shù)據(jù)報都將被發(fā)給每個已經(jīng)注冊的helper模塊(注冊以及卸載函數(shù)分別為ip_conntrack_helper_register()以及ip_conntrack_helper_unregister(),分別位于ip_conntrack_core.c)。這樣我們就可以進(jìn)行一些動態(tài)的連接管理了*/structip_conntrack_helper*helper;/*一系列的nf_ct_info類型(定義于include/linux/skbuff.h,Line92,實(shí)際上就是nf_co
7、nntrack結(jié)構(gòu))的結(jié)構(gòu),每個結(jié)構(gòu)對應(yīng)于某種狀態(tài)的連接。這一系列的結(jié)構(gòu)會被sk_buff結(jié)構(gòu)的nfct指針?biāo)?,描述了所有與此連接有關(guān)系的數(shù)據(jù)報。其狀態(tài)由枚舉類型ip_conntrack_info定義(位于include/linux/netfilter_ipv4/ip_conntrack.h,Line12)共有5個成員:IP_CT_ESTABLISHED:數(shù)據(jù)報屬于已經(jīng)完全建立的連接IP_CT_RELATED:數(shù)據(jù)報屬于一個新的連接,但此連接與一個現(xiàn)有連接相關(guān)(預(yù)期連接);或者是ICMP錯誤IP_CT_NEW:數(shù)據(jù)報屬于一