馬 晉
(重慶市氣象局,重慶401147)
網絡數據包的特殊傳輸形式使得協議分析技術在網絡安全應用中具有特殊優勢,例如,協議分析是網絡入侵檢測研究的主要技術[1],也是通信流量識別[2]的重要技術,其本質是根據協議規范分析網絡數據包,確認數據包的協議類型。協議分析的前提是采集網絡數據包,數據包的捕獲能力是決定協議分析性能高低的首要因素。隨著網絡規模的不斷擴大,網絡帶寬日益增長[3],從高速和海量的網絡流量中實時采集數據包的難度很大。
采用傳統Libpcap庫等普通模式下的數據包采集機制已經難以適應高速網絡的發展,為了提高采集效率,高速網絡環境下通常采用零拷貝技術[4],但它只是減小了由于數據拷貝帶來的系統開銷,存在著必須對網卡底層驅動程序進行改造的問題,也就是說數據包的采集一定要與特定的硬件系統相關,系統的可移植性將會受到很大程度的影響。
由于數據包采集的硬件處理器處理能力的增長遠遠低于網絡流量增長的速度,在這種情況下,負載均衡技術被應用到采集系統來解決高速網絡下的數據采集問題。但是當前的負載均衡策略主要有針對特定應用的策略和針對特定目標的策略。針對特定應用的負載均衡策略是指專門針對一種特定應用協議(HTTP、FTP或者SMTP等)進行分流,基于該策略,根據識別網絡數據流中數據包的應用協議類型將數據包分發到相應的引擎中,但是當多種協議的數據流量不均勻時,就很難達到負載均衡的效果;基于主機源地址[5]的調度策略是針對特定主機的網絡數據流進行分流,根據識別網絡數據流中的主機IP地址將數據包分發到相應的引擎,但是同樣的,當多個目標主機的數據流量不夠均勻時,難以實現負載均衡。在對網絡數據包的協議分析過程中,不僅僅是單獨分析某個數據包的內容,更重要的是要考慮數據包的上下文關系,需要保證分流的正確性,即要避免將屬于同一個會話的數據包被分流到多個引擎。如果不能保證被分流到同一個引擎會話的完整性,就可能造成入侵檢測的漏報現象,例如Web請求“GET/cgi-bin/phf”是Unix系統下的一個Web入侵特征串,但如果攻擊者將該請求分成多個網絡數據包發送,比如一個數據包含有“GET/cgi-”,另一個數據包包含“bin/phf”,如果不能把這些網絡數據包轉發到某個固定的分析引擎,就無法正確檢測到攻擊行為的發生。
為了解決上述高速網絡環境中協議分析存在的問題,本文給出了一種改進的基于會話的動態負載均衡技術,即SDLB(Session Dynamic Load Balance)技術。
本文所提出的基于SDLB技術的高速網絡環境中協議分析的解決方案應用了負載均衡、模式匹配、數據包分流、協議分析等技術,其參考模型如圖1所示。

