徐婉冰 王軼駿 薛 質(zhì) 姜開達(dá)
(上海交通大學(xué)網(wǎng)絡(luò)空間安全學(xué)院 上海 200240)
隨著計(jì)算機(jī)網(wǎng)絡(luò)的快速發(fā)展,暗網(wǎng)的規(guī)模也快速增大。暗網(wǎng)在廣義上指無法被搜索引擎收錄內(nèi)容的站點(diǎn),目前最流行的訪問暗網(wǎng)的方法是Tor[1]。Tor是一種暗網(wǎng)協(xié)議,通過在Tor網(wǎng)絡(luò)的入口和出口節(jié)點(diǎn)間隨機(jī)選擇若干匿名中繼節(jié)點(diǎn)建立加密鏈路,實(shí)現(xiàn)類似洋蔥的逐層加密網(wǎng)絡(luò)。
由于Tor具有雙向匿蹤特性,即消息的發(fā)送者和接收者無法知道彼此的IP地址,它可被用于抵御網(wǎng)絡(luò)監(jiān)控、分享私密信息、瀏覽被禁網(wǎng)站等,因此一些國家或企業(yè)會禁用Tor,最直接的方法是封鎖Tor目錄服務(wù)器和所有已知節(jié)點(diǎn)的IP。為了應(yīng)對IP封鎖,誕生了Tor bridge(網(wǎng)橋)[2],它本質(zhì)是Tor的入口節(jié)點(diǎn),部署在不受監(jiān)控的區(qū)域。由于官方不會公開完整的bridge列表,所以ISP無法徹底封鎖bridge。
然而審查者仍可以基于TLS handshake的指紋特征檢測Tor流量及其他可疑流量[3]。對此,研究者們提出了Pluggable Transports(PT),一種用于隱藏Tor流量的網(wǎng)橋工具。PT連接Tor客戶端和Tor網(wǎng)橋,通過混淆和偽裝等手段,使Tor流量看上去是普通的協(xié)議,從而躲避檢測。
當(dāng)前,國外對于PT流量檢測的研究主要從熵檢測、語義分析和機(jī)器學(xué)習(xí)三方面開展,檢測的目標(biāo)以Tor官網(wǎng)建議的Meek[5-7]、Obfs系列、FTE系列為主,在理想環(huán)境下都能以較高準(zhǔn)確率進(jìn)行識別。相比檢測,近年來幾乎沒有新的流量隱蔽方案。同時(shí),國內(nèi)對Tor流量隱蔽問題[4]整體缺乏研究。本文主要貢獻(xiàn)如下:
(1) 研究了已有的PT方案,分析了常見檢測方法的優(yōu)缺點(diǎn);
(2) 不同于以往僅對通信內(nèi)容加以混淆偽裝的隱蔽方案,本文創(chuàng)新性地提出了在TCP層面修改連接特征的流量隱蔽思路,表明依賴連接時(shí)長和連接數(shù)量作為特征的機(jī)器學(xué)習(xí)檢測算法是存在弱點(diǎn)的;
(3) 設(shè)計(jì)了基于TCP轉(zhuǎn)發(fā)的可控重連算法,實(shí)驗(yàn)分析了該算法對連接時(shí)長和數(shù)據(jù)包大小的影響,為后續(xù)隱蔽信道的檢測和研究提供了新的方向。
PT通過對Tor流量進(jìn)行混淆、加密、偽裝成正常協(xié)議的字段等方法,消除Tor流量的特征。PT方案和其檢測方法介紹如下。
Meek的原理是以未禁的協(xié)議作為隧道使隧道內(nèi)的Tor流量通過。它采用了域前置(Domain Fronting)技術(shù)[8],利用HTTPS和CDN繞過審查。Domain Fronting指的是在DNS請求數(shù)據(jù)包和TLS的SNI字段使用未被禁止的前置域名,而在HTTP Host頭部字段使用被審查者禁止的隱藏域名。審查者只能看到前置域名,而看不到被TLS加密的HTTP中的域名。數(shù)據(jù)包到達(dá)前置域服務(wù)器(比如CDN)后,服務(wù)器解密數(shù)據(jù)包,并將其轉(zhuǎn)發(fā)到隱藏域。Meek的原理如圖1所示。
圖1 Meek原理圖
針對Meek的檢測以機(jī)器學(xué)習(xí)為主。Shahbar等[9]通過C4.5決策樹分類器,分析連接的時(shí)間跨度、連接的數(shù)量和重復(fù)性、傳輸數(shù)據(jù)量和建立的連接的數(shù)量,或者包大小、發(fā)出的字節(jié)數(shù)、最大的包大小[10],進(jìn)行學(xué)習(xí)后可以識別出Meek流量。Fifield等[5]指出,正常HTTPS和Meek的TCP連接的總持續(xù)時(shí)間不同,TCP payload長度分布比例也不同。Cuzzocrea等[11]采用state-of-the-art算法(包括J48、J48Consolidated、BayesNet、jRip、OneR、REPTree法)研究了Tor流量分類問題。此外,Meek的熵值特性[12]在機(jī)器學(xué)習(xí)的檢測中也有一定效果。
除了連接相關(guān)的特征外,呼吸包也是Meek的一個(gè)特點(diǎn)。Meek無法由服務(wù)器主動推送消息給客戶端[12],客戶端為了獲取數(shù)據(jù)必須主動向Tor網(wǎng)橋發(fā)送大量心跳數(shù)據(jù)包,55%的TCP ACK包間隔小于10 ms,基本上間隔都小于1 s。
Obfs系列包括Obfs2、Obfs3、Obfs4[13]和Scramblesuit[14],目前最常使用的是Obfs4。其原理是對Tor流量加密,使之看起來像隨機(jī)字節(jié),避免基于黑名單的指紋檢測。且Obfs4通過密鑰協(xié)商可以對抗active-probing attacks[15],防止審查者利用連接發(fā)現(xiàn)網(wǎng)橋。
在檢測方面,Wang等[12]發(fā)現(xiàn)基于熵的檢測和簡單啟發(fā)式算法(如長度檢測)進(jìn)行聯(lián)合檢測可以識別Obfs流量。熵值的計(jì)算公式是:
(1)
式中:pi表示第i個(gè)字符出現(xiàn)的頻率,即該字符出現(xiàn)的次數(shù)除以總的字符數(shù)。熵的大小可以反映出一個(gè)數(shù)據(jù)包的字符分布是否正常。由于Obfs系列直接對傳輸?shù)膬?nèi)容進(jìn)行加密,因此整體流量都有著較高的熵值。而正常的協(xié)議,包括如TLS這樣的加密協(xié)議,在握手時(shí)往往有著熵值更低的明文頭部。檢測者可以對應(yīng)用層第一個(gè)數(shù)據(jù)包的前2 048個(gè)字節(jié)使用熵檢測,實(shí)現(xiàn)對Tor的攔截。其他檢測方法還包括數(shù)據(jù)包長度檢測和截尾序貫概率比檢驗(yàn)(truncated SPRT)[16]等。
FTE系列包括FTE(Format-Transforming Encryption)[6,17-18]、Stegotorus[19]、SkypeMorph[20]、CensorSpoofer[19]、Marionette[21]等。其原理是通過模仿其他協(xié)議的格式,使審查者對流量錯(cuò)誤分類,從而達(dá)到躲避審查的目的。FTE通過簡單模仿HTTP流量的格式躲避審查;Stegotorus在Obfs的基礎(chǔ)上對包切分,改變包大小和時(shí)間、建立多個(gè)連接,并采用隱寫技術(shù),模仿HTTP、Skype、Ventrilo等合法流量;SkypeMorph偽裝成Skype視頻流量;Marionette在FTE的基礎(chǔ)上加入帶有隨機(jī)性的狀態(tài)轉(zhuǎn)移,使之對于HTTP協(xié)議的模仿更逼真。
FTE只是簡單模仿協(xié)議的格式,并沒有模仿協(xié)議的語義。所以,Houmansadr等[22]提出了基于語義的方法,檢測流量與預(yù)期行為之間的差異,比如服務(wù)器能否正確返回404錯(cuò)誤等。
另一方面,由于FTE的URI字段是直接加密形成的,所以也可以通過熵檢測[12]來識別FTE流量。相比正常HTTP包中的可見字符及英文單詞,F(xiàn)TE偽裝的HTTP包有著更高的熵值。
檢測技術(shù)[23]主要可以分為以下四類:(1) 基于語義的檢測;(2) 基于熵值的檢測;(3) 基于機(jī)器學(xué)習(xí)的檢測[24];(4) 基于DPI與防火墻的組合檢測[25-26],可以重建完整數(shù)據(jù)流,分析具體協(xié)議,對數(shù)據(jù)包進(jìn)行關(guān)鍵字識別,并主動探測可疑服務(wù)器,避免誤報(bào)。這四類檢測技術(shù)中,基于熵值和DPI的檢測本質(zhì)都是對數(shù)據(jù)包的內(nèi)容進(jìn)行分析,因此PT在進(jìn)一步完善后(例如冗余處理)可以針對性地繞過它們的檢測;基于語義的檢測本質(zhì)是對客戶端與服務(wù)器的交互過程進(jìn)行合理性判斷,PT同樣可以在精心完善后實(shí)現(xiàn)繞過;而基于機(jī)器學(xué)習(xí)的檢測由于分析的是TCP連接層面的特征,層次更低,改變特征就更加困難,因而這種檢測正在逐漸成為主流的檢測手段。本文針對這種TCP層面的檢測提出了可控重連算法,通過修改TCP連接時(shí)長和包大小分布,從而形成可定制的TCP連接特征。
圖2為Tor流量隱蔽系統(tǒng)的部署結(jié)構(gòu),系統(tǒng)部署在Tor客戶端的下層,包括PT客戶端和PT服務(wù)端,充當(dāng)類似Shadowsocks的角色。用戶、Tor客戶端、PT客戶端位于被審查的區(qū)域內(nèi),而PT服務(wù)端和Tor網(wǎng)絡(luò)位于審查區(qū)域外。
圖2 系統(tǒng)部署示意圖
為了方便后文描述算法,圖3展示了請求數(shù)據(jù)的流向,響應(yīng)數(shù)據(jù)反之亦然。
圖3 請求數(shù)據(jù)流示意圖
Tor程序(不使用Tor時(shí),瀏覽器產(chǎn)生常規(guī)HTTP/HTTPS請求)將原始請求提交給本地Socks5客戶端代理;Socks5客戶端再以Socks5協(xié)議的格式交給PT客戶端;隨后PT客戶端在{Socks5{原始請求}}的TCP流基礎(chǔ)上,加上流量隱蔽系統(tǒng)PT的封裝,繞過審查系統(tǒng)到達(dá)PT服務(wù)端;之后PT服務(wù)端恢復(fù)出{Socks5{原始請求}};最后同在代理服務(wù)器上的Socks5服務(wù)端解析Socks5請求并轉(zhuǎn)發(fā)到Tor網(wǎng)絡(luò)或目標(biāo)網(wǎng)站。
根據(jù)Tor官方的文檔[27],Tor采用連接復(fù)用,在Tor代理中對多條TCP連接使用同一條TCP連接,因此連接時(shí)長比一般通信更長。機(jī)器學(xué)習(xí)檢測算法往往把連接時(shí)長和數(shù)據(jù)包大小等作為重要的檢測指標(biāo)。由此本文提出了可控重連的算法。一方面,從TCP重連的角度,自定義PT客戶端與PT服務(wù)端之間的連接時(shí)長;另一方面,從數(shù)據(jù)包大小可控的角度,基于已有數(shù)據(jù)包的分布比例,計(jì)算轉(zhuǎn)發(fā)數(shù)據(jù)包的大小。
圖4顯示了TCP重連的基本過程,涉及以下三個(gè)重要階段。
圖4 新舊連接示意圖
1) 新連接的建立。Tor建立新鏈路或?yàn)g覽器產(chǎn)生新請求時(shí),Socks5客戶端與PT客戶端建立連接x,隨后PT客戶端與PT服務(wù)端建立連接a,PT服務(wù)端也與Socks5服務(wù)端建立連接y。在后續(xù)的重連過程中,連接x和連接y保持不變。
2) 重連的握手。PT客戶端到達(dá)預(yù)期連接時(shí)長后啟動重連,暫停向PT服務(wù)端的數(shù)據(jù)發(fā)送,對PT服務(wù)端新建連接b,并協(xié)議握手告知PT服務(wù)端,新連接b即將替換舊連接a。
3) 舊連接的揮手。PT客戶端發(fā)送FIN包關(guān)閉舊連接a,服務(wù)端也發(fā)送FIN關(guān)閉連接a后,兩者正式改用新連接b來通信。
為了兼顧轉(zhuǎn)發(fā)效率,PT服務(wù)端的主線程負(fù)責(zé)接收PT客戶端的新連接請求,而各個(gè)子線程(或稱“轉(zhuǎn)發(fā)線程”)負(fù)責(zé)進(jìn)行PT客戶端與Socks5服務(wù)端之間的雙向轉(zhuǎn)發(fā)。
多線程的使用會導(dǎo)致同步問題,例如主線程中新連接b建立的同時(shí),PT服務(wù)端的子線程可能正在進(jìn)行舊連接a上的數(shù)據(jù)收發(fā)。因此,PT服務(wù)端不可能在新連接b建立后,立刻完成從a到b的新舊替換,所以連接a中剩余數(shù)據(jù)的讀取和連接a的完整關(guān)閉需要按照TCP四次揮手的原理進(jìn)行設(shè)計(jì)。
本文的重連算法中,對于舊連接a,PT服務(wù)端在第三階段收到的來自PT客戶端的FIN包,標(biāo)志著從PT客戶端到Socks5服務(wù)端方向的數(shù)據(jù)流動的停止;而PT客戶端收到PT服務(wù)端回復(fù)的FIN包后,才標(biāo)志著從Socks5服務(wù)端到PT客戶端方向的數(shù)據(jù)流動的停止。此后,雙方的轉(zhuǎn)發(fā)才正式使用新連接b進(jìn)行。
重連算法的關(guān)鍵是PT服務(wù)端需要正確鑒別PT客戶端在對其建立/關(guān)閉連接時(shí)的意圖,區(qū)分來自PT客戶端的新連接請求/FIN包,是重連過程中新舊連接的切換所致,還是Tor/瀏覽器在進(jìn)行常規(guī)連接的建立/關(guān)閉。
對此,本文算法的核心是,PT服務(wù)端維護(hù)一個(gè)全局map,以連接y的描述符作為key,再以與PT客戶端當(dāng)前連接的描述符作為value。第一階段建立連接a時(shí),PT服務(wù)端就將連接y的信息(即key)告訴PT客戶端,那么在第二階段PT客戶端建立新連接b時(shí),只需將連接y的信息反饋給PT服務(wù)端,就可以使其知道新舊連接a與b的對應(yīng)關(guān)系,進(jìn)入重連流程。從而,當(dāng)PT服務(wù)端的轉(zhuǎn)發(fā)線程收到關(guān)閉連接的請求時(shí),也可以通過查詢value是否改變,判斷當(dāng)前是否正處于重連流程中。另外,PT服務(wù)端使用了全局互斥鎖,確保握手過程不會在多線程運(yùn)行中被其他連接信息或重連過程打斷,也避免了map的讀寫相關(guān)性問題。
圖5描述了階段1的連接建立過程,關(guān)鍵步驟③、步驟⑤實(shí)現(xiàn)了PT客戶端與PT服務(wù)端之間傳遞連接y的信息。
圖5 新連接的建立
圖6描述了階段2(步驟①-步驟③)的重連過程和階段3(步驟④-步驟⑤)的舊連接關(guān)閉過程。
圖6 重連握手和舊連接揮手
為了使描述更清晰,以PT服務(wù)端主線程處理來自PT客戶端的連接請求為例,算法1給出了圖5(步驟②-步驟⑤)和圖6(步驟①-步驟③)PT服務(wù)端的偽代碼。
算法1PT服務(wù)端的main函數(shù)
輸入:收發(fā)PT客戶端。
輸出:Socks5服務(wù)端的流量。
top:
1. conn_PTc←accept_conn_from_PT_client()
2. mutex_lock()
3. handshake_msg←recv_from_PT_client()
4.ifhandshake_msg=NEW_CONNthen
5. conn_Ss←connect_Socks_server()
6. //為雙向數(shù)據(jù)傳輸創(chuàng)建線程
create_thread(conn_PTc,conn_Ss)
7. add_to_map {conn_Ss:conn_PTc}
8. tell_PT_client(info=conn_Ss)
9. mutex_unlock()
10.else
//重連握手
11. //從msg里提取conn_Ss信息
conn_Ss←extract(handshake_msg)
12. old_conn_PTc←query_map(key=conn_Ss)
13.ifconn_PTc≠old_conn_PTcthen
14. //用current conn_PTc替換舊值
renew_map {conn_Ss:conn_PTc}
15. tell_PT_client(MAP_RENEW_OK)
16. mutex_unlock()
17.elseerror()
18.endif
19.endif
20.gototop
數(shù)據(jù)包可控算法研究了在已知正常流量的數(shù)據(jù)包大小分布的情況下,如何改變轉(zhuǎn)發(fā)數(shù)據(jù)包的大小,使其與正常流量相似。由于改變一個(gè)數(shù)據(jù)包大小的方式只有拆分和冗余兩種,故算法的目標(biāo)是在使轉(zhuǎn)發(fā)數(shù)據(jù)包大小符合正常流量分布比例的同時(shí),盡可能減小拆分和冗余對信道與時(shí)間的浪費(fèi)。
設(shè)通過抓包等前期手段,已知一段時(shí)間內(nèi)正常流量的數(shù)據(jù)包大小分布如圖7(a)所示,大小在ci-1~ci范圍(記為區(qū)間i)的有yi個(gè)數(shù)據(jù)包(共n個(gè)區(qū)間),當(dāng)前待轉(zhuǎn)發(fā)的原始數(shù)據(jù)包大小為x,算法完成后實(shí)際發(fā)送的稱為結(jié)果數(shù)據(jù)包。
(a) 正常流量的數(shù)據(jù)包大小分布
(b) 權(quán)值序列與當(dāng)前數(shù)據(jù)包的關(guān)系圖7 當(dāng)前數(shù)據(jù)包與正常流量分布和權(quán)值序列的關(guān)系
算法需要考慮如下幾點(diǎn):(1) 結(jié)果數(shù)據(jù)包的大小分布應(yīng)當(dāng)接近正常流量數(shù)據(jù)包的大小分布,同時(shí)要保持一定的隨機(jī)性;(2) 為了節(jié)省信道資源,需要適當(dāng)減少拆分和冗余次數(shù);(3) 如果要冗余處理,應(yīng)當(dāng)避免結(jié)果數(shù)據(jù)包的大小和原始數(shù)據(jù)包相差過多,比如原始數(shù)據(jù)包大小在區(qū)間i內(nèi),那么同樣條件下計(jì)算結(jié)果數(shù)據(jù)包在區(qū)間i+1的概率應(yīng)當(dāng)比在區(qū)間i+5的概率大;(4) 如果要拆分,將一個(gè)數(shù)據(jù)包拆成比原始數(shù)據(jù)包略小的包意義不大,反而造成浪費(fèi),所以假設(shè)原始數(shù)據(jù)包在區(qū)間i內(nèi),那么結(jié)果數(shù)據(jù)包在區(qū)間i-1的概率應(yīng)該適當(dāng)減小。
根據(jù)上述要求,算法的過程如下:
1) 找到x所屬的大小范圍xi∈[ci-1,ci),即區(qū)間i。
2) 根據(jù)i,對表示正常數(shù)據(jù)包大小分布的y序列乘以一定權(quán)值得到y(tǒng)′序列,用來計(jì)算臨時(shí)概率:
(2)
3) 根據(jù)y′序列,按概率生成結(jié)果數(shù)據(jù)包所屬的區(qū)間i′,例如結(jié)果數(shù)據(jù)包仍在i區(qū)間的概率為:
(3)
隨后根據(jù)i′和i的大小關(guān)系決定拆分或者冗余:
(1) 如果i′等于i,則直接發(fā)送,無須處理;(2) 如果i′落在大于i區(qū)間,表明結(jié)果數(shù)據(jù)包比原始數(shù)據(jù)包大,應(yīng)加冗余;(3) 如果i′落在小于i區(qū)間,則需要拆分成兩個(gè)包,計(jì)算原始數(shù)據(jù)包和預(yù)期結(jié)果數(shù)據(jù)包大小的差值,得到預(yù)期結(jié)果包1(區(qū)間i)和差值結(jié)果包2(由差值確定)。由于差值結(jié)果包2并不是主動計(jì)算概率得到,而是被動生成的,所以在對應(yīng)區(qū)間的y序列值減1,減小后續(xù)數(shù)據(jù)包落入該區(qū)間的概率。
算法中值得關(guān)注的是β和α序列的取值,如圖7(b)所示,假設(shè)原始數(shù)據(jù)包x在c3~c4范圍,計(jì)算y′序列時(shí)的權(quán)值序列應(yīng)當(dāng)如圖中那樣,β應(yīng)小于1,減少不必要的拆包;α序列應(yīng)當(dāng)是遞減序列,在α0處是最大值,并逐漸趨近于一個(gè)略小于1的值b。本文算法中,α序列采用式(4)得到,其中Δi指區(qū)間序號與原始數(shù)據(jù)包所屬區(qū)間i的差值:
αΔi=ae-Δi+b(a>1,0
(4)
即α0=a+b,α1=ae-1+b,α2=ae-2+b,…。
由此得到算法第2步中計(jì)算y′序列時(shí)的權(quán)值。
算法2描述了生成結(jié)果數(shù)據(jù)包的大致過程。
算法2根據(jù)正常數(shù)據(jù)包大小生成結(jié)果數(shù)據(jù)包
輸入:原始包大小before_size;分布序列y在區(qū)間i有yi個(gè)正常數(shù)據(jù)包;參數(shù)β、a、b。
輸出:{after_i,another_i},結(jié)果數(shù)據(jù)包所屬的區(qū)間(假設(shè)共有N個(gè)區(qū)間)。
1. before_i←before_size.region()
2.y′ ←deepcopy(y)
4.forj=0:N-before_i-1do
6.endfor
7. //根據(jù)y′序列和隨機(jī)值產(chǎn)生結(jié)果數(shù)據(jù)包的區(qū)間
after_i←rand_region(y′)
8.ifafter_i=before_ithen
9.return{after_i,None}
//直接發(fā)送
10.elseifafter_i>before_ithen
11.return{after_i,None}
//加冗余
12.else
//拆分成兩個(gè)數(shù)據(jù)包
13. another_i←calc_difference_i(before_size,after_i)
14. //因被動產(chǎn)生的結(jié)果包調(diào)整y序列
y.adjust(another_i)
15.return{after_i,another_i}
16.endif
根據(jù)可控重連算法,分別針對連接時(shí)長和數(shù)據(jù)包大小的計(jì)算進(jìn)行了如下實(shí)驗(yàn)。
圖8對比了重連前后的連接時(shí)長。實(shí)驗(yàn)在局域網(wǎng)的兩臺主機(jī)上完成,主機(jī)1訪問視頻網(wǎng)站(2分鐘視頻)產(chǎn)生連接時(shí)長超過10 s的原始流量。使用重連算法時(shí),主機(jī)1部署PT客戶端(PT客戶端對超過10 s的連接啟動重連),主機(jī)2部署PT服務(wù)端,配合PT客戶端實(shí)現(xiàn)重連。
圖8 重連前后的連接時(shí)長對比圖
可以看出,不使用重連時(shí),存在超過10 s的連接,最長的持續(xù)了整個(gè)實(shí)驗(yàn)過程;而使用重連算法后,時(shí)長在10~20 s范圍的連接數(shù)量增加(實(shí)際上時(shí)長集中于10 s左右,且都小于11 s),超過此范圍的連接數(shù)量為0,實(shí)現(xiàn)了秒級精度的控制,表明重連算法取得了理想效果。
圖9對比了數(shù)據(jù)包大小可控算法前后的數(shù)據(jù)包大小與累積分布函數(shù)CDF的關(guān)系,實(shí)驗(yàn)中參數(shù)β取0.6,a取2,b取0.8。為使仿真結(jié)果更貼近實(shí)際,實(shí)驗(yàn)中原始數(shù)據(jù)包CDF的來源為3分鐘內(nèi)訪問YouTube視頻的Tor下行流量,正常流量CDF來源為3分鐘內(nèi)直接訪問YouTube視頻的下行流量。
圖9 數(shù)據(jù)包大小可控算法結(jié)果圖
可以看出,原始數(shù)據(jù)包和結(jié)果數(shù)據(jù)包的比例分布在大于1 280字節(jié)時(shí)有較大不同,而結(jié)果數(shù)據(jù)包和正常流量分布的折線非常接近,說明可控算法對原始數(shù)據(jù)包的大小進(jìn)行了有效調(diào)整。
可用余弦相似度進(jìn)一步分析結(jié)果流量與正常流量的接近程度,給定兩個(gè)序列A和B,其余弦相似性θ由點(diǎn)積和向量長度給出,越接近1表示越相似:
(5)
表1給出了不同β、a、b取值時(shí)的結(jié)果包數(shù)量、總計(jì)冗余次數(shù)、總計(jì)冗余跨度(比如原始包在區(qū)間i,結(jié)果包在區(qū)間i+3,則冗余區(qū)間跨度為3)和相似度值。原始數(shù)據(jù)包數(shù)量為7 741個(gè)。
表1 不同β,a,b取值的結(jié)果數(shù)據(jù)包
以β取0.6、a取2、b取0.8為例,約8%的數(shù)據(jù)包經(jīng)歷了拆分,不到一半的數(shù)據(jù)包經(jīng)歷了冗余處理,平均每次冗余跨1至2個(gè)區(qū)間,這樣的拆分和冗余處理是可以接受的,同時(shí)相似度也較高,達(dá)到了預(yù)期需求。表1中,β取值無明顯的影響;a的增大會減少拆分和冗余情況,但會降低相似度;b的增大會減少拆分,增加冗余,提高相似度;若不考慮權(quán)值因素(即表中最后一行)直接按照正常流量的分布比例計(jì)算概率,會導(dǎo)致更多的拆分和冗余出現(xiàn)。
本文分析了已有的Tor隱蔽方案和對應(yīng)的檢測算法;針對TCP連接層面的Tor流量特征提出了一種新的流量隱蔽思路;通過可控重連算法實(shí)現(xiàn)了對TCP連接時(shí)長的控制;研究了調(diào)整數(shù)據(jù)包大小使其符合正常流量數(shù)據(jù)包大小分布的方案;為流量隱蔽的研究提供了新方向。
在本文基礎(chǔ)上,未來可從以下兩個(gè)方向開展進(jìn)一步研究:(1) 高丟包率的網(wǎng)絡(luò)環(huán)境會影響TCP連接的數(shù)據(jù)通信和四次揮手,使連接時(shí)長超過預(yù)期。未來可以研究惡劣網(wǎng)絡(luò)環(huán)境的優(yōu)化重連算法,除了從重連協(xié)議的角度進(jìn)行設(shè)計(jì),也可以引入對歷史實(shí)際重連時(shí)長的統(tǒng)計(jì),計(jì)算重連計(jì)時(shí)的提前量。(2) 研究不同應(yīng)用在連接時(shí)長和數(shù)據(jù)包分布上的規(guī)律,設(shè)計(jì)能夠定制連接特征的可控重連算法。將優(yōu)化后的算法部署到海外云服務(wù)器上,加上基本的混淆功能,測試實(shí)際Tor流量和偽裝后流量的差別。