張奎,袁海軍
(中國(guó)電子科技集團(tuán)公司第四十一研究所,山東青島,266555)
IEEE802.lX協(xié)議起源于802.11協(xié)議,802.11協(xié)議是無(wú)線網(wǎng)接入?yún)f(xié)議,是一個(gè)國(guó)際標(biāo)準(zhǔn)協(xié)議[1]。本文將闡述利用以太網(wǎng)板卡的現(xiàn)有功能,由測(cè)試設(shè)備模擬若干客戶端,測(cè)試被測(cè)設(shè)備是否能夠良好支持802.1X協(xié)議,通過統(tǒng)計(jì)分析會(huì)話的流量,測(cè)試被測(cè)試設(shè)備對(duì)網(wǎng)絡(luò)資源的控制能力。
IEEE802.1X全稱為“基于端口的網(wǎng)絡(luò)接入控制協(xié)議”,在充分利用IEEE802局域網(wǎng)優(yōu)勢(shì)的基礎(chǔ)上,提供了一種對(duì)連接到局域網(wǎng)的用戶進(jìn)行認(rèn)證和授權(quán)的手段[1]。它在網(wǎng)絡(luò)設(shè)備的物理接入級(jí)對(duì)接入設(shè)備進(jìn)行認(rèn)證和控制,提供了一種既可用于有線網(wǎng)絡(luò),也可以用于無(wú)線網(wǎng)絡(luò)的用戶認(rèn)證和密鑰管理的框架,可以確保用戶只有在接入認(rèn)證通過以后才能連接到網(wǎng)絡(luò)。802.IX定義了IEEE802網(wǎng)絡(luò)設(shè)備是如何使用EAP(可擴(kuò)展認(rèn)證協(xié)議)來(lái)進(jìn)行網(wǎng)絡(luò)準(zhǔn)入認(rèn)證的。在802.IX中,采用EAP作為網(wǎng)絡(luò)接入身份認(rèn)證信息的交互機(jī)制,EAP消息一般會(huì)被封裝在EAPOL數(shù)據(jù)包中[1]。從中可以看到,EAP只是一種封裝格式,而不是一個(gè)具體的認(rèn)證協(xié)議,這種機(jī)制確保了客戶端設(shè)備和認(rèn)證端設(shè)備均可使用比較靈活的網(wǎng)絡(luò)接入模式來(lái)進(jìn)行接入認(rèn)證[2]。EAPOL作為一種報(bào)文封裝格式,主要用于在客戶端和網(wǎng)絡(luò)接入點(diǎn)之間傳送EAP協(xié)議數(shù)據(jù),部分交互的數(shù)據(jù)還將使用MD5等方式進(jìn)行加密處理[3]。EAP數(shù)據(jù)被作為二層以太網(wǎng)幀的負(fù)載進(jìn)行傳輸,這樣就可以方便的在以太網(wǎng)上傳輸EAP數(shù)據(jù)包。
802.lX是一種根據(jù)客戶端設(shè)備的不同安全狀況而制定的網(wǎng)絡(luò)接入認(rèn)證的不同方法策略的集合。802.11X認(rèn)證體系結(jié)構(gòu)如圖1所示,它包括3個(gè)部分:認(rèn)證申請(qǐng)者、認(rèn)證者、認(rèn)證服務(wù)器。認(rèn)證申請(qǐng)者通常是位于局域網(wǎng)段一端的一個(gè)客戶端設(shè)備, 該客戶端設(shè)備需要支持EAPOL協(xié)議。認(rèn)證者是位于局域網(wǎng)另一端的一個(gè)設(shè)備,它對(duì)所連接的客戶端進(jìn)行認(rèn)證。認(rèn)證服務(wù)器是為認(rèn)證者提供認(rèn)證服務(wù)的實(shí)體,用于實(shí)現(xiàn)對(duì)客戶端進(jìn)行認(rèn)證、授權(quán)和計(jì)費(fèi)[4]。
圖1 802.1X系統(tǒng)結(jié)構(gòu)
測(cè)試系統(tǒng)采用上位機(jī)和下位機(jī)(板卡)協(xié)調(diào)工作的方式進(jìn)行測(cè)試,系統(tǒng)總體設(shè)計(jì)原理如圖2所示。其中,下位機(jī)硬件平臺(tái)采用FPGA+CPU的開發(fā)結(jié)構(gòu)。物理接口分為RJ45和SFP兩種接口,向測(cè)試設(shè)備提供電纜和光纖的連接方式;以太網(wǎng)接口模塊采用以太網(wǎng)物理層收發(fā)器,提供數(shù)據(jù)的發(fā)送和接收功能;FPGA創(chuàng)建數(shù)據(jù)發(fā)送和接收的通道,按照指定的發(fā)送模式傳輸數(shù)據(jù),并根據(jù)捕獲規(guī)則過濾數(shù)據(jù);數(shù)據(jù)緩存模塊存儲(chǔ)捕獲的數(shù)據(jù)和數(shù)據(jù)包的索引信息;CPU模塊執(zhí)行上位機(jī)下達(dá)的處理命令,調(diào)度管理FPGA,從而實(shí)現(xiàn)對(duì)外圍設(shè)備的控制,保證各部分的同步工作,同時(shí)也負(fù)責(zé)向上位機(jī)傳輸數(shù)據(jù)。上位機(jī)處理塊控制整個(gè)系統(tǒng)的運(yùn)行,它通過CPCI總線與板塊通信,提供人機(jī)交互的接口,根據(jù)人機(jī)交互的結(jié)果產(chǎn)生控制指令,并向處理器發(fā)送控制指令,控制測(cè)試的流程,處理測(cè)試產(chǎn)生的數(shù)據(jù),最終生成測(cè)試結(jié)果。
圖2 系統(tǒng)總體設(shè)計(jì)原理圖
在軟件設(shè)計(jì)方面,為了有效提高軟件開發(fā)的效率,提高代碼的可控制性、可維護(hù)性,降低不同功能之間的耦合性,按照功能對(duì)上位機(jī)軟件進(jìn)行了劃分,如圖3所示。主機(jī)軟件從上到下可以分為測(cè)試控制層,測(cè)試功能層,驅(qū)動(dòng)層。其中,測(cè)試控制層是主機(jī)軟件的控制中心,主要負(fù)責(zé)人機(jī)交互,各種資源的創(chuàng)建,線程的響應(yīng),數(shù)據(jù)的處理,文件的保存等。測(cè)試功能層負(fù)責(zé)執(zhí)行用戶的各種操作,啟動(dòng)和停止各種測(cè)試。驅(qū)動(dòng)層負(fù)責(zé)上位機(jī)與板級(jí)的通信,下達(dá)上位機(jī)的各種操作指令,上傳數(shù)據(jù)。
圖3 上位機(jī)軟件功能框圖
軟件的外部接口描述如圖4所示。用戶通過人機(jī)交互界面執(zhí)行各種測(cè)試操作,查看操作結(jié)果,保存測(cè)試用的參數(shù)以及測(cè)試的結(jié)果。系統(tǒng)接收用戶的指令,通過設(shè)備驅(qū)動(dòng)程序?qū)⑸蠈觽鬟f下來(lái)的信息傳遞給不同的測(cè)試模塊,這些數(shù)據(jù)將會(huì)被保存在指定的存儲(chǔ)位置,等待硬件讀取。底層接口負(fù)責(zé)從指定位置讀取數(shù)據(jù)或者向指定位置寫入數(shù)據(jù),實(shí)現(xiàn)向硬件傳達(dá)特定的操作指令,從而實(shí)現(xiàn)用戶指定的操作,最后,人機(jī)交互程序通過驅(qū)動(dòng)程序?qū)⒋砹瞬僮鹘Y(jié)果的特定的數(shù)據(jù)取走,對(duì)數(shù)據(jù)進(jìn)行分析,并給出測(cè)試的結(jié)果。
圖4 軟件內(nèi)部接口
軟件內(nèi)部接口描述如圖5所示。上層應(yīng)用程序與各測(cè)試模塊的軟件接口是通過一組接口函數(shù)來(lái)實(shí)現(xiàn)。接口函數(shù)的定義,是根據(jù)軟件的功能劃分來(lái)界定的。人機(jī)交互接口通過數(shù)據(jù)發(fā)送模塊產(chǎn)生測(cè)試數(shù)據(jù)流,并定制發(fā)送的模式。接收捕獲模塊定制捕獲數(shù)據(jù)的規(guī)則,過濾、存儲(chǔ)指定的數(shù)據(jù)流。數(shù)據(jù)統(tǒng)計(jì)模塊對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析,記錄數(shù)據(jù)流的特征。同時(shí),在定義接口函數(shù)時(shí),為每個(gè)測(cè)試模塊定義了一組函數(shù)以實(shí)現(xiàn)對(duì)該測(cè)試模塊的控制。該接口函數(shù)是該模塊單獨(dú)使用的,因此,最后每組接口函數(shù)都將被打包成一個(gè)單獨(dú)的文件,以動(dòng)態(tài)鏈接庫(kù)的形式對(duì)外提供。主機(jī)程序只需要一個(gè)聲明了該動(dòng)態(tài)鏈接庫(kù)中的函數(shù)的頭文件和一個(gè)DLL文件,即可實(shí)現(xiàn)對(duì)相應(yīng)模塊的控制功能。驅(qū)動(dòng)程序是上位機(jī)與板級(jí)程序通訊的橋梁,負(fù)責(zé)對(duì)硬件的讀寫訪問,該程序?qū)⒆鳛橄到y(tǒng)的驅(qū)動(dòng)的一部分存在,為所有上層的控制程序服務(wù)。
圖5 軟件內(nèi)部接口示意圖
在該測(cè)試系統(tǒng)中,上位機(jī)操作系統(tǒng)采用了XP系統(tǒng),軟件采用VC++6.0開發(fā)工具進(jìn)行設(shè)計(jì),模擬客戶端的程序流程如圖6所示。在實(shí)現(xiàn)過程中,涉及的主要的數(shù)據(jù)結(jié)構(gòu)和函數(shù)接口如下所示:
(1)保存數(shù)據(jù)包的參數(shù)信息的數(shù)據(jù)結(jié)構(gòu)。
typedef struct
{ unsigned char u8Code; // EAP數(shù)據(jù)代碼.
unsigned char u8Identifier; // 匹配請(qǐng)求和應(yīng)答操作.
unsigned short u16Length; // 長(zhǎng)度,包括code、identifier,、length、data field.
unsigned char u8Type; // 標(biāo)識(shí)請(qǐng)求和應(yīng)答的類型.
unsigned char pu8TypeData[1024];
// 請(qǐng)求和應(yīng)答的數(shù)據(jù).
unsigned short u16TypeDataLen;
// 請(qǐng)求和應(yīng)答的數(shù)據(jù)的長(zhǎng)度.
signed char ps8FailReason[1024];
// 描述失敗的原因.
unsigned short u16FailReasonLen;
圖6 模擬客戶端程序流程圖
//描述失敗的原因的數(shù)據(jù)的長(zhǎng)度.
}EAPOL_EAP_PACKET;
typedef struct
{ unsigned char u8ProtocolVersion;
unsigned char u8PacketType;
unsigned short u16PacketBodyLength;
EAPOL_EAP_PACKET eapPacket;
}EAPOL_PDU_FORMAT;
(2)產(chǎn)生各種交互報(bào)文的函數(shù)接口
·創(chuàng)建一個(gè)EAPOL_Start幀.
signed int CreateFrm_EAPOL_Start();
·創(chuàng)建一個(gè)EAPOL_Logoあ幀.
圖7 交互數(shù)據(jù)包截圖
signed int CreateFrm_EAPOL_Logoあ();
·生成EAPOL_EAP_RESPONSE數(shù)據(jù)包.
signed int CreateFrm_EAPOL_EapResponse( EAPOL_PDU_FORMAT& eapolPdu );
·檢查這是否是一個(gè)合法的EAPOL包,返回包的類型.
signed int ChkFrm_IsValid-EapolPacket( unsigned char*pu8FrmData, unsigned short u16FrmLen, EAPOL_PDU_FORMAT& eapolPdu );
在測(cè)試中,使用了一臺(tái)國(guó)產(chǎn)路由器作為測(cè)試的認(rèn)證者,使用其內(nèi)置的服務(wù)作為認(rèn)證服務(wù)器。上位機(jī)軟件捕獲測(cè)試系統(tǒng)與路由器之間的交互數(shù)據(jù),捕獲的數(shù)據(jù)包被保存為PCAP格式,使用wireshark軟件查看捕獲的數(shù)據(jù),如圖7所示。從圖中可以看到,該測(cè)試方案可以滿足802.1X接入認(rèn)證測(cè)試的要求。
本設(shè)計(jì)針對(duì)802.1X接入認(rèn)證的測(cè)試需求,利用了以太網(wǎng)板卡現(xiàn)有的部分功能,設(shè)計(jì)了模擬802.1X客戶端的測(cè)試方案。本設(shè)計(jì)在對(duì)硬件進(jìn)行細(xì)微改動(dòng)的基礎(chǔ)上,能夠很好的滿足802.1X接入認(rèn)證測(cè)試的需求,同時(shí)也是對(duì)以太網(wǎng)板卡功能的很好的擴(kuò)充。