圖1 基于SDLB技術的協議分析參考模型
基于SDLB技術的協議分析參考模型包括數據采集模塊、Session分流模塊、負載均衡模塊和協議分析模塊。首先需要將采集到的高速網絡數據包分解成以Session會話為單位的數據流,通過Session分流模塊的控制將同一Session的數據流分配到相同的協議分析引擎,再經負載均衡模塊維持各協議分析引擎的負載均衡性,最后由協議分析模塊實現協議解析。下面給出SDLB技術在協議分析中實現數據包的Session分流和維持數據包分流的負載均衡性的工作原理。
一個會話對應于TCP數據流的一個連接,本文使用一個〈源地址,目標地址,源端口,目標端口,協議類型〉五元組即〈Sip,Dip,Sport,Dport,Ptype〉來定義;對于UDP、ICMP等無連接協議的數據包以及不完整的TCP連接數據包,本文設定相近時間內具有相同五元組的所有數據包為一個會話單位。下面介紹SDLB技術保證同一會話分流到相同協議分析引擎的工作過程。
對網絡數據包按照上述對會話的定義提取五元組信息進行計算,以8位長度為單位進行運算,即將32位的IP地址分割成4個8位數據,16位的端口號分割成2個8位數據,協議類型為8位則保持不變,將分割后的8位數據做二進制加法運算,這樣同屬一個會話的五元組所得到的和肯定是相同的,所以能夠保證同一會話的數據包的完整性,但是不屬于這個會話的數據包的五元組也有可能做加法運算后的和與該會話的和相同,例如,〈192.168.3.100,192.168.3.10,4000,80,6〉的五元組和〈192.168.3.90,192.168.3.10,80,4010,6〉的和值是相同的,但是他們不屬于同一個會話。為了進一步細分不同的會話,引入異或運算,即將作和運算后值相等的五元組再進行按照8位二進制的異或運算,如果異或后的值相等則判定為屬于同一會話。如果加法運算后的和相等,再將五元組做8位異或運算后的值也相等,則取加法運算的和值記為S,再進行取模運算,數據欲分配的引擎號按照E=S mod n計算,其中n為協議分析引擎的數量,E則為某個會話將被分配的引擎號。可以證明,屬于同一個會話的五元組計算出的S是相同的,即如果S1=S2,則有E1=S1mod n=S2mod n=E2,即E1=E2,所以SDLB技術保證了屬于同一會話的數據流被分配到同一個協議分析引擎中。
SDLB技術可以通過動態地獲取當前引擎的負載情況,將新的會話數據包分發給當前負載最小的引擎。用一個負載函數表示第i臺協議分析引擎在時刻t的負載狀態值

式中:a1,a2,a3,a4分別代表在t時刻第i臺引擎正在處理的會話數Si(t)、尚未處理的數據包剩余量Pi(t)、CPU占用率Ui(t)、內存占用率Mi(t)對引擎負載的影響因子,它們滿足式子,各影響因子應根據具體的流量環境確定。Li(t)的值越大,表明引擎的負載越重。
考慮到動態反饋需要額外的系統開銷,所以還引入負載修正值的定義。引擎的負載修正值是指在t1時刻會話S的分配或完成導致的相應引擎增加或減少的負載量,其定義式為

