绕过深度包检测:通过 TLS VPN 隧道传输流量

在某些国家,网络运营商采用深度包检测技术来阻止某些类型的流量。例如,虚拟专用网络 (VPN) 流量可以被分析和阻止,以防止用户通过此类网络发送加密数据包。
通过观察到 HTTPS 在世界各地都有效(为数量极其庞大的 Web 服务器配置),并且不容易被分析(有效载荷通常是加密的),我们认为可以以相同的方式组织 VPN 隧道:通过使用 TLS 或其旧版本 SSL 伪装 VPN 流量,我们可以构建可靠且安全的网络。通过此类隧道发送的数据包可以跨越多个域,这些域具有各种(严格和不太严格的)安全策略。尽管 SSH 可能会被用于构建此类网络,但我们有证据表明,在某些国家,通过此类隧道建立的连接会受到统计分析:如果此类隧道的网络利用率很高,存在突发流量,或者连接是长期存在的,那么底层的 TCP 连接会被网络运营商重置。
因此,在这里我们朝着这个方向进行实验性尝试:首先,我们描述互联网上存在的不同 VPN 解决方案;其次,我们描述了我们使用基于 Python 的软件和 Linux 进行的实验性尝试,该尝试允许用户使用 TLS 协议创建 VPN 隧道,并通过此类隧道传输小型办公室/家庭办公室 (SOHO) 流量。
I. 简介
虚拟专用网络 (VPN) 在现代至关重要。通过封装客户端流量并在受保护的隧道内发送,用户可以获得网络服务,否则这些服务将被网络运营商阻止。当访问公司内网时,VPN 解决方案也很有用。例如,公司员工可以通过建立 VPN 连接并将所有流量通过隧道定向到公司网络,以安全的方式访问内部网络。这样,他们可以获得从外部世界无法获得的服务。
II. 背景
有各种各样的解决方案可以用来构建 VPN。主机身份协议 (HIP) [7] 就是一个例子。HIP 是一种 3.5 层解决方案(实际上位于传输层和网络层之间),最初旨在分离 IP 地址的双重角色——标识符和定位符。例如,一家名为 Tempered Networks 的公司使用 HIP 协议来构建安全网络(示例见 [4])。
另一个解决方案是安全外壳协议 (SSH)。SSH 是一种应用层协议,它为不安全网络提供加密通道。SSH 最初旨在提供安全的远程命令行、登录和命令执行 [5]。但事实上,任何网络服务都可以通过 SSH 进行保护。此外,SSH 还提供了在空间上分隔的网络之间创建 VPN 隧道的方法。不幸的是,SSH 连接可能会被分析和阻止(如果它像 TLS 协议那样广泛传播,情况可能会有所不同)。
与 SSH 类似,OpenVPN [6] 运行在 TCP 协议之上(事实上,OpenVPN 也可以在 UDP 传输协议之上运行)。我们有证据表明,在某些国家,OpenVPN 已被政府成功阻止。当然,检测这些协议更加困难,因为流量被封装在 TCP/UDP 连接内部。这里,需要深度包检测解决方案才能有效地阻止此类隧道。
另一种广泛使用的用于构建 VPN 的 3 层协议是 IPSec 协议 [2]。IPSec 安全关联可以使用预共享密钥或使用互联网密钥交换协议(IKE 和 IKEv2)[1] 建立。由于 IPsec 直接运行在 IP 协议之上,因此无需使用复杂的包检测解决方案即可轻松检测到它。
III. 硬件、软件和架构
图 1 显示了架构的总体视图。请注意,我们假设 SOHO VPN 客户端盒是一个单独的 Linux 盒,不在路径上,并且位于内网内。
为了实现 VPN 客户端和服务器,我们使用了 Python 框架和 Ubuntu Linux 发行版。该实现大约包含 1.2K 行代码 (LOC),所有功能都在用户空间中实现。我们在我们的 git 存储库 [3] 中公开了该实现,以便每个人都可以免费使用它。
然而,在实验期间,我们考虑了以下设置。对于硬件,我们选择了 DigitalOcean 的微型实例。该实例具有单核 CPU、25 GB 数据存储、1GB 随机存取内存,并且位于美国纽约。VPN 客户端位于乌兹别克斯坦塔什干,并在 Raspberry PI 微控制器上运行。这样我们就模拟了 SOHO 路由器。我们还使用了 wget
工具来测量吞吐量,并使用了 ping
实用程序来测量往返时间。
IV. 实验评估
在我们的工作过程中,我们进行了多次实验。第一个实验与向 Google DNS 服务器发送 ping 消息并观察往返时间的差异有关(基本上,我们比较了存在隧道设置和不存在隧道设置之间的往返时间)。

