譚 寧
[摘要]選擇把內(nèi)核級(jí)的NDIS中間層過濾和用戶級(jí)SPI接口包過濾結(jié)和形成混合式過濾系統(tǒng),在實(shí)現(xiàn)對(duì)TCP、UDP、ICMP等多種網(wǎng)絡(luò)協(xié)議進(jìn)行過濾的同時(shí),也實(shí)現(xiàn)報(bào)文內(nèi)容過濾,且兼顧功能和效率,并對(duì)用戶層進(jìn)行設(shè)計(jì)。
[關(guān)鍵詞]混合式 過濾系統(tǒng) 工作原理 用戶層
中圖分類號(hào):TP3文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1671-7597(2009)0510048-01
Windows下的個(gè)人防火墻都是基于對(duì)數(shù)據(jù)報(bào)的攔截技術(shù)之上??偟膩碚f可分為用戶級(jí)和內(nèi)核級(jí)數(shù)據(jù)報(bào)攔截兩類。其中內(nèi)核級(jí)主要是TDI過濾驅(qū)動(dòng)程序,NDIS中間層過濾驅(qū)動(dòng)程序,NDIS過濾鉤子驅(qū)動(dòng)程序等,它們都是利用網(wǎng)絡(luò)驅(qū)動(dòng)來實(shí)現(xiàn)的;而用戶級(jí)的過濾包括SPI接口,Windows2000包過濾接口等。本文選擇了把內(nèi)核級(jí)的NDIS中間層過濾和用戶級(jí)SPI接口包過濾結(jié)和形成混合式過濾系統(tǒng),在實(shí)現(xiàn)對(duì)TCP、UDP、ICMP等多種網(wǎng)絡(luò)協(xié)議進(jìn)行過濾的同時(shí),也實(shí)現(xiàn)報(bào)文內(nèi)容過濾,且兼顧了功能和效率。
一、混合式防火墻工作原理
根據(jù)網(wǎng)絡(luò)的分層,系統(tǒng)的設(shè)計(jì)可以按照不同的層次來進(jìn)行設(shè)計(jì)。由于在SPI層不能過濾所有的數(shù)據(jù)包,只能過濾通過Socket進(jìn)行網(wǎng)絡(luò)通信的數(shù)據(jù)包,比如ICMP這種沒有端口的包,它只到了網(wǎng)絡(luò)層,并沒有到傳輸層,就沒有辦法在SPI層過濾。而所有的數(shù)據(jù)通信都必須經(jīng)過NDIS層,所以NDIS層防火墻系統(tǒng)可以捕獲所有的數(shù)據(jù)包。SPI層過濾數(shù)據(jù)包有以下幾個(gè)優(yōu)點(diǎn):
1.跨平臺(tái),不用進(jìn)行代碼的修改;
2.效率高,由于工作在應(yīng)用層,所以CPU占用率低;
3.實(shí)現(xiàn)起來方便。
數(shù)據(jù)包的傳送可以通過兩種方式:一種是流經(jīng)SPI層的,比如TCP包,UDP包等;數(shù)據(jù)流出的順序是,經(jīng)過SPI,然后通過傳輸層,網(wǎng)絡(luò)層達(dá)到物理層;還有一種是直接通過NDIS進(jìn)行通信的,數(shù)據(jù)將只達(dá)到網(wǎng)絡(luò)層而不經(jīng)過傳輸層,比如ICMP包。
首先是當(dāng)應(yīng)用程序發(fā)起一個(gè)Socket連接請(qǐng)求時(shí),網(wǎng)絡(luò)數(shù)據(jù)包將流經(jīng)傳輸層,網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層的情況。
二、用戶層SPI設(shè)計(jì)
本層設(shè)計(jì)的目的主要是用來過濾通過Socket發(fā)送與接收的數(shù)據(jù)包,并提供與應(yīng)用程序的接口。
SPI層一共分為三個(gè)模塊,與應(yīng)用程序的接口,與NDIS的接口和fiiter模塊,其中filter模塊是SPI層的核心模塊,也是本系統(tǒng)的核心模塊,用來完成SPI層的主要功能,過濾Socket數(shù)據(jù)包。前后兩個(gè)接口是用來保證數(shù)據(jù)包流程的通暢。
(一)與應(yīng)用程序接口
當(dāng)應(yīng)用程序發(fā)送了一個(gè)流經(jīng)SPI層的數(shù)據(jù)包時(shí),與應(yīng)用程序的接口將獲取這個(gè)數(shù)據(jù)包并將其傳送給filter模塊。這個(gè)接口主要的功能是實(shí)現(xiàn)控管規(guī)則數(shù)據(jù)和封包數(shù)據(jù)的共享。
應(yīng)用程序與SPI過濾層主要通過三個(gè)模塊進(jìn)行交互??毓芤?guī)則處理模塊是用來對(duì)控管規(guī)則進(jìn)行添加或者刪除的模塊。在這里用戶通過對(duì)控管規(guī)則的操作可以很容易添加或者實(shí)現(xiàn)一個(gè)過濾。封包緩沖區(qū)處理模塊主要的功能是應(yīng)用程序從與應(yīng)用程序接口的地方得到封包緩沖區(qū)的消息。應(yīng)用程序可以從這里知道數(shù)據(jù)封包在內(nèi)存中的位置。工作模式是用戶用來通知SPI層是放行所有,拒絕所有或者是過濾。
(二)filter模塊
filter模塊是本系統(tǒng)的核心模塊,它是一個(gè)驅(qū)動(dòng)過濾模塊,只有在需要的時(shí)候才被加載。filter模塊是放在傳輸層的上面,不論數(shù)據(jù)流入還是流出都需要首先經(jīng)過filter模塊的過濾。filter模塊是在傳輸層完成了封包處理之后來進(jìn)行過濾的,其實(shí)不管filter模塊是放在傳輸層之上還是之下,都不會(huì)對(duì)系統(tǒng)的效率產(chǎn)生影響,放在傳輸層之上的話,那么filter模塊將在傳輸層解包之后,進(jìn)行過濾,這樣比filter模塊放在傳輸層之下要慢一些。但是對(duì)于流出的數(shù)據(jù)包,filter模塊將比放在傳輸層下面要快一些,而且filter模塊對(duì)應(yīng)用程序的接口也要求系統(tǒng)設(shè)計(jì)的時(shí)候把filter過濾模塊放在傳輸層之上。
根據(jù)filter模塊完成的功能,可以對(duì)其進(jìn)行模塊劃分和設(shè)計(jì)。為了提高數(shù)據(jù)包的處理速度,并降低系統(tǒng)資源的占用,只有當(dāng)發(fā)生Socket連接的時(shí)候才會(huì)把filter模塊放到數(shù)據(jù)流的鏈條當(dāng)中。當(dāng)filter模塊被加載的時(shí)候,入口模塊將會(huì)被調(diào)用,它不但完成filter模塊的入口,而且完成SPI的入口。這是因?yàn)楸緦訉⒉捎玫募夹g(shù)是SPIHOOK,所以需要把SPI一些重要功能進(jìn)行重寫。對(duì)SPI的入口的重寫就放到入口模塊當(dāng)中。對(duì)SPI功能模塊的操作是在SPI驗(yàn)證模塊中完成,而協(xié)議解析模塊將在這層對(duì)數(shù)據(jù)包進(jìn)行解析,判斷屬于哪一種數(shù)據(jù)包,以便對(duì)其采取不同的處理。
根據(jù)filter模塊的劃分,對(duì)其流程進(jìn)行分析將可以更好的對(duì)整個(gè)模塊進(jìn)行設(shè)計(jì),特別是接口部分的設(shè)計(jì)。只有當(dāng)通信發(fā)生Socket請(qǐng)求的時(shí)候,本模塊才被加載。通過入口模塊進(jìn)入filter模塊的處理流程,在filter的處理流程當(dāng)中,通過一些函數(shù)的調(diào)用得到系統(tǒng)SPI服務(wù)函數(shù)的地址,然后用自己定義的SPI函數(shù)庫對(duì)其中幾個(gè)比較重要的函數(shù)進(jìn)行替換,從而實(shí)現(xiàn)對(duì)Socket數(shù)據(jù)包的捕獲和過濾。如果Socket請(qǐng)求對(duì)服務(wù)質(zhì)量很高,也就是系統(tǒng)支持QOS,那么數(shù)據(jù)包將直接被放行,而不需要替換系統(tǒng)的SPI,也不用對(duì)數(shù)據(jù)包比對(duì)過濾,這是提高系統(tǒng)響應(yīng)速度和數(shù)據(jù)包處理速度的設(shè)計(jì)。
在filter模塊工作流程當(dāng)中,最重要的步驟就是對(duì)SPI進(jìn)行操作,對(duì)SPI操作的最終目的是為了得到SPI服務(wù)函數(shù)的地址,也就是被本系統(tǒng)替換的功能的地址。其核心是得到入口地址,即系統(tǒng)默認(rèn)SPI的入口模塊地址,通過它系統(tǒng)就可以獲得所需要的信息。這樣就完成了SPI層的整體設(shè)計(jì)。
三、網(wǎng)絡(luò)中間層驅(qū)動(dòng)IMD設(shè)計(jì)
在NDIS層,系統(tǒng)需要對(duì)上設(shè)計(jì)兩個(gè)接口,一個(gè)是與應(yīng)用程序的接口,一個(gè)與SPI層的接口。在NDIS層里最核心的模塊是packet模塊,在packet模塊里將進(jìn)行數(shù)據(jù)包NDIS層的過濾。由于本系統(tǒng)采用的是HOOK技術(shù),因此NDIS層的與底層接口在本系統(tǒng)中并不用設(shè)計(jì),而是直接調(diào)用系統(tǒng)的底層接口模塊。
接口模塊包括兩個(gè),一個(gè)是與SPI層的接口模塊,另一個(gè)是與應(yīng)用程序的接口模塊。根據(jù)packet實(shí)現(xiàn)的功能和整體模塊的設(shè)計(jì)。它的功能主要是用來過濾filter模塊不能過濾的數(shù)據(jù)包,比如ICMP之類的直接通過NDIS進(jìn)行通信的數(shù)據(jù)包。
在獲取數(shù)據(jù)包后需要對(duì)數(shù)據(jù)包進(jìn)行解析,用來判斷是不是需要在NDIS層進(jìn)行處理,如果需要那么就在本層進(jìn)行處理。最后需要和應(yīng)用程序打交道,需要隱藏底層的實(shí)現(xiàn)細(xì)節(jié),所以要?jiǎng)?chuàng)建一個(gè)上層可見的設(shè)備(與應(yīng)用程序通信使用的設(shè)備模塊)。
參考文獻(xiàn):
[1]朱鵬,基于狀態(tài)包過濾的防火墻技術(shù)[J].微計(jì)算機(jī)信息,2005.3.
[2]黃力,混合型防火墻的研究與設(shè)計(jì)[J].微計(jì)算機(jī)信息,2006.9.
[3]劉四清、龔建萍,計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)基礎(chǔ)教程[M].清華大學(xué)出版社,2008.
作者簡(jiǎn)介:
譚寧,男,漢,淄博職業(yè)學(xué)院信息工程系,副教授,研究方向:計(jì)算機(jī)網(wǎng)絡(luò)。