寫給非專業人士看的 Shadowsocks 簡介

這個文章來源於一個朋友在科學上網的過程中,搞不清楚 Shadowsocks 的配置問題,在這裡我想按照我對 Shadowsocks 的理解簡單整理一下,以便一些非專業人士也能瞭解

在很久很久以前,我們訪問各種網站都是簡單而直接的,用戶的請求通過互聯網發送到服務提供方,服務提供方直接將資訊回饋給使用者

然後有一天,GFW 就出現了,他像一個收過路費的強盜一樣夾在了在使用者和服務之間,每當使用者需要獲取資訊,都經過了 GFW,GFW將它不喜歡的內容統統過濾掉,於是客戶當觸發 GFW 的過濾規則的時候,就會收到 Connection Reset 這樣的響應內容,而無法接收到正常的內容

ssh tunnel

聰明的人們想到了利用境外伺服器代理的方法來繞過 GFW 的過濾,其中包含了各種HTTP代理服務、Socks服務、VPN服務… 其中以 ssh tunnel 的方法比較有代表性

1) 首先用戶和境外伺服器基於 ssh 建立起一條加密的通道 2-3) 用戶通過建立起的隧道進行代理,通過 ssh server 向真實的服務發起請求 4-5) 服務通過 ssh server,再通過創建好的隧道返回給用戶

由於 ssh 本身就是基於 RSA 加密技術,所以 GFW 無法從資料傳輸的過程中的加密資料內容進行關鍵字分析,避免了被重置連結的問題,但由於創建隧道和資料傳輸的過程中,ssh 本身的特徵是明顯的,所以 GFW 一度通過分析連接的特徵進行干擾,導致 ssh 存在被定向進行干擾的問題

shadowsocks

於是 clowwindy 同學分享並開源了他的解決方案

簡單理解的話,shadowsocks 是將原來 ssh 創建的 Socks5 協議拆開成 server 端和 client 端,所以下面這個原理圖基本上和利用 ssh tunnel 大致類似

1、6) 用戶端發出的請求基於 Socks5 協定跟 ss-local 端進行通訊,由於這個 ss-local 一般是本機或路由器或局域網的其他機器,不經過 GFW,所以解決了上面被 GFW 通過特徵分析進行干擾的問題 2、5) ss-local 和 ss-server 兩端通過多種可選的加密方法進行通訊,經過 GFW 的時候是常規的TCP包,沒有明顯的特徵碼而且 GFW 也無法對通訊資料進行解密 3、4) ss-server 將收到的加密資料進行解密,還原原來的請求,再發送到使用者需要訪問的服務,獲取回應原路返回