接下来,我们坐下来测量本地机器和远程机器之间的吞吐量。基本上,我们对流量在隧道内传输的设置执行了 50 次测量,对流量正常传输(意味着未加密且未封装在 TLS 数据包中)的设置执行了相同次数的测量。为了测量吞吐量,我们使用了 wget
工具从互联网下载 Linux 内核文件1 (1.3MB)。
图 2 显示了往返时间 (RTT) 的分布。VPN 连接的平均 RTT 为 293.7 毫秒,普通 ICMP 的平均 RTT 为 103.3 毫秒。

图 3 显示了 TLS 保护隧道和常规 TCP 连接的吞吐量分布。VPN 连接的平均吞吐量值为 608.7 Kb/s,普通 TCP 连接的平均吞吐量值为 1890.4 Kb/s。鉴于这些结果,我们认为在这种情况下瓶颈在于我们的实现。但是,我们相信我们的 VPN 隧道实现对于大多数小型办公室设置来说已经足够好了。

V. 可能的扩展
尽管隧道已经不间断地运行了几个小时,并且我们已经实现了身份验证层,但我们仍然看到了来自外部世界的几次连接尝试,尽管未成功。对于未来,我们计划将 VPN 服务器隐藏在 Web 服务器后面,以便只有知道某个秘密的用户才能访问 VPN 服务器。这个想法很简单:当用户通过向秘密页面发送 HTTP GET 请求来敲门时,Web 服务器会打开一个端口并将来自客户端的流量重定向到 VPN 服务器。一旦连接建立,服务器就会关闭端口。
VI. 结论
在这份简短的报告中,我们试图描述网络运营商如何阻止 VPN 解决方案。我们认为,通过使用 TLS 协议掩盖隧道,VPN 流量仍然可以对观察者隐藏。我们的实验表明,当需要安全通道但网络运营商渴望阻止 VPN 流量时,这种方法很方便。
尽管很难通过这种解决方案开展业务(从长远来看,网络运营商可以简单地阻止属于企业托管的 VPN 服务器的所有 IP 地址),但我们认为,人们可以使用此软件并将其部署在他们自己的云机器上(他们可以对服务器的 IP 地址保密)。这样,网络运营商几乎不可能精确定位服务器的 IP 地址:(i)流量看起来像正常的 HTTPS 流量(最终使用默认 HTTPS 端口使用 SSL 隧道);(ii)对于网络运营商来说,扫描所有 IP 地址并找到那些用于发送 VPN 流量的地址是一项相当复杂的任务。
我们已将该软件发布在 GitHub 页面上供下载。我们希望这个项目能够使某些国家的互联网更加自由。
参考文献[1] 互联网密钥交换。 https://en.wikipedia.org/wiki/Internet_Key_Exchange
[2] IPSec。 https://en.wikipedia.org/wiki/IPsec
[3] SOHO VPN 客户端和服务器。 https://github.com/dmitriykuptsov/soho-vpn-over-tls/
[4] Tempered Networks 简化了安全网络连接和微隔离。 https://www.networkworld.com/article/3405853/tempered-networks-simplifies-secure-network-connectivity-and-microsegmentation.html
[5] D. J. Barrett, R. E. Silverman, and R. G. Byrnes. SSH,安全外壳:权威指南。O’Reilly Media, Inc., 2005
[6] M. Feilner. OpenVPN:构建和集成虚拟专用网络:学习如何使用这个强大的开源应用程序构建安全 VPN。Packt Publishing, 2006。
[7] A. Gurtov. 主机身份协议 (HIP):迈向安全的移动互联网。Wiley 通信网络与分布式系统系列。Wiley, 2008。
1https://mirrors.edge.kernel.org/pub/linux/kernel/v1.0/linux-1.0.tar.gz