科學上網入門,基本原理與方案

這次給大家分享一下自己平時『科學上網』的一些經驗,主要為了:

  1. 理解 GFW 的工作原理,從而引出相關對策
  2. 分享一些解決方案,常用工具等等

 

入門

一個簡單的問題,當你拿到一台普通電腦,此時怎麼快速翻牆

我會這樣做:

  1. 打開 github.com/getlantern
  2. 找到『藍燈最新版本下載』,進入下載,安裝即可。
  3. 開始 Google,查找更多工具……

註:GitHub 的 releases 的是託管在 Amazon S3上的,網速受到 GFW 的干擾,截止 2019.04.28 可以看到藍燈直接把下載文件存在了 GitHub 倉庫裡面,這樣網速會快一些,因為 github.com 的域名平時基本上都是沒有受到 GFW 干擾的。

有了 Lantern,你就可以訪問 Google 了,接下來就可以查閱更多被牆住的資料,進而尋找更好的翻牆方案。後面的部分我們等講完 GFW 原理再說~

GFW 原理

因為 GFW 的內部工作原理是不公開的,我自己也不是專業研究 GFW 的,所以這一部分所以只是帶領大家初步了解一下,可能不會特別深入,甚至有些許小錯誤,如果發現錯誤,希望大家諒解並及時幫忙指正,謝謝!

基礎知識

下面的內容受啟發於前端經典面試題:『從瀏覽器輸入 URL 之後,會發生什麼?』

DNS

當你在瀏覽器中輸入 www.baidu.com 時,瀏覽器並不能直接根據這串字元確定目標主機的地址。baidu.com 被稱為域名(domain),我們要真正訪問到域名下的資源,需要首先進行域名解析,這就需要用到 DNS(域名解析系統),獲取到伺服器的 IP 地址之後再向 IP 發送請求。我們可以把 DNS 簡單地理解為域名到 IP 的映射。

比如我在 Windows 下,可以使用自帶的 nslookup 命令進行 DNS 查詢:

 

C:\Users\Doraeming>nslookup www.hit.edu.cn
Server:  UnKnown
Address:  192.168.1.1

Name:    www.hit.edu.cn
Address:  61.167.60.70

前兩行顯示的是 DNS 伺服器的域名和 IP 地址,後兩行顯示的是要查詢的域名和查詢結果。

DNS 更深入的內容這裡不再詳細展開,推薦大家閱讀 Computer Networking: A Top-Down Approach。

HTTP & HTTPS

HTTP (Hypertext Transfer Protocol) 中文叫做超文本傳輸協議,從下圖中可以看到,在平時所用的 TCP/IP 模型和 OSI 參考模型中都位於最上層,是離我們日常使用最近的協議啦。大家看一下最下層的物理層,那是最接近硬體的一層了,那裡有大家常常聽說的乙太網的協議。

tcp-and-osi-model

每台主機有許多埠可以提供用來套接字服務,埠號在 [1, 65535] 之間。
基礎知識:HTTP 的周知埠號是 80,HTTPS 的周知埠號是 443。本地主機的迴環測試 IP 地址為 127.0.0.1(或者 0.0.0.0),DNS 服務的周知埠號是 53。1024 以下的埠號是系統埠號,在 Linux 中開啟需要 root 許可權。

由於 HTTP 的傳輸報文是明文,所以非常不安全,人門於是將 SSL(TLS) 和 HTTP 結合,在 HTTP 進入 TCP 報文段之前,先經過 SSL 對 HTTP 報文進行加密這就產生了 HTTPS。關於 HTTPS 的具體認證過程推薦大家看一下阮一峰老師的博文

溫馨提示:大家在訪問網站的時候一定要盡量用 https,推薦使用 Firefox、Chrome 這種現代化的瀏覽器,使用 IE 瀏覽器上網簡直就是在裸奔,IE 在安全性和 JS 新特性支持上都表現的很差勁,如今很多前端項目也逐漸放棄了對舊版本 IE 的支持,如 GitHub 上最火的前端項目 Bootstrap 等等。國內的瀏覽器也不可信,一方面可能不得不配合參與 GFW 的自我審查,我之前遇到過即使翻牆在 360 瀏覽器中還是無法訪問 Google 的情況,另一方面有諸如紅芯瀏覽器這種無良商家,不建議使用。相反 Firefox 和 Chrome 的插件系統會讓用它的人愛不釋手,開發者也不得不依賴於 Chrome 的 dev-tools。

