傳統防火墻會根據目標 IP 地址和端口號來屏蔽連接,但更高級的防火墻會使用深度包檢測(DPI)技術或者狀態包檢測(SPI)技術來識別不同類型的加密算法和VPN協議。這就意味著它們能夠檢測出OpenVPN流量并將其標識出來,以方便管理員決定是否屏蔽目標服務器。
有三種方法可以繞過這種檢測:使用混淆(obfuscation)代理,使用 SSL 通道或者使用 SSH 通道。在本教程中,我們將討論最后一種方法。SSH 通道會將你已經加密的鏈接封裝在另一層加密中,這樣防火墻就無法進行識別。這種方法可以用在繞過部署有完備 DPI 和 SPI 防火墻的公司或像天朝這種具有重度審查機制的國家。
但基于 SSH 通道的 OpenVPN 也有幾個缺點。第一個就是雙重加密必然會導致效率的降低。其次是雖然 OpenVPN 的指紋不在會被防火墻檢出,但有些防火墻同樣也會屏蔽 SSH 流量。就像 Netflix(美國一家在線影片租賃提供商) 會禁止使用任何類型加密代理的連接,無論是 OpenVPN、SSH 還是其他方式。在這種情況下,我們建議你使用混淆代理,其會使加密流量呈現出正常和未加密流量的樣子。混淆代理非常強大,但為此付出的代價是,混淆代理難以的配置和運行。
但不幸的是,據我所知,具有混淆功能的OpenVPN 只能工作在桌面端,而使用 SSH 通道則還可以用在安卓或 IOS 等移動端。
本文假設你已經擁有一臺配置好OpenVPN的服務器,并且能夠通過 OpenVPN GUI 或者 APP 連接上服務器。同樣的你也能夠通過 SSH 連接上服務器,無論是使用 Mac 的終端還是在 PC 上使用 PuTTy。本文會以 PuTTy 進行演示。
通過SSH配置OpenVPN
打開 PuTTy 加載你的 VPN 服務器配置。在側欄中選擇 “Connection >SSH >Tunnels”,確保 D8080 包含在列表中。如果沒有,那么如下圖所示在 “Source port” 中輸入8080,并選擇 “Auto” 和 “Dynamic”,然后點擊添加(Add)按鈕。這樣你就有了一個運行在 8080 端口的 SSH 代理了。如果你想保存設置,可以返回 “Session” 選項卡進行保存。
點擊 “Open” 按鈕登錄到你的服務器,定位到 openvpn.conf 文件并使用如下命令檢查配置:
cd /etc/openvpn
cat openvpn.conf
這會顯示你 OpenVPN 服務器的配置文件,像如下內容:
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
最重要的事是,第二行設置為 TCP 而不是 UDP。如果你需要修改它,你可以使用以下命令:
sudo nano openvpn.conf
然后使用 CTRL+O (字母”o”不是數字零)保存文件,CTRL+X 退出編輯。
客戶端配置
在你的本地機器上,定位到 OpenVPN 客戶端的配置文件。如果你使用默認的安裝目錄,那么應該在 “C:/Program Files/OpenVPN/config”。
復制一份原先的配置文件當備份,或者直接新建一個配置文件。使用記事本或者其他編輯器以管理員身份運行,打開或創建一個新的配置文件,如下所示:
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 而不是遠程 OpenVPN 服務器的 IP 地址,然后在末尾增加兩行配置 OpenVPN 使用代理。其余的配置跟以前一樣。
將新的配置文件保存到 OpenVPN 的目錄下面。
配置應用程序
最后一步就是配置你的應用程序使用 8080 端口的代理了。這跟配置基本的 SSH 代理步驟一樣。許多應用又可以設置代理,有些甚至能夠自動檢測代理。如果你需要手動進行設置,下面三部分信息是你需要的:
Host: 127.0.0.1
Port: 8080
Proxy type: SOCKS5 (或者 SOCKS v5)
下面以 Firefox 和 Chrome 為例來說:
Firefox 中:
選擇 “選項 >高級 >網絡 >連接 >設置 >手動設置代理”
設置 SOCKS 主機為 127.0.01 ,端口號設置為 8080 (或者你 PuTTy 里設置的端口號)
點擊確定保存
Chrome Proxy Switchy 中:
點擊圖標進入配置界面
隨便命名一個新的模式,然后在人工配置下面,設置SOCKS 主機為 127.0.01 ,端口號設置為 8080 (或者你 PuTTy 里設置的端口號)
點擊報錯,然后切換使用新建的模式
譯者注:Proxy Switchy已經停止更新了,Chrome 下面可以使用 SwitchyOmega,還是跟上面一樣的配置。
現在使用 PuTTy 連接到你的服務器,然后使用新的配置文件運行 VPN。這樣你就可以使用基于 SSH 通道的 OpenVPN 上網了。
移動端
下面我們開始講解如何在安卓上使用 OpenVPN+SSH,對于 IOS 端我們就不說了大同小異。
在開始前有幾個注意事項。首先,此方法僅適用于瀏覽 Web。這是因為不像桌面端,在安卓或 IOS 設備上你無法隨心所欲的打開端口,這意味著其他 Apps 無法直接使用 SSH 代理。為了解決這個問題,你可以選擇進行 root 或越獄手機,然后使用像 ProxyDroid 或 Cydia’s Unix apps 來配置代理。
本教程以在安卓上面運行火狐瀏覽器為例,你需要安裝如下應用:
OpenVPN for Android (注意不是OpenVPN Connect)
ConnectBot 或者同樣的 SSH 終端應用(JuiceSSH 挺不錯的,但在轉發端口上需要額外的開銷)
一個文件管理器,例如:File Commander
Firefox 或者其他能夠配置代理的瀏覽器
你還需要一些可以將文件從電腦傳輸到手機上的方法,一根 USB 傳輸線是必須的,我會選擇使用 IBackup 的同步文件夾。
找到電腦上的 ovpn.key 和 .ovpn 配置文件,將它們上傳到手機上。同樣的還有服務器主機的 .pem 密鑰文件,這個文件應該位于與 .ppk 文件相同的文件夾下,用于 PuTTy 認證使用的。如果丟失了這個文件,你必須重新創建一個。
(可選)你也可以使用標準的 .ovpn 配置文件而不使用 SSH。這樣你所有的 Apps 都就可以使用 VPN 連接上網,而不僅僅只限于瀏覽器,另外這樣也可以用來進行排錯。
配置ConnectBot
在手機上運行 ConnectBot,點擊右上角的三個點進行管理公鑰。再次點擊第二頁上面的點,然后點擊導入,這樣應該會啟動你安裝的文件管理器。找到上傳的 .pem 文件并選擇它,這樣它應該會在公鑰列表中出現并帶有一個紅色鎖的標識。點擊讓其圖標變綠,然后返回到 ConnectBot 主界面。
在底部的 ssh 終端中輸入你的 ssh 信息,像如下所示:
user@:22
將上面替換為為你的 OpenVPN 服務器地址和用戶名,然后點擊登錄按鈕使用 SSH 登錄到服務器。這一切步驟都會被保存,所以之后就無需在重復進行,但以后你可能會需要再次更換公鑰。
一旦你成功連接,再次點擊右上角的三個點并斷開連接。此時你的配置文件應該已經得以保存并顯示在 ConnectBot 的主頁上。長按配置文件打開菜單,在點擊”編輯端口轉發(Edit port forwards)”,然后在點擊那三個點選擇”增加端口轉發(Add port forward)”。按你的喜好隨意取個名字,隨后選擇類型為動態(SOCKS)端口為 8080,在點擊”創建端口轉發(create port forward)”。
這樣 ConnectBot 就配置好了,但我們還沒有創建連接,讓我們來先配置好 OpenVPN 吧。
配置OpenVPN for Android
運行 OpenVPN for Android。點擊右上角帶有向下箭頭的方形按鈕進行導入配置。找到你的 .ovpn 配置文件并選中它。
這時,在找到你的 ovpn.key 文件并選中,再點擊右下角黃色的保存按鈕。
這樣你的新配置文件就應該出現在 App 的首頁上了。
在連接前,讓我們在檢查下服務器的防火墻,在用戶配置中贈加自定義的 TCP 規則,允許端口 22,1194和8080。
現在是時候開始連接了。首先打開 ConnectBot,選擇我們剛才創建的 SSH 連接上服務器,確保公鑰已經加載,不然會提示密碼錯誤。在成功連接上后,切換到 OpenVPN App 選擇你的配置文件進行連接。
當你連接上后,OpenVPN 日志末尾應該會顯示為“CONNECTED,SUCCESS”。
請注意,因為我們使用了同電腦相同的 .pem 和 .key 文件,在同一時刻內你只能使用一臺設備進行登錄。當你想在移動端進行連接時,請確保電腦沒有進行連接。如果你想同時連接多臺設備,你需要為每一臺設備生成新的憑證(.key 和 .pem)。
配置 Firefox 使用代理
最后,我們需要配置 Firefox 使用代理。移動端的 Chrome 和 Safari 瀏覽器沒有配置代理選項,這也是為什么我們推薦使用 Firefox。你可以在 wi-fi 環境下設置代理,但當你不再需要使用代理的時候要來回進行切換。
在 Firefox 的地址欄中,輸入 “about:config”,然后在搜索欄中輸入 “network.proxy”,這樣我們就可以進行設置代理了,在相應的位置輸入以下配置:
network.proxy.socks: 127.0.0.1
network.proxy.socks_port: 8080 (或者你 PuTTy 里設置的端口號)
network.proxy.type: 1
這樣你的 Firefox 流量就會通過 OpenVPN 和 SSH 了,你也可以隨心所欲的使用 VPN 進行上網而不用在擔心深度包檢測了。
如果你只想通過 SSH 代理而不使用 OpenVPN 進行上網,只需要使用 ConnectBot SSH 登錄服務器,同時不連接 OpenVPN 即可。同樣的,如果你只想使用 OpenVPN 而不使用 SSH,則可以只導入基本的 .ovpn 配置文件使用 OpenVPN 進行連接,而不使用 SSH 通道。