從2017開始,登錄steam就變成了一個時靈時不靈的玄學問題,我之前發了一篇關於Steam登錄不了的原理文章,但是由於我沒有考慮最新的SNI阻斷攻擊,所以刪除了前一篇文章,重新組織一下介紹一下其中的技術原理。
起初,GFW通過DNS汙染以及HTTP報文關鍵字檢測來攔截訪問Steam社區內容。
關鍵字檢測又被稱為被動網絡過濾器,其原理是通過檢測互聯網報文中的IP和內容信息,當發現關鍵IP時,介入該連接中,偽裝成連接一方向另一方發送reset數據包,即TCP重置攻擊,從而斷開連接。
DNS是域名解析服務,因為以steam為例,當我們訪問steamcommunity.com時,我們會向DNS服務器請求這個域名對應的IP地址,從而連接到steam服務器。
DNS汙染是指用戶訪問地址時,需要先向DNS服務器請求域名解析,攻擊者服務器偽裝成DNS服務器,向用戶發回錯誤的IP地址。這種汙染主要通過篡改遞歸DNS服務器上的緩存內容實現,因為DNS協議本身不檢查IP是否正確,容易遭到攻擊,瀏覽器訪問會出現
ERR_CONNECTION_TIMED_OUT錯誤,因為DNS會被指向一個不可訪問的地址,訪問也就超時了。解決方法也不難,需要在本地就做好域名解析,通過修改Hosts文件直連steam的IP訪問。
但是這不是結束,2018年開始,Steam社區默認採用HTTPS鏈接(即安全加密連接),所有的瀏覽內容都會被加密,報文關鍵字檢測的方法也就失效了。隨後出現了更深層次的審查方法,也就是要詳細介紹的SNI檢測阻斷。
TLS,又名安全傳輸層,它的前身是SSL,它實現了將報文加密後再交由TCP進行傳輸的功能,即HTTP + TLS = HTTPS,現在幾乎所有的網站都是以HTTPS來保護連接安全。正常情況下,TLS握手在Client Hello階段,由於雙方還未協商好加密方式,報文仍然是明文狀態,其中Extension字段包含了SNI信息,也就包含了當前正在訪問的域名steamcommunity.com,可以抓包獲取到。正常情況下,服務端根據這個域名發送相應的域名證書,進行接下來的握手步驟,在協商完後開始使用加密通信。
但是,SNI已經暴漏,審查機構會對當中的域名進行檢測和阻斷,也就是最開始關鍵字檢測提到的TCP重置攻擊,通過對雙方發送RST報文使連接重置,如果是瀏覽器訪問就會出現ERR_CONNECTION_RESET錯誤。
現如今SNI阻斷是最常用的牆的方法,Steam和Github都是被這種方法阻斷的,解決這類問題有兩種比較常用的方法,第一個是本地反向代理,第二個是虛擬專用網。
本地反向代理技術,是將Steam社區等域名添加到Hosts文件中並指向localhost,這裡的localhost僅做為一個本地安全跳板,供Nginx(HTTP反向代理工具)正常監聽的同時又能防止流量外洩。Nginx將監聽到的數據中的SNI信息去除(從而規避過濾),再送向CDN的IP,使用IP而不使用域名是為了防止DNS汙染,既實現完整通信又不被DNS汙染和SNI阻斷終止。
虛擬專用網技術,即大家耳熟能詳的Virtual Private Network(未批恩),可以把它形象地理解成一個管道,它的作用是在公有網絡中構建專用的虛擬網絡,連接雙方在管道地兩端進行通信,從而規避檢查,大家常用的小黑盒加速器就是使用了虛擬專用網。
最後,很感謝昨天一位大佬指出SNI的錯誤,我一開始把SNI阻斷歸到了關鍵字檢測裡,但是其實這兩種技術不完全相同,我一直以來就認為小黑盒是一個非常開放而包容的社區,大家不僅一起交流遊戲的樂趣,還分享生活樂趣,交流知識,我也希望以後可以給大家帶來更多網絡安全和密碼學的分享,如果還有錯誤希望有大佬指出