DNS 污染(DNS 欺騙)

DNS 污染(DNS Spoofing)又稱為域名伺服器緩存污染,英文為 DNS Cache Poisoning。

由於全球只有 13 個頂級域名伺服器,所以為了避免單點故障、減少查詢壓力等等會有各級緩存。如果你使用的是國外的 DNS 伺服器,比如 Google 的 8.8.8.8,DNS 查詢需要經過國際出口。GFW 會通過技術手段偽造 DNS 的查詢結果,這樣你查詢到的 IP 地址並非域名的真實地址,也就會訪問失敗。

測試 DNS 是否被污染最佳工具是 China Firewall Test

DNS 劫持

DNS 劫持和 DNS 污染是不同的,國內很多的 ISP(Internet Service Provider,中國移動、中國電信、中國聯通等等)會故意修改自己 DNS 伺服器上的記錄,把某些敏感網站的記錄修改成錯誤的 IP 地址。

IP 黑名單

顧名思義,在你請求某個 IP 地址時,如果其恰好在 GFW 的 IP 黑名單上,GFW 會屏蔽這些報文,導致無法正常訪問。大家可能經常會聽翻牆的朋友這樣說:『我那個伺服器的 IP 被 GFW 被屏蔽了,我不得不換一台伺服器來重新搭建 VPN 服務端。』親身體驗過 IP 被屏蔽會發現那是一件很難受的事情,自己親手構築的一切在瞬間就化為了烏有。

測試 IP 是否被牆的最佳工具是站長工具 Ping 檢測

敏感詞過濾

GFW 會維護一個敏感詞列表,經常更新。如果你訪問的網頁中存在敏感辭彙,GFW 也會屏蔽。我們可以通過 Wireshark 抓包來測試,這裡不再詳細展開。

科學上網常用方式

主要是 hosts 和代理兩種方案。

關於代理的分類,引用一段如何翻牆? | 編程隨想的博客的文字:

按照是否加密,代理軟體可分為加密代理和不加密代理2種(這不是廢話嘛:)。為了避開 GFW 敏感詞過濾,咱必須得使用加密代理軟體。

按照協議類型,常見的有 HTTP 代理和 SOCKS 代理。如果你純粹用瀏覽器翻牆,HTTP 代理就夠用了;如果你還需要讓其它軟體(比如MSN)翻牆,那就得用SOCKS代理。

修改 hosts 文件

對於 DNS 污染,我們可以通過 hosts 解決,hosts 的原理是直接在本地指定域名的 IP 地址,跳過 DNS 查詢,不同的操作系統及其 hosts 文件目錄如下:

  • Mac OS X, iOS, Android, Linux: /etc/hosts
  • Windows: %SystemRoot%\system32\drivers\etc\hosts

在 GitHub 上有一些比較好的 hosts,長期維護:

項目地址 項目簡介
https://github.com/googlehosts/hosts 用來訪問 Google
https://github.com/StevenBlack/hosts 禁用廣告等等網站,對 hosts 中的域名直接返回本地 IP

hosts 文件中的條目大概長這樣:

Format of hosts

在這裡在向大家推薦一款安卓端的軟體 一鍵 Go Host,對於安卓特別友好,可以一鍵翻牆,不過前提是需要獲取 root 許可權,這個對大家難度應該不大,推薦在 xda 中搜索相關教程。

安卓軟體『一鍵 Go Hosts』

安卓軟體『一鍵 Go Hosts』

hosts 翻牆的缺點是很明顯的:

  1. 一些不常用的網站可能不在 hosts 中,就無法訪問。
  2. hosts 經常失效,因此 hosts 文件本身需要頻繁更新,這對於效率要求較高的人來說是一個很麻煩的事。不過我們可以自己寫一個腳本,在開機的時候自動從伺服器拉取最新 hosts。
  3. 對於 IP 黑名單無能為力。

