趙 凱,吳奮強(qiáng),劉志強(qiáng)
(華風(fēng)氣象傳媒集團(tuán)有限責(zé)任公司,北京 100081)
隨著網(wǎng)絡(luò)安全管理要求的不斷加強(qiáng),企業(yè)的業(yè)務(wù)網(wǎng)絡(luò)通常被劃分為內(nèi)網(wǎng)區(qū)(LAN Area)、非軍事區(qū)(DMZ)與互聯(lián)網(wǎng)區(qū)(Internet Area)[1]。這種通過(guò)在網(wǎng)絡(luò)防火墻上添加網(wǎng)絡(luò)報(bào)文進(jìn)出方向限制策略來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)分區(qū)管理的方式形成了一種單向網(wǎng)絡(luò)通信場(chǎng)景[2]:只能從內(nèi)網(wǎng)區(qū)主動(dòng)向DMZ區(qū)發(fā)起網(wǎng)絡(luò)請(qǐng)求,反之則被拒絕。在這種場(chǎng)景下,內(nèi)網(wǎng)區(qū)存儲(chǔ)的數(shù)據(jù)文件需要被“二次傳輸”到DMZ區(qū)后才可以向用戶提供數(shù)據(jù)服務(wù),這便帶來(lái)了2個(gè)問(wèn)題:一是數(shù)據(jù)文件重復(fù)存儲(chǔ)造成存儲(chǔ)空間浪費(fèi)問(wèn)題;二是數(shù)據(jù)文件傳輸過(guò)程導(dǎo)致的時(shí)延問(wèn)題。本文基于文件傳輸協(xié)議(File Transfer Protocol,FTP)[3]設(shè)計(jì)并實(shí)現(xiàn)了一種無(wú)需“二次傳輸”便可支持DMZ區(qū)訪問(wèn)內(nèi)網(wǎng)區(qū)數(shù)據(jù)文件的數(shù)據(jù)文件分發(fā)軟件,對(duì)于解決單向網(wǎng)絡(luò)通信場(chǎng)景下的數(shù)據(jù)文件快速分發(fā)問(wèn)題有重要實(shí)踐意義。
華風(fēng)氣象傳媒集團(tuán)有限責(zé)任公司(以下簡(jiǎn)稱“華風(fēng)”)采用上述策略對(duì)業(yè)務(wù)網(wǎng)絡(luò)進(jìn)行安全管理,將網(wǎng)絡(luò)劃分為業(yè)務(wù)內(nèi)網(wǎng)區(qū)、DMZ區(qū)、互聯(lián)網(wǎng)區(qū),網(wǎng)絡(luò)分區(qū)如圖1所示。內(nèi)網(wǎng)區(qū)存儲(chǔ)了大量氣象數(shù)據(jù)文件,DMZ區(qū)與互聯(lián)網(wǎng)區(qū)均禁止主動(dòng)發(fā)起網(wǎng)絡(luò)請(qǐng)求訪問(wèn)該區(qū)域。DMZ區(qū)部署了供用戶實(shí)時(shí)訪問(wèn)數(shù)據(jù)文件的FTP服務(wù)器,可以接收來(lái)自互聯(lián)網(wǎng)的網(wǎng)絡(luò)請(qǐng)求?;ヂ?lián)網(wǎng)區(qū)部署了供用戶訪問(wèn)的Web服務(wù)與數(shù)據(jù)API服務(wù)。在這種場(chǎng)景下,為了滿足用戶通過(guò)FTP客戶端軟件及時(shí)獲取氣象數(shù)據(jù)文件的需求,需要定時(shí)將內(nèi)網(wǎng)區(qū)的氣象數(shù)據(jù)文件傳輸?shù)紻MZ區(qū)FTP服務(wù)器上進(jìn)行存儲(chǔ)。這種“二次傳輸”給實(shí)時(shí)數(shù)據(jù)服務(wù)造成了大量存儲(chǔ)空間的浪費(fèi),增加了數(shù)據(jù)傳輸延遲,降低了客戶體驗(yàn)。
現(xiàn)有數(shù)據(jù)流程如圖2所示,當(dāng)前華風(fēng)的業(yè)務(wù)網(wǎng)絡(luò)與數(shù)據(jù)傳輸流程如下。
圖2 現(xiàn)有數(shù)據(jù)流程
(1)從上游數(shù)據(jù)源接收數(shù)據(jù),并將其存儲(chǔ)在內(nèi)網(wǎng)數(shù)據(jù)存儲(chǔ)中。
(2)利用Linux系統(tǒng)上的軟件工具Crontab[4]設(shè)置定時(shí)器,定時(shí)調(diào)用RSYNC[5]軟件工具將氣象數(shù)據(jù)文件二次傳輸?shù)紻MZ區(qū)部署的FTP服務(wù)器磁盤中。
(3)用戶通過(guò)標(biāo)準(zhǔn)的FTP客戶端軟件工具訪問(wèn)DMZ區(qū)部署的FTP服務(wù)器獲取數(shù)據(jù)。
顯然,為了能夠讓用戶及時(shí)訪問(wèn)氣象數(shù)據(jù)文件,需要將內(nèi)網(wǎng)數(shù)據(jù)存儲(chǔ)中的氣象數(shù)據(jù)文件“二次傳輸”到DMZ區(qū)部署的FTP服務(wù)器上。要想解決數(shù)據(jù)重復(fù)存儲(chǔ)與數(shù)據(jù)傳輸延遲大的問(wèn)題,就需要消除數(shù)據(jù)“二次傳輸”環(huán)節(jié)。
要消除數(shù)據(jù)文件“二次傳輸”環(huán)節(jié),就需要本方案設(shè)計(jì)一些策略與機(jī)制將DMZ區(qū)FTP服務(wù)器接收到的對(duì)本地磁盤數(shù)據(jù)文件的讀取操作“轉(zhuǎn)化”為對(duì)內(nèi)網(wǎng)數(shù)據(jù)存儲(chǔ)中數(shù)據(jù)文件的讀取操作,并遵守僅支持從內(nèi)網(wǎng)主動(dòng)建立到DMZ區(qū)的網(wǎng)絡(luò)連接管控策略。
軟件總體構(gòu)想如圖3所示,本文計(jì)劃基于FTP文件傳輸協(xié)議,研發(fā)具備“接力傳輸”能力的氣象數(shù)據(jù)文件傳輸軟件(以下簡(jiǎn)稱“FTP-CMD”),以與標(biāo)準(zhǔn)FTP服務(wù)器軟件相區(qū)別。軟件將采用客戶端-服務(wù)器(Client-Server,C/S)軟件架構(gòu),客戶端模塊FTP-CMD-Agent部署在內(nèi)網(wǎng)區(qū),服務(wù)器模塊FTP-CMD-Server部署在DMZ區(qū),詳細(xì)作用如下。
圖3 軟件總體構(gòu)想
FTP-CMD-Agent模塊定時(shí)地獲取FTP-CMD-Server隊(duì)列中存儲(chǔ)的從用戶標(biāo)準(zhǔn)FTP客戶端軟件發(fā)送過(guò)來(lái)的操作命令,并轉(zhuǎn)化為本地存儲(chǔ)的讀取操作,最后按照約定規(guī)范將操作結(jié)果推送給FTP-CMD-Server,再由FTP-CMD-Server交付給用戶標(biāo)準(zhǔn)FTP客戶端軟件。
FTP-CMD-Server模塊在標(biāo)準(zhǔn)FTP服務(wù)器軟件的基礎(chǔ)上增加了異步操作命令隊(duì)列的FTP服務(wù)。它支持現(xiàn)有的標(biāo)準(zhǔn)FTP客戶端軟件,用于接收用戶標(biāo)準(zhǔn)FTP客戶端軟件的數(shù)據(jù)操作命令,并將FTP-CMD-Agent模塊返回的數(shù)據(jù)內(nèi)容交付給用戶標(biāo)準(zhǔn)FTP客戶端軟件。
通過(guò)將標(biāo)準(zhǔn)FTP服務(wù)器軟件對(duì)本機(jī)磁盤文件的同步讀取操作轉(zhuǎn)化為異步讀取內(nèi)網(wǎng)區(qū)數(shù)據(jù)文件的操作,實(shí)現(xiàn)了數(shù)據(jù)文件的“接力傳輸”,避免了內(nèi)網(wǎng)數(shù)據(jù)文件到DMZ區(qū)的“二次傳輸”,解決了數(shù)據(jù)重復(fù)存儲(chǔ)與數(shù)據(jù)傳輸延遲大的問(wèn)題。
該軟件包含Server與Agent 2個(gè)模塊,核心流程設(shè)計(jì)如圖4所示。各模塊中的功能組件與交互流程設(shè)計(jì)如下。
圖4 核心流程設(shè)計(jì)
4.1.1 Server模塊
該模塊部署在DMZ區(qū)服務(wù)器上,核心組件包含F(xiàn)TP-Server、Cmd-Queue、Cmd-Server、Data-Server以及Session-Map,各組件的具體功能設(shè)計(jì)如下。
FTP-Server:該組件實(shí)現(xiàn)了標(biāo)準(zhǔn)FTP協(xié)議,負(fù)責(zé)解析用戶標(biāo)準(zhǔn)FTP客戶端軟件發(fā)送到DMZ區(qū)FTP服務(wù)器上的FTP命令,并根據(jù)命令的執(zhí)行結(jié)果設(shè)置響應(yīng)狀態(tài)與數(shù)據(jù)。
Cmd-Queue:一個(gè)由參數(shù)控制長(zhǎng)度的內(nèi)存隊(duì)列,由Golang語(yǔ)言的Channel實(shí)現(xiàn),用于存放FTP-Server已接收到但尚未處理的FTP操作命令。
Cmd-Server:一個(gè)基于TCP協(xié)議實(shí)現(xiàn)的Socket服務(wù),用于接收Agent模塊發(fā)來(lái)的命令獲取請(qǐng)求,并將需要Agent模塊執(zhí)行的命令按JSON字符串編碼后以二進(jìn)制流的形式進(jìn)行響應(yīng)。
Data-Server:一個(gè)基于TCP協(xié)議實(shí)現(xiàn)的Socket服務(wù),用于接收Agent模塊發(fā)來(lái)的已執(zhí)行完畢命令的操作結(jié)果數(shù)據(jù)。結(jié)果數(shù)據(jù)以二進(jìn)制流的形式傳輸。
Session-Map:一個(gè)基于內(nèi)存的哈希表,用于存放FTP-Server的會(huì)話ID、FTP-Server與用戶標(biāo)準(zhǔn)FTP客戶端軟件建立的Socket連接映射關(guān)系。
4.1.2 Agent模塊
該模塊部署在內(nèi)網(wǎng)區(qū)服務(wù)器上,核心組件包含Cmd-Pull-Timer、Task-Queue、Task-Runner,各組件的具體功能設(shè)計(jì)如下。
Cmd-Pull-Timer:一個(gè)由定時(shí)器驅(qū)動(dòng)的待執(zhí)行FTP命令的輪詢器。它主動(dòng)連接Server模塊的Cmd-Server組件,并將獲取到的JSON格式編碼的命令投遞進(jìn)入Task-Queue中。
Task-Queue:該組件是一個(gè)基于內(nèi)存的隊(duì)列,長(zhǎng)度可以由參數(shù)控制,基于Golang Channel實(shí)現(xiàn),用于存放已經(jīng)解析完畢待執(zhí)行器Task-Runner執(zhí)行的任務(wù)。
Task-Runner:該組件從Task-Queue實(shí)時(shí)獲取待執(zhí)行的命令參數(shù),執(zhí)行獲取到的命令并將響應(yīng)結(jié)果推送到結(jié)果數(shù)據(jù)接收地址(Server模塊的Data-Server組件)。
如圖4所示,一次完整FTP操作從用戶標(biāo)準(zhǔn)FTP客戶端軟件發(fā)起請(qǐng)求到最后獲取到結(jié)果數(shù)據(jù)的流程如下。
(1)用戶標(biāo)準(zhǔn)FTP客戶端軟件連接FTP-Server組件。
(2)用戶標(biāo)準(zhǔn)FTP客戶端軟件發(fā)送操作命令到FTP-Server組件。
(3)FTP-Server組件解析命令及參數(shù),將命令按照J(rèn)SON格式編碼后投遞到Cmd-Queue,并在Session-Map登記本次會(huì)話ID,與TCP Socket連接,之后暫時(shí)掛起本次會(huì)話等待處理,并設(shè)置等待超時(shí)計(jì)時(shí)器。
(4)Cmd-Pull-Timer組件定時(shí)輪詢Cmd-Server。Cmd-Server從Cmd-Queue取出1條待執(zhí)行命令,回復(fù)給Cmd-Pull-Timer。Cmd-Pull-Timer解析完畢收到的JSON格式命令后生成待執(zhí)行任務(wù)JSON配置,并投遞到Task-Queue。
(5)Task-Runner組件實(shí)時(shí)監(jiān)聽(tīng)Task-Queue的變化,獲取到任務(wù)經(jīng)JSON配置后立即執(zhí)行,并將執(zhí)行的結(jié)果數(shù)據(jù)推送到Data-Server。
(6)Data-Server接收到Task-Runner推送的響應(yīng)結(jié)果數(shù)據(jù)后,解析其中的FTP會(huì)話ID與數(shù)據(jù)內(nèi)容,從Session-Map中查到與FTP會(huì)話ID對(duì)應(yīng)的TCP Socket,最后由TCP Socket將數(shù)據(jù)內(nèi)容返回給用戶標(biāo)準(zhǔn)FTP客戶端軟件。
為了進(jìn)一步加強(qiáng)網(wǎng)絡(luò)安全與數(shù)據(jù)安全,避免內(nèi)網(wǎng)區(qū)數(shù)據(jù)文件被非法訪問(wèn)與截取,在軟件設(shè)計(jì)過(guò)程中引入了SSL/TLS協(xié)議,用于建立可信的加密傳輸通道。FTP協(xié)議與SSL/TLS協(xié)議相結(jié)合實(shí)現(xiàn)加密傳輸[6],以加強(qiáng)數(shù)據(jù)文件傳輸?shù)陌踩?具體設(shè)計(jì)如下。
(1)為FTP-CMD-Server配置SSL/TLS協(xié)議支持。
使用Liunx系統(tǒng)中的Openssl軟件工具生成數(shù)字證書與密鑰[7],并設(shè)置DMZ區(qū)部署的FTP-CMD-Server啟用該證書,以便正確處理使用SSL/TLS協(xié)議的連接。
(2)為FTP客戶端配置SSL/TLS協(xié)議支持。
用戶設(shè)置標(biāo)準(zhǔn)FTP客戶端軟件連接FTP-CMD-Server的協(xié)議為FTPS。設(shè)置完成后,客戶端軟件會(huì)使用SSL/TLS協(xié)議與FTP-CMD-Server建立安全的網(wǎng)絡(luò)連接。
由于存在內(nèi)網(wǎng)區(qū)只可單向訪問(wèn)DMZ區(qū)而DMZ區(qū)無(wú)法主動(dòng)建立到內(nèi)網(wǎng)區(qū)的網(wǎng)絡(luò)連接的安全管控,用戶訪問(wèn)DMZ區(qū)服務(wù)器下載數(shù)據(jù)文件時(shí),需要有一個(gè)機(jī)制將DMZ區(qū)訪問(wèn)內(nèi)網(wǎng)區(qū)的網(wǎng)絡(luò)請(qǐng)求“逆轉(zhuǎn)”為內(nèi)網(wǎng)區(qū)訪問(wèn)DMZ區(qū)的請(qǐng)求。本文通過(guò)引入異步I/O、內(nèi)存隊(duì)列、超時(shí)器、輪詢機(jī)制,使得DMZ區(qū)的FTP-CMD-Server不再主動(dòng)連接內(nèi)網(wǎng)區(qū),改為緩存待處理的命令進(jìn)行超時(shí)等待;內(nèi)網(wǎng)區(qū)的FTP-CMD-Agent主動(dòng)抓取待執(zhí)行命令,將執(zhí)行結(jié)果主動(dòng)推送回FTP-CMD-Server。這種協(xié)作機(jī)制解決了“逆轉(zhuǎn)”問(wèn)題。
FTP-CMD與標(biāo)準(zhǔn)FTP服務(wù)器軟件相比,一次讀取數(shù)據(jù)文件的操作被拆分成了2個(gè)執(zhí)行階段,由分別部署在內(nèi)網(wǎng)區(qū)與DMZ區(qū)的FTP-CMD-Agent與FTP-CMD-Server協(xié)作完成。這就需要設(shè)計(jì)一個(gè)“接力”機(jī)制,確保命令操作的唯一性,以便數(shù)據(jù)可以被正確、完整地傳輸。本文通過(guò)UUID編碼生成技術(shù)為每條FTP命令生成唯一的UUID標(biāo)識(shí),并將該標(biāo)識(shí)關(guān)聯(lián)到該命令使用的FTP會(huì)話、TCP Socket連接上,解決了FTP-CMD-Agent與FTP-CMD-Server接力過(guò)程中相互識(shí)別的問(wèn)題。
通常,內(nèi)網(wǎng)區(qū)與DMZ區(qū)可使用的網(wǎng)絡(luò)帶寬資源是有限的,需要設(shè)計(jì)一個(gè)避免數(shù)據(jù)帶寬被耗盡的機(jī)制。本文設(shè)計(jì)了數(shù)據(jù)隊(duì)列容量參數(shù)與數(shù)據(jù)傳輸窗口參數(shù),通過(guò)配置以上2個(gè)參數(shù)來(lái)控制FTP-CMD-Server模塊與FTP-CMD-Agent模塊之間可使用的最大帶寬,避免出現(xiàn)數(shù)據(jù)傳輸擁塞。
本節(jié)對(duì)使用本文所設(shè)計(jì)的軟件后華風(fēng)數(shù)據(jù)流程運(yùn)行時(shí)效與數(shù)據(jù)存儲(chǔ)使用情況進(jìn)行了簡(jiǎn)要分析,結(jié)論證明:本軟件可消除使用Rsync將內(nèi)網(wǎng)數(shù)據(jù)存儲(chǔ)中的文件定時(shí)同步到DMZ區(qū)的“二次傳輸”環(huán)節(jié),從而在遵循安全管控的情況下解決了數(shù)據(jù)重復(fù)存儲(chǔ)與數(shù)據(jù)延遲大的問(wèn)題。
由圖5與圖6可見(jiàn),使用WinSCP訪問(wèn)部署在DMZ區(qū)的Server模塊讀取到的數(shù)據(jù)文件列表的文件時(shí)間與直接訪問(wèn)內(nèi)網(wǎng)區(qū)數(shù)據(jù)存儲(chǔ)獲取到的數(shù)據(jù)文件列表的時(shí)間完全一致。由于本軟件默認(rèn)設(shè)置了Cmd-Pull-Timer組件模塊的輪詢間隔為100 ms,所以實(shí)際的延遲僅為0.1 s,實(shí)際使用時(shí)也可以將Cmd-Pull-Timer組件模塊的輪詢間隔設(shè)置為更短的間隔,幾乎達(dá)到0延遲的效果。
圖5 DMZ區(qū)使用WinSCP訪問(wèn)Server模塊獲取到的文件列表
圖6 DMZ區(qū)使用WinSCP訪問(wèn)Server模塊獲取到的文件列表
由于無(wú)需再使用RSYNC與Crontab將數(shù)據(jù)文件按照一定頻率從內(nèi)網(wǎng)數(shù)據(jù)存儲(chǔ)中傳輸?shù)紻MZ區(qū)部署的FTP服務(wù)器硬盤上,而是轉(zhuǎn)為在WinSCP發(fā)起FTP操作時(shí)通過(guò)網(wǎng)絡(luò)直接讀取內(nèi)網(wǎng)數(shù)據(jù)存儲(chǔ)中的數(shù)據(jù)文件,避免了為存儲(chǔ)這些數(shù)據(jù)文件副本而造成的存儲(chǔ)空間浪費(fèi),消除了RSYNC數(shù)據(jù)同步帶來(lái)的任務(wù)等待時(shí)延(Linux系統(tǒng)下支持的最小間隔為1 min)與文件寫盤時(shí)延。
本文以單向網(wǎng)絡(luò)通信管控場(chǎng)景中內(nèi)網(wǎng)區(qū)存儲(chǔ)的數(shù)據(jù)文件需要被“二次傳輸”到DMZ區(qū)后才可以向用戶提供數(shù)據(jù)服務(wù)所面臨的數(shù)據(jù)重復(fù)存儲(chǔ)與數(shù)據(jù)傳輸延遲大的問(wèn)題為研究對(duì)象,找到了解決上述問(wèn)題的關(guān)鍵是消除數(shù)據(jù)“二次傳輸”環(huán)節(jié)。基于FTP協(xié)議設(shè)計(jì)了C/S架構(gòu)的FTP-CMD軟件,該軟件通過(guò)FTP-CMD-Server與FTP-CMD-Agent配合成功消除了內(nèi)網(wǎng)區(qū)數(shù)據(jù)文件到DMZ區(qū)的“二次傳輸”環(huán)節(jié),其有效性經(jīng)過(guò)了華風(fēng)數(shù)據(jù)業(yè)務(wù)的驗(yàn)證。
該軟件可以在遵守只能從內(nèi)網(wǎng)區(qū)主動(dòng)建立到DMZ區(qū)的網(wǎng)絡(luò)連接的單向通信管控策略的前提下實(shí)現(xiàn)數(shù)據(jù)文件的高效分發(fā)。該軟件兼容標(biāo)準(zhǔn)FTP客戶端、SSL/TLS安全協(xié)議,兼顧了易用性與安全性,對(duì)于網(wǎng)絡(luò)安全管理要求高、數(shù)據(jù)存儲(chǔ)只能在內(nèi)網(wǎng)區(qū)的業(yè)務(wù)場(chǎng)景有重要的參考價(jià)值。