如何在SSH通道中隐藏OpenVPN流量?
2016-05-16 09:56:00 来源:来源:FreeBuf 评论:0 点击:
传统防火墙会根据目标 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/openvpncat openvpn.conf
这会显示你 OpenVPN 服务器的配置文件,像如下内容:
port 1194proto tcp-serverdev tun1ifconfig 10.4.0.1 10.4.0.2status server-tcp.logverb 3secret ovpn.keyxxxxxxxxxx
最重要的事是,第二行设置为 TCP 而不是 UDP。如果你需要修改它,你可以使用以下命令:
sudo nano openvpn.conf
然后使用 CTRL+O (字母”o”不是数字零)保存文件,CTRL+X 退出编辑。
客户端配置
在你的本地机器上,定位到 OpenVPN 客户端的配置文件。如果你使用默认的安装目录,那么应该在 “C:/Program Files/OpenVPN/config”。
复制一份原先的配置文件当备份,或者直接新建一个配置文件。使用记事本或者其他编辑器以管理员身份运行,打开或创建一个新的配置文件,如下所示:
proto tcp-clientremote localhost 1194port 1194dev tun1secret ovpn.keyredirect-gateway def1ifconfig 10.4.0.2 10.4.0.1socks-proxy-retrysocks-proxy 127.0.0.1 8080
注意第二行的 “remote” 使用 localhost 而不是远程 OpenVPN 服务器的 IP 地址,然后在末尾增加两行配置 OpenVPN 使用代理。其余的配置跟以前一样。
将新的配置文件保存到 OpenVPN 的目录下面。
配置应用程序
最后一步就是配置你的应用程序使用 8080 端口的代理了。这跟配置基本的 SSH 代理步骤一样。许多应用又可以设置代理,有些甚至能够自动检测代理。如果你需要手动进行设置,下面三部分信息是你需要的:
Host: 127.0.0.1Port: 8080Proxy 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@
将上面替换为为你的 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.1network.proxy.socks_port: 8080 (或者你 PuTTy 里设置的端口号)network.proxy.type: 1
这样你的 Firefox 流量就会通过 OpenVPN 和 SSH 了,你也可以随心所欲的使用 VPN 进行上网而不用在担心深度包检测了。
如果你只想通过 SSH 代理而不使用 OpenVPN 进行上网,只需要使用 ConnectBot SSH 登录服务器,同时不连接 OpenVPN 即可。同样的,如果你只想使用 OpenVPN 而不使用 SSH,则可以只导入基本的 .ovpn 配置文件使用 OpenVPN 进行连接,而不使用 SSH 通道。
【编辑推荐】