摘要:網(wǎng)絡(luò)隔離器在隔離了可信網(wǎng)絡(luò)和不可信網(wǎng)絡(luò)的同時,允許信息在兩個網(wǎng)絡(luò)間安全傳輸。主要介紹使用USB實現(xiàn)網(wǎng)絡(luò)隔離器內(nèi)部的數(shù)據(jù)交換。首先介紹了USB系統(tǒng)、USB通信模型和數(shù)據(jù)傳輸類型,然后介紹了Linux的USB子系統(tǒng)及主要數(shù)據(jù)結(jié)構(gòu),重點說明了使用libusb庫實現(xiàn)兩臺USB主機(jī)間的數(shù)據(jù)傳輸。
關(guān)鍵詞:網(wǎng)絡(luò)隔離;網(wǎng)閘;Linux;通用串行總線;libusb
中圖分類號:TP311.11文獻(xiàn)標(biāo)志碼:A
文章編號:1001-3695(2007)08-0306-03
0引言
Linux操作系統(tǒng)結(jié)構(gòu)清晰、功能強(qiáng)大,支持多用戶訪問和多任務(wù)編程,是一個穩(wěn)定可靠、功能完善的操作系統(tǒng)。Linux源代碼開放,具有可訂制性和可裁減性,被廣泛應(yīng)用于防火墻、安全網(wǎng)關(guān)、網(wǎng)絡(luò)隔離器等安全產(chǎn)品。在國家保密局發(fā)布的《計算機(jī)信息系統(tǒng)國際互聯(lián)網(wǎng)保密管理規(guī)定》中規(guī)定“涉及國家秘密的計算機(jī)信息系統(tǒng),不得直接或間接地與國際互聯(lián)網(wǎng)或其他公共信息網(wǎng)絡(luò)相連接,必須進(jìn)行物理隔離”。
物理隔離阻斷了內(nèi)部網(wǎng)絡(luò)與Internet間的直接連接,是防范網(wǎng)絡(luò)攻擊的有效手段,但是同時也阻斷了必要的信息交換。基于網(wǎng)絡(luò)隔離的數(shù)據(jù)交換系統(tǒng)就是在保證兩個網(wǎng)絡(luò)安全隔離的基礎(chǔ)上實現(xiàn)信息的自動交換。本文基于國家2005信息安全專項“隔離專網(wǎng)之防病毒反入侵綜合管理與更新網(wǎng)關(guān)的產(chǎn)品產(chǎn)業(yè)化”。網(wǎng)絡(luò)隔離器主要由三部分組成:內(nèi)網(wǎng)處理單元、外網(wǎng)處理單元和中間數(shù)據(jù)交換單元。在隔離器內(nèi)部三個單元之間的通信必須在鏈路層上中止網(wǎng)絡(luò)連接[1]。USB具有低成本、支持即插即用、協(xié)議靈活、傳輸速率高的優(yōu)點,本文將通過使用USB來實現(xiàn)網(wǎng)絡(luò)隔離器內(nèi)部的安全數(shù)據(jù)交換。
1USB系統(tǒng)簡介
一個USB系統(tǒng)由USB主機(jī)、USB設(shè)備以及兩者之間的互連三個部分組成。USB主機(jī)和多個USB設(shè)備之間構(gòu)成一個有層次性的星型結(jié)構(gòu)。當(dāng)一個USB設(shè)備連接到主機(jī)時,主機(jī)控制器會為這個設(shè)備分配一個惟一的地址(1~127),并且讀取該設(shè)備的描述符。
USB是一種被動的總線類型,所有USB主機(jī)與設(shè)備之間的通信都是由主機(jī)控制器發(fā)起的。USB的數(shù)據(jù)傳輸是在主機(jī)軟件與USB設(shè)備上指定端點之間進(jìn)行的。主機(jī)和端點之間的連接稱為管道(pipe)。一個端點只支持一個方向的數(shù)據(jù)傳輸,或支持?jǐn)?shù)據(jù)流入設(shè)備,或支持?jǐn)?shù)據(jù)流出設(shè)備。0號端點是所有USB設(shè)備的缺省端點。當(dāng)外設(shè)連接到USB,被供電并接收到總線復(fù)位信號后,USB系統(tǒng)軟件就可通過0號端點初始化并操作USB設(shè)備了。除0號缺省端點外,其他的端點只有設(shè)置后才能被使用。
圖1以分層結(jié)構(gòu)顯示了USB的通信模型。其中最底層是USB接口層(USB interface layer),它提供了USB主機(jī)與設(shè)備之間的物理連接;中間層是USB設(shè)備層(USB device layer),它負(fù)責(zé)處理所有USB的數(shù)據(jù)傳輸,在主機(jī)端,除了對控制傳輸進(jìn)行分析外,其余的直接送往上層;最上層是功能接口層,提供了不同類USB設(shè)備的驅(qū)動程序,在設(shè)備端對應(yīng)的實體是設(shè)備中不同的接口。
USB協(xié)議中定義了四種數(shù)據(jù)傳輸類型,即控制傳輸、批量傳輸、中斷傳輸、等時傳輸。控制傳輸把特定的設(shè)備請求傳送給USB設(shè)備,用來配置設(shè)備、控制設(shè)備狀態(tài)等。它是一種可靠的、非周期性的傳輸。批量傳輸用于傳輸批量的、沒有周期和傳輸速率要求的數(shù)據(jù)。中斷傳輸通過對設(shè)備的查詢以確定設(shè)備是否有數(shù)據(jù)需要傳輸,主機(jī)控制器以指定的時間間隔向設(shè)備周期性地發(fā)送中斷請求。等時傳輸用于要求以恒定速率實時傳輸?shù)臄?shù)據(jù)流,但對所傳送數(shù)據(jù)是否正確并無要求,常用于音頻和視頻數(shù)據(jù)的傳送[2,3]。
2Linux中的USB子系統(tǒng)
Linux系統(tǒng)中將設(shè)備分為字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備三種類型。每個USB設(shè)備由一個USB模塊驅(qū)動。該USB模塊和USB子系統(tǒng)一同工作;但是在底層,每個USB設(shè)備仍然表現(xiàn)為一個字符設(shè)備、塊設(shè)備或網(wǎng)絡(luò)設(shè)備(USB以太網(wǎng)接口)。
2.1USB內(nèi)核
Linux中的USB體系結(jié)構(gòu)分為三層,如圖2所示,類似于規(guī)范中建議的結(jié)構(gòu)。Linux內(nèi)核中提供了一個稱為USB core的模塊,該模塊連接了上層USB設(shè)備驅(qū)動程序和下層主控制器驅(qū)動程序。Linux的USB內(nèi)核主要由文件usb.h和usb.c組成。USB core模塊包含了所有USB設(shè)備驅(qū)動和USB主控制器驅(qū)動的通用程序,它通過定義一些數(shù)據(jù)結(jié)構(gòu)、宏和功能函數(shù)抽象了所有的硬件設(shè)備,給出專門的API來支持上層設(shè)備驅(qū)動程序和下層主控制器驅(qū)動程序。另外,USB內(nèi)核還具有維護(hù)設(shè)備的加載/卸載、負(fù)責(zé)設(shè)備的默認(rèn)配置、連接設(shè)備與對應(yīng)的驅(qū)動程序關(guān)聯(lián)等功能。
2.2主要數(shù)據(jù)結(jié)構(gòu)
Linux的USB內(nèi)核中定義了struct usb_bus、struct usb_device、struct urb、struct usb_driver等與設(shè)備驅(qū)動程序相關(guān)的核心數(shù)據(jù)結(jié)構(gòu)。
1)struct usb_bus描述了USB的總線結(jié)構(gòu)。從該數(shù)據(jù)結(jié)構(gòu)中可以獲得USB系統(tǒng)的基本信息,如總線上的設(shè)備地址信息、子系統(tǒng)的根集線器、子系統(tǒng)中當(dāng)前帶寬的使用情況、子系統(tǒng)中當(dāng)前中斷傳輸和等時傳輸?shù)臄?shù)量。
struct usb_bus {
struct usb_device *root_hub; //根集線器
struct list_head bus_list;
//雙向指針,維護(hù)系統(tǒng)中所有的USB總線系統(tǒng)
int bandwidth_allocated; //帶寬使用情況
int bandwidth_int_reqs; //中斷傳輸數(shù)量
……
};
2)struct usb_device描述了一個USB設(shè)備的基本信息,包括設(shè)備分配的地址、設(shè)備描述符信息、配置描述符和其包含的接口描述符、端點描述符的指針等。該數(shù)據(jù)結(jié)構(gòu)主要用于設(shè)備的初始化過程中。
struct usb_device {
int devnum; //為設(shè)備分配的地址
struct usb_bus *bus; //設(shè)備所屬USB系統(tǒng)
struct usb_device_descriptor descriptor; //設(shè)備描述符信息
struct usb_host_config *config; //配置描述符的指針
……
};
3)struct urb在Linux的USB子系統(tǒng)中,所有的數(shù)據(jù)傳輸都使用URB請求塊(USB request block)的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)。它包含了建立任何USB傳輸所需的所有信息,并貫穿于USB協(xié)議對數(shù)據(jù)處理的整個過程。其中:*dev指向某一個指定的USB設(shè)備;pipe指向與管道關(guān)聯(lián)的USB設(shè)備一端的設(shè)備端點;*transfer_buffer指向與管道關(guān)聯(lián)的USB主機(jī)一端的數(shù)據(jù)緩沖區(qū)[5]。
4)struct usb_driver主要用于在Linux內(nèi)核中注冊一個USB設(shè)備驅(qū)動程序。包括設(shè)備驅(qū)動程序的名字、指向驅(qū)動程序所屬模塊的指針、兩個注冊的入口點:設(shè)備初始化函數(shù)指針*probe()和設(shè)備卸載函數(shù)指針*disconnect()等信息。
3主機(jī)間USB通信的實現(xiàn)
USB總線采用的是主/從工作模式(master to slave)。USB主機(jī)根據(jù)各設(shè)備的屬性周期性地訪問各個設(shè)備。USB設(shè)備被動地響應(yīng)USB主機(jī)的訪問請求。對于兩個USB主機(jī)之間,由于是主/主的結(jié)構(gòu)(master to master),直接使用USB連接線相連是無法實現(xiàn)雙方通信的。
為了實現(xiàn)主機(jī)間的USB通信,需要實現(xiàn)主—從—主的結(jié)構(gòu)。本文通過使用嵌入Ali M5632控制芯片的數(shù)據(jù)傳輸線(hosttohost link),在兩個USB主機(jī)之間起到橋梁和中介的作用,實現(xiàn)主機(jī)間點到點的USB通信。M5632控制芯片提供了四種可配置端點,分別支持64 Byte FIFO控制傳輸、512 Byte乒乓緩沖器批量輸入/輸出傳輸、16 Byte乒乓緩沖器中斷傳輸。
在Linux主機(jī)上可以通過調(diào)用libusb庫實現(xiàn)用戶空間的應(yīng)用程序與USB設(shè)備之間的通信。Libusb封裝了與內(nèi)核的交互,通過向外界提供一組高層接口,方便用戶對USB設(shè)備的訪問[6]。以下將通過libusb提供的功能函數(shù)實現(xiàn)USB主機(jī)間的數(shù)據(jù)傳輸。
3.1設(shè)備初始化
在使用libusb之前需要首先進(jìn)行初始化,通過調(diào)用usb_init(),libusb建立一些內(nèi)部結(jié)構(gòu)。在對指定USB設(shè)備操作之前,必須先在USB上找到該設(shè)備。USB設(shè)備描述符中的idVendor和idProduct域分別指定了廠商標(biāo)志和產(chǎn)品標(biāo)志,通過這兩個域可以指定一個USB設(shè)備。Ali M5632控制芯片的idVendor和idProduct分別是0x0402、0x5632。在獲取指定的USB設(shè)備后,可以通過usb_device結(jié)構(gòu)體中的descriptor成員、*config成員獲得USB設(shè)備描述符、配置描述符、接口描述符和端點描述符的詳細(xì)信息。圖3給出了獲取指定USB設(shè)備時usb_bus、usb_device以及各種USB描述符等數(shù)據(jù)結(jié)構(gòu)之間的協(xié)作關(guān)系圖。
下面給出了查找、獲取Ali M5632 USB數(shù)據(jù)傳輸線設(shè)備的簡要代碼:
#define VENDOR_ID 0x0402
#define PRODUCT_ID 0x5632
struct usb_device *find_device(){
……
struct usb_bus *busses=usb_get_busses();
for(bus=busses; bus; bus=bus>next){
for(device=bus>devices; device; device=device>next){
if(device>descriptor.idVendor==VENDOR_ID device>descriptor.idProduct==PRODUCT_ID){
return device;
}
}
}
return NULL;
}
3.2打開設(shè)備
在通過libusb使用USB設(shè)備之前,首先必須打開該設(shè)備。USB設(shè)備由許多不同的邏輯單元構(gòu)成。通常一個USB設(shè)備有一個或多個配置,配置有一個或多個接口,接口又有零個或多個端點。在打開USB設(shè)備后,需要激活其中的一個配置并聲明配置中的一個接口。
Libusb庫中在對USB設(shè)備的某一接口進(jìn)行任何操作之前,必須首先調(diào)用庫函數(shù)usb_claim_interface(usb_dev_handle *dev, int interface)對這一接口進(jìn)行聲明。該API返回0表示對接口的聲明成功,返回值小于0表示聲明失敗。只有對一個接口成功地聲明后才可以激活該接口,并使用接口中的端點進(jìn)行各種傳輸。
3.3控制傳輸?shù)膶崿F(xiàn)
USB支持四種數(shù)據(jù)傳輸類型,包括控制傳輸、批量傳輸、中斷傳輸和等時傳輸。其中控制傳輸用來對USB設(shè)備進(jìn)行初始化和配置管理,所有的USB設(shè)備都要支持控制傳輸。在USB系統(tǒng)中,USB設(shè)備正常工作之前必須先進(jìn)行配置,完成對設(shè)備上的端點配置管道、分配帶寬等工作。
在進(jìn)行控制傳輸時,先要由主機(jī)向設(shè)備發(fā)一個總線建立(setup)信息,它描述了控制訪問的類型,設(shè)備對主機(jī)的請求發(fā)出響應(yīng)。USB主機(jī)負(fù)責(zé)設(shè)置setup包內(nèi)每個域的值,在libusb庫中提供了用于控制傳輸?shù)腁PI。庫函數(shù)usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout)中,參數(shù)dev表示指定USB設(shè)備的句柄,參數(shù)requesttype、request、value、index的值分別與協(xié)議規(guī)范中setup包中相應(yīng)域bmRequestType、bRequest、wValue、wIndex的值相對應(yīng),參數(shù)*bytes、size表示數(shù)據(jù)緩沖區(qū)的地址和發(fā)送數(shù)據(jù)的長度。
在USB協(xié)議中規(guī)定每個setup包有八個字節(jié)。其中bmRequestType域占據(jù)一個字節(jié),表明此請求的特性。其中:D7位表明傳輸?shù)姆较颍珼7=0表示從主機(jī)到設(shè)備,D7=1表示從設(shè)備到主機(jī);D6..5位表明請求的種類,D6..5=00表示標(biāo)準(zhǔn)請求,D6..5=01表示類請求,D6..5=10表示廠商自定義請求;D4..0表示請求的接收者,一個請求可以被引導(dǎo)到設(shè)備上,也可以被引導(dǎo)到接口或一個端點上。
USB協(xié)議中定義了11個標(biāo)準(zhǔn)請求,這些請求主要用于配置設(shè)備、獲取設(shè)備信息等操作,如獲取設(shè)備描述符信息、指定設(shè)備地址等。在對Ali M5632控制芯片操作時,需要使用設(shè)備廠商提供的自定義請求對USB設(shè)備進(jìn)行配置。
3.4批量傳輸?shù)膶崿F(xiàn)
當(dāng)打開USB設(shè)備,對設(shè)備的接口進(jìn)行了成功的聲明,并對設(shè)備進(jìn)行了基本配置后,就可以方便地使用批量傳輸方式進(jìn)行數(shù)據(jù)的傳輸。在libusb中提供了兩種批量傳輸?shù)腁PI,即批量傳輸讀usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout)和批量傳輸寫usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout)。在這兩個API中,ep表示用于批量傳輸?shù)亩它c。由于單一端點只能實現(xiàn)數(shù)據(jù)的讀出或?qū)懭耄瑢τ谂孔x和批量寫需要分別指定端點。
3.5實驗結(jié)論
在Linux中,libusb庫的默認(rèn)路徑是/usr/lib,在對源文件進(jìn)行編譯時,需要添加對libusb庫的引用。為了驗證傳輸?shù)挠行院头€(wěn)定性,在USB主機(jī)A上讀入一個普通字符數(shù)據(jù)文件,通過批量傳輸發(fā)送給另一臺USB主機(jī)B,主機(jī)B接收到數(shù)據(jù)后寫入本地磁盤,經(jīng)過對比源和目標(biāo)文件發(fā)現(xiàn)兩個文件內(nèi)容完全相同。實驗結(jié)論表明,所開發(fā)的程序可以成功地實現(xiàn)兩個USB主機(jī)之間的數(shù)據(jù)通信。
4結(jié)束語
在網(wǎng)絡(luò)隔離環(huán)境下,為有效阻斷網(wǎng)絡(luò)攻擊,隔離單元中的數(shù)據(jù)交換子系統(tǒng)必須在鏈路層切斷網(wǎng)絡(luò)連接。通過使用USB實現(xiàn)隔離單元內(nèi)部的數(shù)據(jù)交換,可以有效地阻斷網(wǎng)絡(luò)連接,提升安全性。在今后的工作中,筆者還將作進(jìn)一步改進(jìn),在保證隔離的前提下,進(jìn)一步提高隔離單元內(nèi)部數(shù)據(jù)交換的效率。
參考文獻(xiàn):
[1]岳紅梅,石冬雪,徐詠梅,等. 基于嵌入式Linux的網(wǎng)絡(luò)隔離系統(tǒng)研究與實現(xiàn)[J].計算機(jī)工程與應(yīng)用,2005,41(5):141143.
[2]Universal serial bus specification reversion 1.1[S].
[3]Universal serial bus specification reversion 2.0[S].
[4]MSCTCGFJ-04,信息技術(shù)網(wǎng)閘產(chǎn)品安全檢驗規(guī)范[S].
[5]梁正平,毋國慶,肖敬. Linux中USB設(shè)備驅(qū)動程序研究[J].計算機(jī)應(yīng)用研究,2004,21(6):70-72.
[6]Libusb project[EB/OL].http://libusb.sourceforge.net/.
[7]鄧智群,劉福,慕德俊,等.網(wǎng)絡(luò)隔離體系結(jié)構(gòu)研究[J].計算機(jī)應(yīng)用研究,2005,22(5):219-221.
[8]巍騖,張煥強(qiáng),方明貴.基于Linux的USB驅(qū)動程序?qū)崿F(xiàn)[J].計算機(jī)應(yīng)用,2002,22(8):1719.
[9]CORBET J,RUBINI A, KroahHartman G.Linux設(shè)備驅(qū)動程序[M].魏永明,耿岳,鐘書毅,譯.3版.北京:中國電力出版社,2005:324-358.
注:“本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文”