有三種方法可以繞過(guò)這種檢測(cè):使用混淆(obfuscation)代理,使用 SSL 通道或者使用 SSH 通道。在本教程中,我們將討論最后一種方法。SSH 通道會(huì)將你已經(jīng)加密的鏈接封裝在另一層加密中,這樣防火墻就無(wú)法進(jìn)行識(shí)別。這種方法可以用在繞過(guò)部署有完備 DPI 和 SPI 防火墻的公司或像天朝這種具有重度審查機(jī)制的國(guó)家。
但基于 SSH 通道的 OpenVPN 也有幾個(gè)缺點(diǎn)。第一個(gè)就是雙重加密必然會(huì)導(dǎo)致效率的降低。其次是雖然 OpenVPN 的指紋不在會(huì)被防火墻檢出,但有些防火墻同樣也會(huì)屏蔽 SSH 流量。就像 Netflix(美國(guó)一家在線影片租賃提供商) 會(huì)禁止使用任何類(lèi)型加密代理的連接,無(wú)論是 OpenVPN、SSH 還是其他方式。在這種情況下,我們建議你使用混淆代理,其會(huì)使加密流量呈現(xiàn)出正常和未加密流量的樣子。混淆代理非常強(qiáng)大,但為此付出的代價(jià)是,混淆代理難以的配置和運(yùn)行。
不幸的是,據(jù)我所知,具有混淆功能的OpenVPN 只能工作在桌面端,而使用 SSH 通道則還可以用在安卓或 IOS 等移動(dòng)端。
本文假設(shè)你已經(jīng)擁有一臺(tái)配置好 OpenVPN 的服務(wù)器,并且能夠通過(guò) OpenVPN GUI 或者 APP 連接上服務(wù)器。同樣的你也能夠通過(guò) SSH 連接上服務(wù)器,無(wú)論是使用 Mac 的終端還是在 PC 上使用 PuTTy。本文會(huì)以 PuTTy 進(jìn)行演示。
通過(guò) SSH 配置 OpenVPN
打開(kāi) PuTTy 加載你的 VPN 服務(wù)器配置。在側(cè)欄中選擇 “Connection > SSH > Tunnels”,確保 D8080 包含在列表中。如果沒(méi)有,那么如下圖所示在 “Source port” 中輸入8080,并選擇 “Auto” 和 “Dynamic”,然后點(diǎn)擊添加(Add)按鈕。這樣你就有了一個(gè)運(yùn)行在 8080 端口的 SSH 代理了。如果你想保存設(shè)置,可以返回 “Session” 選項(xiàng)卡進(jìn)行保存。

點(diǎn)擊 “Open” 按鈕登錄到你的服務(wù)器,定位到 openvpn.conf 文件并使用如下命令檢查配置:
cd /etc/openvpn
cat openvpn.conf
這會(huì)顯示你 OpenVPN 服務(wù)器的配置文件,像如下內(nèi)容:
port 1194
proto tcp-server
dev tun1
ifconfig 10.4.0.1 10.4.0.2
status server-tcp.log
verb 3
secret ovpn.keyxxxxxxxxxx

最重要的事是,第二行設(shè)置為 TCP 而不是 UDP。如果你需要修改它,你可以使用以下命令:
sudo nano openvpn.conf
然后使用 CTRL+O (字母”o”不是數(shù)字零)保存文件,CTRL+X 退出編輯。
客戶(hù)端配置
在你的本地機(jī)器上,定位到 OpenVPN 客戶(hù)端的配置文件。如果你使用默認(rèn)的安裝目錄,那么應(yīng)該在 “C:/Program Files/OpenVPN/config”。
復(fù)制一份原先的配置文件當(dāng)備份,或者直接新建一個(gè)配置文件。使用記事本或者其他編輯器以管理員身份運(yùn)行,打開(kāi)或創(chuàng)建一個(gè)新的配置文件,如下所示:
proto tcp-client
remote localhost 1194
port 1194
dev tun1
secret ovpn.key
redirect-gateway def1
ifconfig 10.4.0.2 10.4.0.1
socks-proxy-retry
socks-proxy 127.0.0.1 8080
注意第二行的 “remote” 使用 localhost 而不是遠(yuǎn)程 OpenVPN 服務(wù)器的 IP 地址,然后在末尾增加兩行配置 OpenVPN 使用代理。其余的配置跟以前一樣。
將新的配置文件保存到 OpenVPN 的目錄下面。
配置應(yīng)用程序
最后一步就是配置你的應(yīng)用程序使用 8080 端口的代理了。這跟配置基本的 SSH 代理步驟一樣。許多應(yīng)用又可以設(shè)置代理,有些甚至能夠自動(dòng)檢測(cè)代理。如果你需要手動(dòng)進(jìn)行設(shè)置,下面三部分信息是你需要的:
Host: 127.0.0.1 Port: 8080 Proxy type: SOCKS5 (或者 SOCKS v5)
下面以 Firefox 和 Chrome 為例來(lái)說(shuō):
Firefox 中:
選擇 “選項(xiàng) > 高級(jí) > 網(wǎng)絡(luò) > 連接 > 設(shè)置 > 手動(dòng)設(shè)置代理” 設(shè)置 SOCKS 主機(jī)為 127.0.01 ,端口號(hào)設(shè)置為 8080 (或者你 PuTTy 里設(shè)置的端口號(hào)) 點(diǎn)擊確定保存
Chrome Proxy Switchy 中:
點(diǎn)擊圖標(biāo)進(jìn)入配置界面 隨便命名一個(gè)新的模式,然后在人工配置下面,設(shè)置SOCKS 主機(jī)為 127.0.01 ,端口號(hào)設(shè)置為 8080 (或者你 PuTTy 里設(shè)置的端口號(hào)) 點(diǎn)擊報(bào)錯(cuò),然后切換使用新建的模式
譯者注:Proxy Switchy已經(jīng)停止更新了,Chrome 下面可以使用 SwitchyOmega,還是跟上面一樣的配置。