雖然 hosts 有諸多缺點,不過對於普通訪問 Google 的需求,hosts 是完全能夠滿足的,比如在安卓端,能用 hosts 就盡量不要再用其他 VPN,VPN 在我手機裡面是最耗電的應用了,沒有之一,不過這也與一直開著有關:

使用 SSR 用電量高達 85%

使用 SSR 用電量高達 85%

第三方工具

Lantern, etc.

藍燈(Lantern)雖然網速不算太好,但確實是最老牌的【免費】翻牆軟體了,支持的平台廣泛,穩定性相對較高(除了在兩會等特殊階段無法使用),一鍵安裝,對新手極其友好。同類的免費軟體有很多,這裡只簡短地列舉幾個(付費的就不考慮啦),大家要懂得『舉一反三』,善用搜索工具。

軟體名稱 推薦度 獲取方式
Lantern ⭐️ ⭐️ GitHub 主頁
XX-Net ⭐️ ⭐️ GitHub 主頁
VPN Gate(需翻牆) ⭐️ ⭐️ 網站主頁
賽風(需翻牆) ⭐️ 發送郵件給 [email protected]

Tor, etc.

Tor 全稱為 The Onion Router(洋蔥路由器),主要的目的是為了保護用戶的隱私,有助於在你上網時,幫你隱匿自己的真實公網 IP,用戶可透過 Tor 接達由全球志願者免費提供的出口節點,當然自己也可以作為志願節點做貢獻,翻牆只是它的副作用。Tor 的功能特彆強大,但同時因為這款軟體主要是為了安全性考慮的,面向的用戶也比較高端,不推薦新手使用。我曾經在服務端部署 Shadowsocks 的時候使用 proxychains 作為 Shadowsocks 的前置代理,這樣可以讓訪問的網站無法得知我的伺服器 IP 地址,是一個很能保護隱私的配置,但實際測試網速是比較慢的,網速慢算是 Tor 最大的缺點了。如果我們要在本地電腦上使用的話,需要下載 Tor Browser(基於開源的 Firefox 開發),配置好 meek 流量混淆插件,就可以使用啦,推薦大家看這篇文章(需翻牆),網速的話確實比較慢,在安全和網速之間,魚和熊掌不可兼得。類似的安全類軟體還有 I2P。

註:獲取方法為發送郵件給 [email protected]

自行搭建代理

對於真正的軟體開發者,自行搭建代理才是王道,其他的要麼穩定性差,要麼網速慢,等等。自行搭建的前提都是需要有一台『伺服器』(Server),在網上搜索 VPS 可以得到很多提供商,個人推薦的有:

  1. vultr
  2. 搬瓦工

溫馨提示:我之前用的 vultr,後來因為時斷時續(哈工大校園網),現已棄用。具體情況推薦自行測試。

Nginx、Node.js 反向代理

反向代理的基本原理是利用中繼伺服器(沒有被牆)訪問得到原始網站的信息之後,返回結果給客戶端。優點是客戶端拿到鏡像網址即可,訪問的行為與原網址一模一樣,缺點是無法實現登錄等複雜操作。

我自己在 GitHub 上創建了一個小的項目,主頁在 github.com/upupming/Mirror , 分為 0.0.1 和 0.0.2 兩個版本(兩個分支),前者是分享的 Nginx 反向代理搭建教程和 nginx.conf 配置,後者直接使用 now.sh 提供的服務(無需自建伺服器,是【免費】的)來託管一個 Koa 服務端,這個服務端可以實現對單個域名的反向代理,通過腳本批量代理可以代理很多子域名。

由於 now.sh 也是託管在 AWS 的 lambda 上的,受 GFW 影響速度比較慢,所以只適合於平時沒有翻牆但是想快速訪問 Google 的情況。

推薦大家即刻體驗:https://google.upupming.site,如需了解更多,請訪問 https://mirror.upupming.site

now.sh 類似

除了 now.sh 可以用來搭建反向代理,其他可以用來託管 Node.js、PHP 或者其他服務端應用的平台也是可以的,不過大家在託管之前一定要詳細閱讀 ToS(服務條款),因為有些服務提供商是明確禁止搭建代理伺服器的,比如在 heroku 上搭建 Shadowsocks 被 heroku 封號

  • Google Firebase Functions
  • 000webhost
  • netlify
  • heroku

