1. 程式人生 > >談談國外網路干擾那些事

談談國外網路干擾那些事

極致的應用體驗應該是每個應用都應該追求的,競品間的體驗差距應該都是體現在細節方面,如在差網路下的視訊載入速度,載入大量圖片列表時的流暢度,而網路,則是這些體驗的前提,如果網路不通,連資料都沒有辦法載入,這對於產品來說,是致命的,這很有可能導致辛辛苦苦運營積累的使用者的流失。對於在海外運營的產品來說,網路問題甚是重要,海外國家的網路封鎖很嚴重,產品總是莫名會被封鎖掉,你都不知道封鎖的手段是什麼。查到使用者封鎖的手段後,你又得想應對的策略。

本文主要總結下工作中由遇到的常見的客戶端網路干擾手段,並提供一些常見問題的解決思路。

目前,遇到的網路干擾(封禁)主要有以下幾種手段:

  • DNS 劫持(汙染);
  • 域名 封禁;
  • IP 封禁;
  • 基於深度包檢測技術的封禁;

1 DNS劫持(汙染)

DNS劫持(汙染)是指一些刻意製造或無意中製造出來的域名伺服器資料包,把域名指向不正確的IP地址(或運營商自己的IP地址),如把某應用的域名解析為:127.0.0.1的本地地址。

對應的解決辦法只有自己去做 DNS的解析,基於這一點可以變化出幾種策略:

  • 自建DNS解析伺服器,應用內的dns解析請求都發到自己伺服器去處理;
  • 應用內維持一份域名跟對應伺服器IP的對映,定時更新客戶端保持的域名跟IP的配置;
  • 直接通過IP訪問(這基本不現實);

在具體的實踐過程中,可以根據應用的特點,將這幾種策略進行組合,在不同的場景下選擇不同的策略,如發現伺服器訪問不了時,先採用配置裡的Ip進行訪問等等;

2 域名封禁

域名封禁是指封鎖掉某個應用伺服器的訪問,一般是通過檢視http請求頭裡的 host欄位是否是要封禁的域名; 還有一種方式運營商把所有的域名都解析到自己的機房裡,然後在自有機房去通過某種策略來決定是否讓這個請求繼續(我們檢視的資料就是域名被解析到某運營商的網段去了,但同個域名下有的請求可能是成功的,有的請求卻失敗了);

應對方式:域名封禁的話,就只能通過換域名的方式來解決了;

3 IP 封禁

IP封禁是指訪問某個伺服器的請求沒有辦法正常獲得響應; 不管是 HTTP(s)請求還是TCP(UDP)請求都需要有一個目標地址(IP),當運營商檢測到目標地址是需要封禁時,可以直接讓請求超時或者沒有辦法獲得響應等;

應用方式:目前基本上是使用代理(中介)或者換伺服器的方式來應對;
代理:
-對於HTTP請求來說,可以部署下新的nginx 伺服器,把請求接收後再轉發到真正的機房去處理;
-對於TCP(UDP)來說,就是網路包裡的目標地址是代理伺服器的地址,而真正的伺服器的地址則放在body裡,代理伺服器在接收到包後,解析出body後,把資料包路由轉發到真正的處理伺服器上;

4 基於深度包檢測技術的封禁

深度包檢測 主要是通過檢測資料包中的資料部分的特殊來匹配特定協議或某種應用的特徵,然後決定是否可以路由到其他地方,深度包檢測一般是針對TCP(UDP)這種,下面的討論也是針對TCP在進行的;

由於深度包檢測技術它是根據應用的資料特徵來決定是否封禁,這個封禁沒有絕對可行的應對處理方式,因為不同國家不同運營商可能識別出的特徵是不一樣的; 從應用開發者角度來說,只能是先探測出它是根據哪些識別出來的特徵來封禁,探測出後則可以針對性的進行修改;

應用方式:通過各種手段將應用的特徵遮蔽掉,下面舉幾個常用的手段:

4.1 http偽裝

傳統的tcp的資料包的格式是固定的,一般前面 40位元組是首部,剩下的就是內容資料了,深度包檢測一般是檢測內容資料的,根據內容資料生成一個特徵,根據這個特徵來決定是否要封禁這個資料包的。而http偽裝則是傳統的資料包的前面再加個http的頭部欄位,這些欄位是由應用自己根據http頭的結構將http的內容填充進去的(直接將內容放到body頭裡也可以),由於是自己偽裝出來的http頭,因此可以任意填充任何的host等各種http頭,運營商的深度包檢測會認為為是一個傳統的Http請求,而繞過它的檢測系統了,

正常情況下的 tcp資料包是這樣的:
+++++++++++++++++++++++++++++++++
|40位元組的tcp/ip首部    |       tcp的內容      |
+++++++++++++++++++++++++++++++++

而加了Http偽裝的資料包結構則是:

+++++++++++++++++++++++++++++++++++++++++++++++
|40位元組的tcp/ip首部  |  偽裝的http首部  |  tcp的內容             |
+++++++++++++++++++++++++++++++++++++++++++++++

http偽裝可以把真正的資料放到http的body欄位裡,也可以把內容放在http的後面,這個可以自己根據的需要去選擇組合。

而採用http偽裝的缺點就是會加大你的流量消耗,因為填充了額外的資料;

4.2 加密&隨機化

儘可能將自己的內容加密傳輸,最好是可以支援動態變換加密演算法

如果有其他更多更好的方式,麻煩小夥伴分享下哈。

參考