摘要:網(wǎng)絡(luò)攻擊越來(lái)越隱蔽,很多攻擊把特征信息隱藏在多個(gè)數(shù)據(jù)包中,這大大增加了攻擊檢測(cè)的難度,TCP數(shù)據(jù)流重組是可靠數(shù)據(jù)傳輸及網(wǎng)絡(luò)數(shù)據(jù)內(nèi)容還原的基礎(chǔ),也是入侵防御系統(tǒng)中的基礎(chǔ)模塊。論文詳細(xì)介紹了入侵防御系統(tǒng)中TCP數(shù)據(jù)流重組的設(shè)計(jì)原理及實(shí)現(xiàn),給出了核心數(shù)據(jù)結(jié)構(gòu),最后分析了重組的效率及目前存在的問(wèn)題。
關(guān)鍵詞:入侵防御系統(tǒng);TCP數(shù)據(jù)流重組;哈希表;緩存;
中圖分類號(hào):TP393.01 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9599 (2012) 17-0000-02
1 引言
IPS(Intrusion Prevention System)是網(wǎng)絡(luò)安全領(lǐng)域的一種基本安全防護(hù)設(shè)施,是對(duì)入侵檢測(cè)系統(tǒng)(Intrusion Detection System IDS)和各種防火墻的有力補(bǔ)充。在攻擊檢測(cè)的過(guò)程中,為了準(zhǔn)確有效得檢測(cè)出隱蔽在多個(gè)數(shù)據(jù)包中的攻擊,必須進(jìn)行TCP會(huì)話的還原,從而得到完整的攻擊特征。完成還原后再與攻擊特征庫(kù)的規(guī)則進(jìn)行匹配,可以有效提高檢測(cè)攻擊的效率和準(zhǔn)確度。
2 TCP數(shù)據(jù)流重組的實(shí)現(xiàn)原理
2.1 核心數(shù)據(jù)結(jié)構(gòu)
用于保存一個(gè)完整TCP連接信息的結(jié)構(gòu):
struct tcp_stream{
struct tuple4 addr; //TCP連接雙方的地址信息
char nids_state; //連接的邏輯狀態(tài)
struct lurker_node *listeners; //包含回調(diào)函數(shù)的鏈表
struct half_stream client; //客戶端狀態(tài)及數(shù)據(jù)
struct half_stream server; //服務(wù)器端狀態(tài)及數(shù)據(jù)
struct half_stream *next_node; //HASH中同一鍵值的下一個(gè)節(jié)點(diǎn)指針
struct half_stream *prev_node; //HASH中同一鍵值的前一個(gè)節(jié)點(diǎn)指針
int hash_index; //HASH表中的索引值
struct half_stream *next_time; //用于保存TCP連接的先后順序,構(gòu)建時(shí)間鏈
struct half_stream *prev_time;
int read; //本次讀進(jìn)數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)長(zhǎng)度
struct half_stream *next_free; //指向TCP連接緩沖池中下一個(gè)空閑結(jié)構(gòu)
}
用于保存TCP連接終端信息的結(jié)構(gòu)體:
struct half_stream{
char state; //狀態(tài)
char collect;//如果大于0,則保存其數(shù)據(jù)到緩沖區(qū)中
char collect_urg; //如果大于0,則保存緊急數(shù)據(jù)
char *data; //未處理TCP數(shù)據(jù)緩沖區(qū)
int offset; //保存到“data”緩沖區(qū)的首字節(jié)數(shù)據(jù)偏移量
int count; //自從連接建立以來(lái)保存的數(shù)據(jù)字節(jié)數(shù)
int count_new; //最近一次接收到的數(shù)據(jù)字節(jié)數(shù)
int bufsize; //data區(qū)的長(zhǎng)度
int rmem_alloc; //該TCP連接的所有數(shù)據(jù)的長(zhǎng)度和
int urg_count; //該終端接收到得緊急數(shù)據(jù)的總數(shù)目
u_int acked; //未用
u_int seq; //本次TCP包中的SEQ
u_int ack_seq; //ACK
u_int first_data_seq; //TCP建立連接時(shí)的初始SEQ
u_char urgdata; //緊急數(shù)據(jù)
u_char count_new_urg; //如果非0,表示有緊急數(shù)據(jù)到達(dá)
u_char urg_seen; //有新的URG數(shù)據(jù),并且不是以前的重復(fù)數(shù)據(jù)
u_int urg_ptr; //指向URG數(shù)據(jù)在流中的位置
u_short window; //TCP窗口大小
u_char wscale_on; //窗口擴(kuò)大因子標(biāo)志
u_int curr_ts; //當(dāng)前時(shí)間
u_int wscale; //窗口擴(kuò)大因子
struct skbuff *list; //當(dāng)收到的TCP包中的SEQ比期望的大時(shí),則將該數(shù)據(jù)先保存在此雙向鏈表中,為訪問(wèn)方便,此鏈表按包中的SEQ從小到大排列
struct skbuff *listtail; //指向list鏈表的鏈尾
}
2.2 Hash表及Hash算法的設(shè)計(jì)
在TCP數(shù)據(jù)流的重組過(guò)程中,為了提高查找連接的速度,使用了Hash算法,并通過(guò)雙向鏈表解決了Hash沖突情況,這與普通的鏈表的順序查找相比,大大提高了查找的效率。在管理連接Hash表中,針對(duì)每一個(gè)結(jié)點(diǎn),加入了連接的超時(shí)機(jī)制,并通過(guò)雙向時(shí)間鏈表根據(jù)連接的先后組建成一條時(shí)間鏈,在緩存不夠時(shí),則遍歷時(shí)間鏈表并首先釋放超時(shí)的連接以及最老的連接,從而釋放出足夠的空間來(lái)建立最近的TCP連接,Hash表的結(jié)構(gòu)如下圖2.1所示:
圖中tcp_oldest和tcp_latest分別指向所有結(jié)點(diǎn)組成的以連接發(fā)起時(shí)間為基準(zhǔn)的雙向鏈表的表頭和表尾,而tcp_free則指向緩沖池中最近釋放的空閑結(jié)點(diǎn),整個(gè)緩沖池組成一個(gè)雙向的循環(huán)鏈表,tcp連接的所有結(jié)點(diǎn)的存儲(chǔ)空間都從tcp連接緩沖池中分配,緩沖池是在模塊啟動(dòng)時(shí)一次性申請(qǐng)足夠量的內(nèi)存,這樣就避免了在重組過(guò)程中頻繁調(diào)用malloc和free函數(shù)所帶來(lái)的內(nèi)核態(tài)與用戶態(tài)進(jìn)程切換的時(shí)間開(kāi)銷,從而提高了重組的效率。
在tcp會(huì)話還原中,使用四元組(源IP,源端口,目的IP,目的端口)和連接發(fā)起的時(shí)間time作為hash值的計(jì)算因子,和僅僅使用四元組作為計(jì)算hash值的方法相比,可以有效降低hash沖突,hash值的計(jì)算算法使用如下公式:
在計(jì)算hash值時(shí),首先根據(jù)公式1和公式2初始化兩個(gè)基準(zhǔn)數(shù)組,每個(gè)數(shù)組的長(zhǎng)度是16字節(jié),根據(jù)公式3用源IP地址sip、目的IP地址dip、源端口sport、目的端口dport以及連接的發(fā)起時(shí)間time來(lái)初始化長(zhǎng)度是16個(gè)字節(jié)的數(shù)組data,根據(jù)公式4迭代計(jì)算hash值res。
3 數(shù)據(jù)流重組的性能分析及存在的問(wèn)題
針對(duì)本模塊,測(cè)試環(huán)境的網(wǎng)絡(luò)拓?fù)鋱D如下圖3.1所示:
上圖中包發(fā)送終端主要用來(lái)控制ThreadEx數(shù)據(jù)包發(fā)送工具,ThreadEx設(shè)備有多個(gè)網(wǎng)口,其中一個(gè)網(wǎng)口通過(guò)網(wǎng)線連接控制終端,另一個(gè)網(wǎng)口連接入侵防御系統(tǒng)TCP數(shù)據(jù)流重組服務(wù)器;IPS TCP重組服務(wù)器具有兩個(gè)網(wǎng)卡,并且把網(wǎng)卡配置成轉(zhuǎn)發(fā)模式,這樣當(dāng)數(shù)據(jù)包經(jīng)過(guò)IPSserver完成重組會(huì)就立即轉(zhuǎn)發(fā)經(jīng)過(guò)的數(shù)據(jù)包。在上圖所示的網(wǎng)絡(luò)測(cè)試環(huán)境下,發(fā)包工具在20s內(nèi)發(fā)送30萬(wàn)個(gè)連接,系統(tǒng)可以正常重組所有的連接,當(dāng)系統(tǒng)所處理的實(shí)時(shí)連接數(shù)大于50萬(wàn)時(shí),開(kāi)始出現(xiàn)丟包現(xiàn)象。
4 結(jié)論
本文給出了網(wǎng)絡(luò)入侵防御系統(tǒng)中TCP數(shù)據(jù)流重組hash表、hash算法、緩存機(jī)制以及重組流程的設(shè)計(jì)原理和過(guò)程,給出了重組中的核心數(shù)據(jù)結(jié)構(gòu)、重組中的關(guān)鍵技術(shù)、關(guān)鍵算法,并對(duì)重組的性能及存在的問(wèn)題進(jìn)行了分析,為研究發(fā)展IPS做了一些探討。
參考文獻(xiàn):
[1]劉文濤.網(wǎng)絡(luò)安全開(kāi)發(fā)包詳解[M].電子工業(yè)出版社,2005.
[2]W. Richard Stevens 著 TCP/IP Illustrated Volume 1:The Protocols.
[3]James F.Kurose Keith W.Ross 著 Computer Networking A Top-Down Approach Featuring the Internet,Third Edition.
[4]鄧子寬,范明鈺,王光衛(wèi),朱大勇.Snort入侵檢測(cè)系統(tǒng)中TCP流重組的研究,2007,2.
[5]孔華鋒,金波,劉恩強(qiáng),候曉杰.快速無(wú)損TCP數(shù)據(jù)流重組算法研究
基金項(xiàng)目:四川省科技計(jì)劃項(xiàng)目(2009GZ0148)
[作者簡(jiǎn)介]
何興高(1964-),男,高級(jí)工程師(副教授),主要研究方向:信息安全,網(wǎng)絡(luò)安全;車明明(1989-),男,碩士生,主要研究方向:網(wǎng)絡(luò)安全;張鳳荔(1963-),女,教授(博導(dǎo)),主要研究方向:網(wǎng)絡(luò)安全,大型數(shù)據(jù)災(zāi)難恢復(fù)。