[摘要]通過分析IPv6協(xié)議,分片攻擊的基本特點和Linux多線程算法的實現(xiàn),建立IPv6分片包并行重組模型,并給出該模型的一種實現(xiàn)方法,在Linux環(huán)境下進行了測試,最后對實驗結(jié)果進行了分析。
[關(guān)鍵詞]高速網(wǎng)絡(luò) IPv6協(xié)議 分片并行重組
中圖分類號:TP3文獻標識碼:A文章編號:1671-7597(2009)0510040-01
隨著IPv6互聯(lián)網(wǎng)的逐漸發(fā)展、普及,不安全問題并沒有隨著IPv6逐步取代IPv4而消失,反而日益受到重視。為防范分片攻擊以及實現(xiàn)基于IPv6包的后續(xù)應(yīng)用,并減少丟包率,本文提出了IPv6分片包并行重組模型,采取多線程并行重組方式以加快分片包的重組。
一、IPv6協(xié)議和分片攻擊
基于IPv4協(xié)議的上一代互聯(lián)網(wǎng)因其固有的不穩(wěn)定性,不安全性,以及其IPv4地址耗盡的現(xiàn)實因素,越來越成為互聯(lián)網(wǎng)發(fā)展的不利因素,與IPv4協(xié)議相比,IPv6協(xié)議具有許多新的特點并彌補了IPv4的許多不足,比如巨大的地址空間;簡潔的IPv6協(xié)議報頭(基本報頭如圖1所示)以及全新的擴展報頭,其中特別增加了IPSEC安全協(xié)議;全新的ICMPv6協(xié)議,并將ARP協(xié)議和RARP協(xié)議功能集成進ICMPv6協(xié)議中;自動配置功能;對移動IPv6的支持等。
物理網(wǎng)絡(luò)通過將IPv6數(shù)據(jù)包封裝進物理幀來在物理層進行數(shù)據(jù)傳輸?shù)?,每一種物理網(wǎng)絡(luò)都規(guī)定了一幀所能攜帶的最大數(shù)據(jù)量。這一限制稱為最大傳輸單元(Maximum Transmission Unit,MTU)。因而一個數(shù)據(jù)包必須小于或等于一個網(wǎng)絡(luò)的MTU,否則無法進行封裝和傳輸。IPv6協(xié)議規(guī)定,如果要發(fā)送的IPv6數(shù)據(jù)包長度大于路由過程中所經(jīng)過的所有子網(wǎng)的最小MTU值,那么源節(jié)點必須對此數(shù)據(jù)包進行分片,不同于IPv4協(xié)議,中間路由器不必再分片了,最后由目的節(jié)點進行分片重組。因此,對于數(shù)據(jù)包捕獲系統(tǒng)來說,將網(wǎng)卡設(shè)置成混雜(Promiscuous)模式后,也要模擬目的節(jié)點將捕獲的分片數(shù)據(jù)包進行重組成原始數(shù)據(jù)包。
IPv6數(shù)據(jù)包的分片只能在源節(jié)點進行,路由中間節(jié)點不再進行分片操作,簡化了中間節(jié)點對數(shù)據(jù)包的處理,提高的中間節(jié)點對數(shù)據(jù)包的轉(zhuǎn)發(fā)效率;IPv6的分片包重組只發(fā)生在目的節(jié)點。通過MTU發(fā)現(xiàn)機制,源節(jié)點可以確定路由中的最小MTU值,以此作為發(fā)送數(shù)據(jù)的最大限度。當源節(jié)點要進行分片時,它將在IPv6數(shù)據(jù)包的可分片部分插入分片擴展報頭。這些分片包擁有相同的分片標志,但是分片偏移量各不相同。因此對于每一個分片包,必須包含三個部分,依次是原始數(shù)據(jù)包的不可分片部分、分片擴展頭(fragment header),原始數(shù)據(jù)包的可分片部分的某一個分片。分片擴展頭如圖2所示。
其中當M=1的時候表示此分片包不是最后一個分片包,M=0則表示是最后一個分片包。偏移量是13位的無符號整數(shù),以8byte為單位,表示此分片數(shù)據(jù)相對于未分片的原始數(shù)據(jù)包中可分片部分的偏移量。
二、分片并行重組模型
本文所敘述的多線程分片并行重組方法可以設(shè)計為運行在用戶空間和內(nèi)核空間,這里在用戶空間實現(xiàn)此基于libpcap的分片并行重組設(shè)計。 利用符合POSIX標準的pthread庫來進行多線程編程。為了提高性能,使用基于libpcap和mmap的pfring模塊來捕捉數(shù)據(jù)包。通過使用多線程,可以充分使用多核CPU,進行分片并行重組,減少丟包率。
三、模型的實現(xiàn)
本系統(tǒng)使用LINUX 2.6內(nèi)核,采用C語言為編程工具,并參考了libnids的源碼實現(xiàn)。
(一)主要數(shù)據(jù)結(jié)構(gòu)。主要用到的數(shù)據(jù)有:struct hosts hostable,關(guān)于hosts的哈希表;hosts,相同hash值的所有主機鏈表頭結(jié)點;hostfrags,相同hash值的主機節(jié)點;ip6q,ip6frag鏈表的頭結(jié)點,鏈接同一原始數(shù)據(jù)包的所有分片包;ip6frag,分片包節(jié)點;pthread_mutex_t,互斥鎖,用于并發(fā)訪問、主要數(shù)據(jù)結(jié)構(gòu)之間的邏輯關(guān)聯(lián)如圖3所示。
(二)分片重組邏輯流程。1.通過pthread_create循環(huán)創(chuàng)建多個線程,設(shè)置相應(yīng)的回調(diào)函數(shù);2.在每個回調(diào)函數(shù)線程中,無限循環(huán)調(diào)用pfri
ng的pfring_rcv函數(shù)獲取數(shù)據(jù)包,若不是分片包,則交由上層的icmp6,tcp6或者udp6模塊處理,否則按分片并行重組流程處理;3.分片并行重組流程將收到的每個分片包按分片偏移量的順序插入到ip6q隊列里,當所有的分片包都捕獲到了,就將ip6q隊列里的所有分片包重組成原始IPv6數(shù)據(jù)包,交由上層的icmp6,tcp6或者udp6模塊處理,并釋放相應(yīng)的ip6q隊列。注意的是,在插入或刪除hostfrags節(jié)點,ip6q節(jié)點和ip6frag節(jié)點時要鎖住相應(yīng)的上層節(jié)點鎖。
(三)測試數(shù)據(jù)。測試用硬件:(1)服務(wù)器,配置是雙至強CPU,4G
內(nèi)存,千兆網(wǎng)卡,使用Linux 2.6.25內(nèi)核,網(wǎng)絡(luò)協(xié)議為IPv6;(2)Smartb
it 6000C測試儀。以Smartbit提供測試流量,發(fā)往服務(wù)器。以單線程分片重組和兩個線程(每CPU一個線程)并行重組為對比,在服務(wù)器中獲取的測試結(jié)果表明,在帶寬為100%利用時,小包產(chǎn)生較大的丟包率,但雙線程仍然比單線程捕包率高,在大包時,反而會產(chǎn)生丟包,原因是過多拷貝分片包時消耗了CPU時間;在帶寬為80%時,各項數(shù)據(jù)表現(xiàn)良好。
四、總結(jié)
本文提出的并行重組算法使用了pthr- ead_mutex_t鎖機制,由于mutex鎖會使得沒有得到資源的線程休眠,產(chǎn)生進程/線程調(diào)度,因此對于1Gbit的高速網(wǎng)絡(luò)中,由于數(shù)據(jù)包來的非常快,使得并發(fā)線程會不停地競爭mutex鎖資源,這樣大量的CPU用于進程/線程調(diào)度,浪費了CPU時間,不利于數(shù)據(jù)包的捕獲,重組等后續(xù)處理;spin_lock機制可以使得CPU忙等,線程不必放棄CPU,避免了調(diào)度浪費的時間,可以考慮采用spin_lock鎖機制。同時,如果要在多核上實現(xiàn)多線程處理,并從根本上避免訪問沖突,可以考慮恰當設(shè)計數(shù)據(jù)結(jié)構(gòu),使得每個CPU只訪問屬于自己的數(shù)據(jù),并給予并行處理線程實時調(diào)度策略,和線程專屬各自CPU,即線程被調(diào)度時不會切換CPU。
參考文獻:
[1]Pv6下協(xié)議分析技術(shù)在入侵檢測系統(tǒng)中的研究與應(yīng)用,暨南大學碩士論文,2006.6.
[2]張會汀、鄭力明,IP分片重組算法(RFC815)的實現(xiàn)及其改進,計算機工程與設(shè)計,2005.04(26).
作者簡介:
胡垂立,男,漢族,在讀碩士,廣東技術(shù)師范學院天河學院計算機系講師,研究方向為計算機網(wǎng)絡(luò)、視頻技術(shù)等。