你启用了 Encrypted Client Hello,打开一个网站,连接正常工作。有人问是否还需要 VPN,诚实的回答是:这两个功能向不同的对象隐藏了不同的东西。ECH 保护 TLS 握手中那些原本可能泄露你所请求的服务器名的部分。VPN 把你的流量放进一条隧道,隧道终止在运营商的出口节点。把两者混为一谈,结果要么是为已有的保护多付钱,要么是相信自己拥有从未有过的保护。

没有 ECH 时,握手暴露了什么

TLS 连接以 ClientHello 开始,在较旧的形式中,目标服务器名以明文在其中传输。任何处于能够观察握手的位置的人,从网络运营商到路径上的被动探测设备,都能读到这个名字,尽管之后的应用数据是加密的。目的地址同样可见,因此这个名字往往是确认性信息,而不是唯一线索。

这正是 ECH 针对的具体泄露。它是一条狭窄的泄露,收窄它值得做,但这与隐藏你的流量去往何处并不是一回事。

ECH 实际改变了什么

在客户端与服务器都支持且配置到位的情况下,ECH 用服务器公布的密钥加密一个内层 ClientHello,于是观察者看到的是一个不携带真实服务器名的外层握手。流量仍然去往同一个地址、同样的时间、大致相同的体量。时序与大小依然可观察,而目的 IP 从来就不在 ECH 加密的范围内。

支持也并非普遍。并非每个客户端、每项服务或每次单独连接都使用 ECH,你也不能从一把锁的图标或从改过 VPN 国家这一点推断它的存在。要诊断它,需要看握手,而不是看浏览器的装饰。

VPN 改变的是另一件事

VPN 把被覆盖的流量放进隧道送到出口节点,于是离你最近的观察者看到的是通往 VPN 的连接,而不是通往目的地的连接。这改变了谁能观察到什么,也改变了目的地看到的地址。它并不加密应用本身尚未加密的东西,也不向 VPN 运营商隐藏这条连接——运营商按构造就位于路径之上。

两者自然组合:应用可以使用 TLS 和 ECH,而隧道保护其周围的网络段。它们都不决定每一方能看到或保留什么,因为各方在路径上处于不同位置。

DNS 处在什么位置

未受保护的 DNS 查询会把名字暴露给解析器,也暴露给任何观察该路径的人,这是独立于 TLS 握手的另一种暴露。ECH 不加密 DNS,而 VPN 只有在你同时把查询送进隧道或使用加密解析器时,才改变解析器的身份。人们启用了三者之一,就以为另外两个也跟上了。

把解析器路径与握手路径分开检查。它们各自独立失效,而且配置在不同的地方。

如何判断你在看哪一层

问一问:这次观察能揭示什么。如果问题是请求了哪个服务器名,那么握手和解析器就是相关层次。如果问题是流量去了哪个网络、途中谁能看到它,那就是隧道。如果问题是哪个账户在网站上做了什么,那么两者都帮不上忙,因为网站仍然会收到请求,以及你提供的任何身份。

在排查兼容性时,保持证书校验和 DNS 策略原样不动。为了让一次测试通过而关掉某项检查,改变的是结果的含义,而不是显示 ECH 保护了什么。

在增加一层之前,先写下你实际启用了哪一层。这里的大部分困惑都来自一个假设:单一控制同时覆盖了一次请求、它的名字、它的目的地和它的身份。

相关文章