傳統(tǒng)防火墻會(huì)根據(jù)目標(biāo) IP 地址和端口號(hào)來屏蔽連接,但更高級(jí)的防火墻會(huì)使用深度包檢測(cè)(DPI)技術(shù)或者狀態(tài)包檢測(cè)(SPI)技術(shù)來識(shí)別不同類型的加密算法和VPN協(xié)議。這就意味著它們能夠檢測(cè)出OpenVPN流量并將其標(biāo)識(shí)出來,以方便管理員決定是否屏蔽目標(biāo)服務(wù)器。
有三種方法可以繞過這種檢測(cè):使用混淆(obfuscation)代理,使用 SSL 通道或者使用 SSH 通道。在本教程中,我們將討論最后一種方法。SSH 通道會(huì)將你已經(jīng)加密的鏈接封裝在另一層加密中,這樣防火墻就無法進(jìn)行識(shí)別。這種方法可以用在繞過部署有完備 DPI 和 SPI 防火墻的公司或像天朝這種具有重度審查機(jī)制的國(guó)家。
但基于 SSH 通道的 OpenVPN 也有幾個(gè)缺點(diǎn)。第一個(gè)就是雙重加密必然會(huì)導(dǎo)致效率的降低。其次是雖然 OpenVPN 的指紋不在會(huì)被防火墻檢出,但有些防火墻同樣也會(huì)屏蔽 SSH 流量。就像 Netflix(美國(guó)一家在線影片租賃提供商) 會(huì)禁止使用任何類型加密代理的連接,無論是 OpenVPN、SSH 還是其他方式。在這種情況下,我們建議你使用混淆代理,其會(huì)使加密流量呈現(xiàn)出正常和未加密流量的樣子。混淆代理非常強(qiáng)大,但為此付出的代價(jià)是,混淆代理難以的配置和運(yùn)行。
但不幸的是,據(jù)我所知,具有混淆功能的OpenVPN 只能工作在桌面端,而使用 SSH 通道則還可以用在安卓或 IOS 等移動(dòng)端。
本文假設(shè)你已經(jīng)擁有一臺(tái)配置好OpenVPN的服務(wù)器,并且能夠通過 OpenVPN GUI 或者 APP 連接上服務(wù)器。同樣的你也能夠通過 SSH 連接上服務(wù)器,無論是使用 Mac 的終端還是在 PC 上使用 PuTTy。本文會(huì)以 PuTTy 進(jìn)行演示。
通過SSH配置OpenVPN
打開 PuTTy 加載你的 VPN 服務(wù)器配置。在側(cè)欄中選擇 “Connection >SSH >Tunnels”,確保 D8080 包含在列表中。如果沒有,那么如下圖所示在 “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 退出編輯。
客戶端配置
在你的本地機(jī)器上,定位到 OpenVPN 客戶端的配置文件。如果你使用默認(rèn)的安裝目錄,那么應(yīng)該在 “C:/Program Files/OpenVPN/config”。
復(fù)制一份原先的配置文件當(dāng)備份,或者直接新建一個(gè)配置文件。使用記事本或者其他編輯器以管理員身份運(yùn)行,打開或創(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 為例來說:
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)端
下面我們開始講解如何在安卓上使用 OpenVPN+SSH,對(duì)于 IOS 端我們就不說了大同小異。
在開始前有幾個(gè)注意事項(xiàng)。首先,此方法僅適用于瀏覽 Web。這是因?yàn)椴幌褡烂娑?,在安卓?IOS 設(shè)備上你無法隨心所欲的打開端口,這意味著其他 Apps 無法直接使用 SSH 代理。為了解決這個(gè)問題,你可以選擇進(jìn)行 root 或越獄手機(jī),然后使用像 ProxyDroid 或 Cydia’s Unix apps 來配置代理。
本教程以在安卓上面運(yùn)行火狐瀏覽器為例,你需要安裝如下應(yīng)用:
OpenVPN for Android (注意不是OpenVPN Connect)
ConnectBot 或者同樣的 SSH 終端應(yīng)用(JuiceSSH 挺不錯(cuò)的,但在轉(zhuǎn)發(fā)端口上需要額外的開銷)
一個(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),而不僅僅只限于瀏覽器,另外這樣也可以用來進(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ù)器地址和用戶名,然后點(diǎn)擊登錄按鈕使用 SSH 登錄到服務(wù)器。這一切步驟都會(huì)被保存,所以之后就無需在重復(fù)進(jìn)行,但以后你可能會(huì)需要再次更換公鑰。
一旦你成功連接,再次點(diǎn)擊右上角的三個(gè)點(diǎn)并斷開連接。此時(shí)你的配置文件應(yīng)該已經(jīng)得以保存并顯示在 ConnectBot 的主頁(yè)上。長(zhǎng)按配置文件打開菜單,在點(diǎn)擊”編輯端口轉(zhuǎn)發(fā)(Edit port forwards)”,然后在點(diǎn)擊那三個(gè)點(diǎn)選擇”增加端口轉(zhuǎn)發(fā)(Add port forward)”。按你的喜好隨意取個(gè)名字,隨后選擇類型為動(dòng)態(tài)(SOCKS)端口為 8080,在點(diǎn)擊”創(chuàng)建端口轉(zhuǎn)發(fā)(create port forward)”。
這樣 ConnectBot 就配置好了,但我們還沒有創(chuàng)建連接,讓我們來先配置好 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ù)器的防火墻,在用戶配置中贈(zèng)加自定義的 TCP 規(guī)則,允許端口 22,1194和8080。
現(xiàn)在是時(shí)候開始連接了。首先打開 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)確保電腦沒有進(jìn)行連接。如果你想同時(shí)連接多臺(tái)設(shè)備,你需要為每一臺(tái)設(shè)備生成新的憑證(.key 和 .pem)。
配置 Firefox 使用代理
最后,我們需要配置 Firefox 使用代理。移動(dòng)端的 Chrome 和 Safari 瀏覽器沒有配置代理選項(xiàng),這也是為什么我們推薦使用 Firefox。你可以在 wi-fi 環(huán)境下設(shè)置代理,但當(dāng)你不再需要使用代理的時(shí)候要來回進(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ì)通過 OpenVPN 和 SSH 了,你也可以隨心所欲的使用 VPN 進(jìn)行上網(wǎng)而不用在擔(dān)心深度包檢測(cè)了。
如果你只想通過 SSH 代理而不使用 OpenVPN 進(jìn)行上網(wǎng),只需要使用 ConnectBot SSH 登錄服務(wù)器,同時(shí)不連接 OpenVPN 即可。同樣的,如果你只想使用 OpenVPN 而不使用 SSH,則可以只導(dǎo)入基本的 .ovpn 配置文件使用 OpenVPN 進(jìn)行連接,而不使用 SSH 通道。