現(xiàn)在使用 PuTTy 連接到你的服務(wù)器,然后使用新的配置文件運(yùn)行 VPN。這樣你就可以使用基于 SSH 通道的 OpenVPN 上網(wǎng)了。
移動(dòng)端
下面我們開(kāi)始講解如何在安卓上使用 OpenVPN+SSH,對(duì)于 IOS 端我們就不說(shuō)了大同小異。
在開(kāi)始前有幾個(gè)注意事項(xiàng)。首先,此方法僅適用于瀏覽 Web。這是因?yàn)椴幌褡烂娑耍诎沧炕?IOS 設(shè)備上你無(wú)法隨心所欲的打開(kāi)端口,這意味著其他 Apps 無(wú)法直接使用 SSH 代理。為了解決這個(gè)問(wèn)題,你可以選擇進(jìn)行 root 或越獄手機(jī),然后使用像 ProxyDroid 或 Cydia’s Unix apps 來(lái)配置代理。
本教程以在安卓上面運(yùn)行火狐瀏覽器為例,你需要安裝如下應(yīng)用:
OpenVPN for Android (注意不是OpenVPN Connect) ConnectBot 或者同樣的 SSH 終端應(yīng)用(JuiceSSH 挺不錯(cuò)的,但在轉(zhuǎn)發(fā)端口上需要額外的開(kāi)銷(xiāo)) 一個(gè)文件管理器,例如:File Commander Firefox 或者其他能夠配置代理的瀏覽器
你還需要一些可以將文件從電腦傳輸?shù)绞謾C(jī)上的方法,一根 USB 傳輸線是必須的,我會(huì)選擇使用 IBackup 的同步文件夾。
找到電腦上的 ovpn.key 和 .ovpn 配置文件,將它們上傳到手機(jī)上。同樣的還有服務(wù)器主機(jī)的 .pem 密鑰文件,這個(gè)文件應(yīng)該位于與 .ppk 文件相同的文件夾下,用于 PuTTy 認(rèn)證使用的。如果丟失了這個(gè)文件,你必須重新創(chuàng)建一個(gè)。
(可選)你也可以使用標(biāo)準(zhǔn)的 .ovpn 配置文件而不使用 SSH。這樣你所有的 Apps 都就可以使用 VPN 連接上網(wǎng),而不僅僅只限于瀏覽器,另外這樣也可以用來(lái)進(jìn)行排錯(cuò)。
配置ConnectBot
在手機(jī)上運(yùn)行 ConnectBot,點(diǎn)擊右上角的三個(gè)點(diǎn)進(jìn)行管理公鑰。再次點(diǎn)擊第二頁(yè)上面的點(diǎn),然后點(diǎn)擊導(dǎo)入,這樣應(yīng)該會(huì)啟動(dòng)你安裝的文件管理器。找到上傳的 .pem 文件并選擇它,這樣它應(yīng)該會(huì)在公鑰列表中出現(xiàn)并帶有一個(gè)紅色鎖的標(biāo)識(shí)。點(diǎn)擊讓其圖標(biāo)變綠,然后返回到 ConnectBot 主界面。