式中:Li(t1)是指在t1時刻動態反饋得到的引擎負載,Si(t1)是指在t1時刻引擎正在處理的會話個數。
SDLB技術中定義兩張表,即引擎負載表和數據包分發表,這兩張表具有動態學習的功能。其中引擎負載表包含引擎號、正在處理的會話數、數據包剩余量、CPU占用率、內存占用率和負載量;數據包分發表包含〈Sip,Dip,Sport,Dport,Ptype〉五元組、引擎號和更新時間。通過引擎負載表和數據包分發表的動態學習,實現引擎負載表的定時更新、數據包分發表的定時更新以及數據包會話分流的功能。下面將介紹這3個功能的實現原理。
1)引擎負載表的更新
負載表的更新工作過程如下:
(1)將引擎負載表中的各項初始值置為0;
(2)設定時間間隔Tp;
(3)搜集各個引擎的負載信息,包括會話數、數據包剩余量、CPU占用率和內存占用率等;
(4)按照式(1)計算各個引擎的負載量;
(5)用上述最新的各個參數更新負載表中的表項;
(6)等待Tp時間到,跳轉到(3)。
2)數據包分發表的更新
數據分發表的更新工作過程如下:
(1)將數據分發表中的各項初始值置為0。
(2)設定時間間隔Tp,設定時間閾值Ts。
(3)將數據分發表的指針指向表中的第一條記錄。
(4)讀取該記錄的更新時間ti。
(5)將當前時間t與更新時間ti的差值Δt和Ts作比較,如果Δt>Ts,執行(6),否則執行(7)。
(6)讀取該記錄中的引擎號E,刪除該記錄(定時清除超時的會話記錄),然后按照式(2)計算引擎E的負載修正值ΔLi;更新負載表引擎E的表項記錄,會話數Si=Si-1,負載值Li=Li-ΔLi。
(7)將數據分發表的指針下移,判斷是否表的結束,是結束位置執行(8),否則執行(4)。
(8)等待Tp時間到,跳轉到(3)。
3)網絡數據包的均衡分流
數據包分流過程基于數據分發表和引擎負載表工作。數據包分流的具體工作過程如下:
(1)新接收一個數據包,提取〈Sip,Dip,Sport,Dport,Ptype〉五元組信息。
(2)判斷是否為TCP數據包,是TCP包,則提取TCP標志FIN和RST。
(3)在數據分發表中查找五元組〈Sip,Dip,Sport,Dport,Ptype〉所在的記錄,查找成功執行(4),否則,執行(8)。
(4)讀取該記錄中的引擎號E。
(5)如果是TCP會話的最后一個數據包,即FIN=1或者RST=1,執行(6),否則執行(7)。
(6)刪除該記錄,然后按照式(2)計算引擎E的負載修正值ΔLi;更新負載表引擎E的表項記錄,會話數Si=Si-1,負載值Li=Li-ΔLi,然后執行(1)。
(7)查詢引擎負載表,如果由上面模運算得到的引擎號代表的引擎負載最小則直接發往該引擎;否則,找到負載最小的引擎E,即Li=min(Li),將數據包分發給對應的引擎E,并更新時間記錄,然后執行(1)。
(8)查詢引擎負載表,如果由上面模運算得到的引擎號代表的引擎負載最小則直接發往該引擎;否則,找到負載最小的引擎E,即Li=min(Li),將數據包分發給引擎E;在數據包分發表中增加對應五元組〈Sip,Dip,Sport,Dport,Ptype〉的記錄:更新時間t,〈Sip,Dip,Sport,Dport,Ptype〉和引擎號E;按照式(2)計算引擎E的負載修正值ΔLi;更新負載表中引擎E的記錄:會話數(Si=Si+1),負載值(Li=Li+ΔLi),然后執行(1)。
為了測試SDLB技術的性能,在本單位數據中心機房將核心交換機所有流量分別鏡像到兩個千兆端口,分別以使用SDLB技術和未使用SDLB技術的組網方式進行數據采集和協議分析,為方便比較和分析,兩種方式在同一時間進行測試。采用SDLB技術的組網環境以可編程的Intel網絡處理器硬件平臺作為數據包分流器,選用4臺相同的帶有2 Gbyte內存、250 Gbyte硬盤、主頻2.0 GHz雙核處理器的處理機作為協議分析引擎;未采用SDLB技術的組網方式是使用4臺相同的處理機作為協議分析處理器,按照應用類型進行數據分流。實驗共進行5次數據測試,每次測試時間為2 h,每5 min取一次采樣值,取采樣結果的加權平均值為測試結果。如圖2所示,可以看出,采用SDLB技術的方式,數據包的丟包率大大降低,并且每臺引擎內存和CPU占用率都比不采用SDLB技術的方式負載情況更加均衡,所以驗證了SDLB技術的正確性和可行性。

圖2 兩種方式測試結果對比圖
在此基礎上,將SDLB技術應用到網絡信息系統的運維管理工作中,把一臺配置較高的服務器虛擬化出多臺處理機作為協議分析處理器,通過SDLB技術進行數據分流,經過協議分析處理器對高速的數據流量進行協議分析,從而實現對高速網絡數據進行實時統計監控和網絡威脅報警,這對實際工作中信息網絡的運維管理具有重要的意義。
本文根據高速網絡環境中的協議分析存在的問題,給出了一種改進的基于SDLB技術的協議分析模型,實驗證明,SDLB技術可以提高協議分析引擎負載的均衡性和協議分析的完整性,適合應用在高速網絡環境中的協議分析系統,對實現企業局域網高速網絡數據的協議識別、流量監控和威脅發現具有重要意義。
[1]REED K D.Protocol analysis[M].Westland:WestNet Inc,2001.
[2]王超,張白愚.DVB-S中即時通信語音流量識別技術研究[J].電視技術,2010,34(9):13-16.
[3]肖寅東,王厚軍,田書林.高速網絡入侵檢測系統中包頭解析方法[J].儀器儀表學報,2012,33(6):1415-1419.
[4]李旭芳.網絡信息審計系統中數據采集的研究與實現[J].計算機工程與設計,2007,28(3):550-552.
[5]周瑩蓮,劉甫.服務器負載均衡技術研究[J].計算機與數字工程,2010,38(4 ):11-14.