[摘要]通過分析IPv6協議,分片攻擊的基本特點和Linux多線程算法的實現,建立IPv6分片包并行重組模型,并給出該模型的一種實現方法,在Linux環境下進行了測試,最后對實驗結果進行了分析。
[關鍵詞]高速網絡 IPv6協議 分片并行重組
中圖分類號:TP3文獻標識碼:A文章編號:1671-7597(2009)0510040-01
隨著IPv6互聯網的逐漸發展、普及,不安全問題并沒有隨著IPv6逐步取代IPv4而消失,反而日益受到重視。為防范分片攻擊以及實現基于IPv6包的后續應用,并減少丟包率,本文提出了IPv6分片包并行重組模型,采取多線程并行重組方式以加快分片包的重組。
一、IPv6協議和分片攻擊

基于IPv4協議的上一代互聯網因其固有的不穩定性,不安全性,以及其IPv4地址耗盡的現實因素,越來越成為互聯網發展的不利因素,與IPv4協議相比,IPv6協議具有許多新的特點并彌補了IPv4的許多不足,比如巨大的地址空間;簡潔的IPv6協議報頭(基本報頭如圖1所示)以及全新的擴展報頭,其中特別增加了IPSEC安全協議;全新的ICMPv6協議,并將ARP協議和RARP協議功能集成進ICMPv6協議中;自動配置功能;對移動IPv6的支持等。
物理網絡通過將IPv6數據包封裝進物理幀來在物理層進行數據傳輸的,每一種物理網絡都規定了一幀所能攜帶的最大數據量。這一限制稱為最大傳輸單元(Maximum Transmission Unit,MTU)。因而一個數據包必須小于或等于一個網絡的MTU,否則無法進行封裝和傳輸。IPv6協議規定,如果要發送的IPv6數據包長度大于路由過程中所經過的所有子網的最小MTU值,那么源節點必須對此數據包進行分片,不同于IPv4協議,中間路由器不必再分片了,最后由目的節點進行分片重組。因此,對于數據包捕獲系統來說,將網卡設置成混雜(Promiscuous)模式后,也要模擬目的節點將捕獲的分片數據包進行重組成原始數據包。
IPv6數據包的分片只能在源節點進行,路由中間節點不再進行分片操作,簡化了中間節點對數據包的處理,提高的中間節點對數據包的轉發效率;IPv6的分片包重組只發生在目的節點。通過MTU發現機制,源節點可以確定路由中的最小MTU值,以此作為發送數據的最大限度。當源節點要進行分片時,它將在IPv6數據包的可分片部分插入分片擴展報頭。這些分片包擁有相同的分片標志,但是分片偏移量各不相同。因此對于每一個分片包,必須包含三個部分,依次是原始數據包的不可分片部分、分片擴展頭(fragment header),原始數據包的可分片部分的某一個分片。分片擴展頭如圖2所示。

其中當M=1的時候表示此分片包不是最后一個分片包,M=0則表示是最后一個分片包。偏移量是13位的無符號整數,以8byte為單位,表示此分片數據相對于未分片的原始數據包中可分片部分的偏移量。
二、分片并行重組模型
本文所敘述的多線程分片并行重組方法可以設計為運行在用戶空間和內核空間,這里在用戶空間實現此基于libpcap的分片并行重組設計。 利用符合POSIX標準的pthread庫來進行多線程編程。為了提高性能,使用基于libpcap和mmap的pfring模塊來捕捉數據包。通過使用多線程,可以充分使用多核CPU,進行分片并行重組,減少丟包率。
三、模型的實現
本系統使用LINUX 2.6內核,采用C語言為編程工具,并參考了libnids的源碼實現。
(一)主要數據結構。主要用到的數據有:struct hosts hostable,關于hosts的哈希表;hosts,相同hash值的所有主機鏈表頭結點;hostfrags,相同hash值的主機節點;ip6q,ip6frag鏈表的頭結點,鏈接同一原始數據包的所有分片包;ip6frag,分片包節點;pthread_mutex_t,互斥鎖,用于并發訪問、主要數據結構之間的邏輯關聯如圖3所示。

(二)分片重組邏輯流程。1.通過pthread_create循環創建多個線程,設置相應的回調函數;2.在每個回調函數線程中,無限循環調用pfri
ng的pfring_rcv函數獲取數據包,若不是分片包,則交由上層的icmp6,tcp6或者udp6模塊處理,否則按分片并行重組流程處理;3.分片并行重組流程將收到的每個分片包按分片偏移量的順序插入到ip6q隊列里,當所有的分片包都捕獲到了,就將ip6q隊列里的所有分片包重組成原始IPv6數據包,交由上層的icmp6,tcp6或者udp6模塊處理,并釋放相應的ip6q隊列。注意的是,在插入或刪除hostfrags節點,ip6q節點和ip6frag節點時要鎖住相應的上層節點鎖。
(三)測試數據。測試用硬件:(1)服務器,配置是雙至強CPU,4G
內存,千兆網卡,使用Linux 2.6.25內核,網絡協議為IPv6;(2)Smartb
it 6000C測試儀。以Smartbit提供測試流量,發往服務器。以單線程分片重組和兩個線程(每CPU一個線程)并行重組為對比,在服務器中獲取的測試結果表明,在帶寬為100%利用時,小包產生較大的丟包率,但雙線程仍然比單線程捕包率高,在大包時,反而會產生丟包,原因是過多拷貝分片包時消耗了CPU時間;在帶寬為80%時,各項數據表現良好。
四、總結
本文提出的并行重組算法使用了pthr- ead_mutex_t鎖機制,由于mutex鎖會使得沒有得到資源的線程休眠,產生進程/線程調度,因此對于1Gbit的高速網絡中,由于數據包來的非常快,使得并發線程會不停地競爭mutex鎖資源,這樣大量的CPU用于進程/線程調度,浪費了CPU時間,不利于數據包的捕獲,重組等后續處理;spin_lock機制可以使得CPU忙等,線程不必放棄CPU,避免了調度浪費的時間,可以考慮采用spin_lock鎖機制。同時,如果要在多核上實現多線程處理,并從根本上避免訪問沖突,可以考慮恰當設計數據結構,使得每個CPU只訪問屬于自己的數據,并給予并行處理線程實時調度策略,和線程專屬各自CPU,即線程被調度時不會切換CPU。
參考文獻:
[1]Pv6下協議分析技術在入侵檢測系統中的研究與應用,暨南大學碩士論文,2006.6.
[2]張會汀、鄭力明,IP分片重組算法(RFC815)的實現及其改進,計算機工程與設計,2005.04(26).
作者簡介:
胡垂立,男,漢族,在讀碩士,廣東技術師范學院天河學院計算機系講師,研究方向為計算機網絡、視頻技術等。