在租用的 VPN 服务器上,谁能看到你的流量?
租用 VPN 服务器把信任转移给了托管服务商。沿着从客户端到出口的路径走一遍,看看每个观察者能知道什么、不能知道什么。
租用服务器改变的是你信任谁,而不是取消这个问题。隧道让你的流量对那些它穿过的网络不可见,随后再把明文交给一台由他人虚拟机监控程序运行的机器。从客户端向外追踪数据包,可以看到每个观察者站在什么位置,以及他们各自实际能看到什么。这段旅程比任何关于匿名的说法都更有用。
从客户端开始,跟着数据包往外走
在任何东西离开笔记本之前,客户端会封装数据包,并将其发往服务器的公网端点。你的本地网络和运营商看到的是一条通往该地址和端口的流,带有一定的体积和节奏。他们看不到的是你打开了哪个网站,因为那个目的地就藏在加密载荷之中。元数据与内容的界线,就是这整段旅程的一句话概括。
这第一跳正是大多数营销说辞不再有趣的地方。同一 Wi-Fi 上的邻居看到的和运营商一样,而两者都看不到页面。不过体积和时序仍然可见,即使载荷不暴露内容,它们也在描述行为。
托管网络看到的是隧道,而不是页面
在服务商的网络内部,加密流先到达交换机,再到达虚拟网卡,最后到达你的虚拟机。任何运营这张网络的人都能在不持有任何密钥的情况下统计字节并保留流记录,而且这并不需要密钥。这正是托管服务商所处的位置。
在出口方向上,画面变了。虚拟机会向目的地发起新连接,因此托管网络可以看到那个目的地址以及周围的 TLS 握手。载荷仍然由应用自身的加密保护,元数据则不然。
| Observer | Visible to it | Hidden from it |
|---|---|---|
| Local network | Tunnel endpoint, volume, timing | Destination and payload |
| Your ISP | The same flow metadata | Destination and payload |
| Hosting network | Tunnel flow, exit destination, TLS handshake | HTTPS payload |
| Hypervisor operator | Guest memory and virtual NIC, in principle | Nothing, if it chooses to look |
按顺序读这些行,问题的形状就出现了:每一行都比上一行看到更多,而它们都不需要破解 VPN 就能做到这一点。
在虚拟机内部,隧道终止,明文开始
隧道的终点在你的虚拟机上,因此客户机在任何重新加密之前就能看到内层数据包。这不是缺陷;自托管出口本来就是这样。它确实意味着出口的安全性取决于谁管理这台客户机,而在这个账户上,管理员就是你。
wg show
ss -tunp | head
nft list ruleset | head -40
在服务器上运行这些命令,你检查的就是在客户机上拥有 root 权限的运营者能够检查的同一批套接字。你运行的服务所记录的一切都处在同一条信任边界之内,这就是为什么客户机的日志设置与基础设施记录是两个独立的问题,而不是一个开关。
虚拟机监控程序位于客户机之下
虚拟机并不拥有它所运行的内核。虚拟机监控程序会映射它的内存和虚拟网卡,因此处于那一层的运营者超出了客户机的审计能力。客户机隔离是真实的,值得在租户之间依赖它,但它并不是「特权访问不可能发生」的承诺。这种不对称值得被直白地说出来,而不是藏在「隔离」这个词后面。
专用物理服务器改变了这种安排,却不会移除网络、物理接触或服务商提供的管理接口。去读产品文档写了什么,而不是让一个词来决定访问权限的问题。
把这段旅程变成一次信任决策
把每个观察者以及你授予它的能力写下来,然后判断这份授予是否适合你打算发送的流量。名单很短:你的本地网络、你的运营商、托管网络、虚拟机监控程序运营者,以及你自己。其他任何一方都是其中某一家的分包商,继承同样的能力。提前决定,比事后才发现这份名单要便宜。
然后去核实你真正能检查的部分:你自己的服务写了哪些日志、保留多久,以及服务商对流记录和留存公开了什么。能读、能测的政策,胜过对「私有」这类词含义的假设。