Shadowsocks & V2Ray

Shadowsocks 項目由 clowwindy 發起,最初只是他自己個人用來翻牆的,後來才越做越大。這所有的歷史都記錄在了JadaGates/ShadowsocksBio。SS 是至今為止最穩定、用戶數最多的翻牆軟體了,不管最初選擇如何,似乎大家最終的選擇都會傾向於它。

大家進入 Shadowsocks (簡稱為 SS) 會發現項目被刪除了,其實只是展示的 rm 分支罷了(應該當時為了應對特殊情況才這樣做的),把分支切換成 master 就好了,Shadowsocks 至今仍在維護,並且 Linux 各大軟體包管理器也可以直接安裝,Windows、Linux、macOS、Android 和 iOS 等等全都支持。

Shadowsocks 的搭建推薦使用腳本即可,請閱讀 https://shadowsocks.be/ (需翻牆),由於網上的教程很多,這裡不再重複介紹,請大家善用搜索。遇到問題及時翻閱 GitHub 上的 Wiki 頁面

v2ray 是新興的代理軟體,發展迅猛,可以看這篇文章。搭建過程比 SS 複雜,但不算太難,但是需要有一些基礎知識,與搭建 Nginx 反向代理的難度相差不大,推薦大家直接查閱官方文檔。

對於剛入門計算機的同學,推薦先看這篇文章,可以先使用一些小型服務提供商的代理服務。

更高級的一些操作還有中繼,可以使用國內伺服器作為中繼節點,連接國外的伺服器達到更快的速度。

代理模式設置

大家在代理過程中經常遇到一些小問題,這裡稍作解釋。

在開啟 Shadowsocks 之後,可以選擇代理方式:

ss-mode

這三種模式其實影響的是系統中的『Internet 選項』或者『代理設置』(Windows 10):

Windows Internet Options

其他軟體看到系統中的配置後,會遵循其中定義的代理地址,比如這裡是 127.0.0.1(本地迴環地址)的 1080 埠(SOCKS 代理默認埠),就會把請求發送到這個埠。

但是對於終端,特別是 Linux 下無時無刻不會用到的的 bash 和 Widows 的 cmd、PowerShell,它們是不會認這個系統設置的,我們必須為終端的每條命令單獨配置代理,常用的有:

  1. git
  2. curl

對於一些命令自身實現不了的(比如 npm install),我們可以用 tsocks 和 proxychains 來實現,限於篇幅,這裡就不再介紹啦。

另外推薦 Chrome 的插件 SwitchyOmega,配置過程參見官方 Wiki,它能讓 Chrome 忽略系統的代理設置,直接走軟體本身的配置,在軟體內部加一個 gfwlist,每次遇到新的被牆的網站還可以自行添加域名,比較方便,推薦使用。

溫馨推薦:如果使用 Linux 的話,推薦看一下我的配置教程(gist 需翻牆)。

路由器代理

路由器代理可以解決一些終端命令無法配置代理的情況(比如 Firebase CLI),這樣即使本地電腦電腦上不配置任何代理,只要通過路由器聯網了,就能翻牆。

路由器代理可以參見:

  1. 極路由:https://github.com/qiwihui/hiwifi-ss
  2. 刷【梅林固件】,再安裝 Shadowsocks 插件,自行搜索相關教程即可

說到路由器代理,不得不向大家推薦 SSTap,可以在本地創建虛擬網卡,達到路由器級別的代理,而且可以開機自啟。

翻牆之後值得推薦的網站

  1. Google 域名內搜索 – 精準獲取想要的信息Google search in site
  2. StartPage,更尊重隱私的 「Google」
  3. 中文維基百科,更尊重事實的百科全書
  4. medium,最優質的英文博客平台
  5. Quora,知乎之父
  6. …,更多精彩待你探索~

總結

這篇文章主要對 GFW 的原理進行了粗淺的分析,同時給出了理論上、實踐上的一些對策,希望能夠給你帶來些許幫助,特別是剛上大學不知道該怎麼有效獲取信息的同學~