在底部的 ssh 終端中輸入你的 ssh 信息,像如下所示:
user@:22
將上面替換為為你的 OpenVPN 服務(wù)器地址和用戶(hù)名,然后點(diǎn)擊登錄按鈕使用 SSH 登錄到服務(wù)器。這一切步驟都會(huì)被保存,所以之后就無(wú)需在重復(fù)進(jìn)行,但以后你可能會(huì)需要再次更換公鑰。
一旦你成功連接,再次點(diǎn)擊右上角的三個(gè)點(diǎn)并斷開(kāi)連接。此時(shí)你的配置文件應(yīng)該已經(jīng)得以保存并顯示在 ConnectBot 的主頁(yè)上。長(zhǎng)按配置文件打開(kāi)菜單,在點(diǎn)擊”編輯端口轉(zhuǎn)發(fā)(Edit port forwards)”,然后在點(diǎn)擊那三個(gè)點(diǎn)選擇”增加端口轉(zhuǎn)發(fā)(Add port forward)”。按你的喜好隨意取個(gè)名字,隨后選擇類(lèi)型為動(dòng)態(tài)(SOCKS)端口為 8080,在點(diǎn)擊”創(chuàng)建端口轉(zhuǎn)發(fā)(create port forward)”。
這樣 ConnectBot 就配置好了,但我們還沒(méi)有創(chuàng)建連接,讓我們來(lái)先配置好 OpenVPN 吧。
配置OpenVPN for Android
運(yùn)行 OpenVPN for Android。點(diǎn)擊右上角帶有向下箭頭的方形按鈕進(jìn)行導(dǎo)入配置。找到你的 .ovpn 配置文件并選中它。

這時(shí),在找到你的 ovpn.key 文件并選中,再點(diǎn)擊右下角黃色的保存按鈕。
這樣你的新配置文件就應(yīng)該出現(xiàn)在 App 的首頁(yè)上了。
在連接前,讓我們?cè)跈z查下服務(wù)器的防火墻,在用戶(hù)配置中贈(zèng)加自定義的 TCP 規(guī)則,允許端口 22,1194和8080。
現(xiàn)在是時(shí)候開(kāi)始連接了。首先打開(kāi) ConnectBot,選擇我們剛才創(chuàng)建的 SSH 連接上服務(wù)器,確保公鑰已經(jīng)加載,不然會(huì)提示密碼錯(cuò)誤。在成功連接上后,切換到 OpenVPN App 選擇你的配置文件進(jìn)行連接。

當(dāng)你連接上后,OpenVPN 日志末尾應(yīng)該會(huì)顯示為“CONNECTED,SUCCESS”。
請(qǐng)注意,因?yàn)槲覀兪褂昧送娔X相同的 .pem 和 .key 文件,在同一時(shí)刻內(nèi)你只能使用一臺(tái)設(shè)備進(jìn)行登錄。當(dāng)你想在移動(dòng)端進(jìn)行連接時(shí),請(qǐng)確保電腦沒(méi)有進(jìn)行連接。如果你想同時(shí)連接多臺(tái)設(shè)備,你需要為每一臺(tái)設(shè)備生成新的憑證(.key 和 .pem)。
配置 Firefox 使用代理
最后,我們需要配置 Firefox 使用代理。移動(dòng)端的 Chrome 和 Safari 瀏覽器沒(méi)有配置代理選項(xiàng),這也是為什么我們推薦使用 Firefox。你可以在 wi-fi 環(huán)境下設(shè)置代理,但當(dāng)你不再需要使用代理的時(shí)候要來(lái)回進(jìn)行切換。

在 Firefox 的地址欄中,輸入 “about:config”,然后在搜索欄中輸入 “network.proxy”,這樣我們就可以進(jìn)行設(shè)置代理了,在相應(yīng)的位置輸入以下配置:
network.proxy.socks: 127.0.0.1 network.proxy.socks_port: 8080 (或者你 PuTTy 里設(shè)置的端口號(hào)) network.proxy.type: 1
這樣你的 Firefox 流量就會(huì)通過(guò) OpenVPN 和 SSH 了,你也可以隨心所欲的使用 VPN 進(jìn)行上網(wǎng)而不用在擔(dān)心深度包檢測(cè)了。
如果你只想通過(guò) SSH 代理而不使用 OpenVPN 進(jìn)行上網(wǎng),只需要使用 ConnectBot SSH 登錄服務(wù)器,同時(shí)不連接 OpenVPN 即可。同樣的,如果你只想使用 OpenVPN 而不使用 SSH,則可以只導(dǎo)入基本的 .ovpn 配置文件使用 OpenVPN 進(jìn)行連接,而不使用 SSH 通道。