由于近期 Cloudflare 开始了大规模的 ECH 部署,我们收到了不少关于 ECH 功能的问询,此文将说明 ECH 功能与 Surge 的相容性。
请注意本文讲解的是 ECH(Encrypted Client Hello),而非 ECN(Explicit Congestion Notification)。
什么是 ECH?
与先前的 ESNI 类似,是一种新型的用于加密 TLS 握手中明文 SNI 字段的技术,用于隐私保护。阻止链路上的服务商了解用户正在访问的网站。
它是怎样实现加密的?
具体的逻辑比较复杂,简而言之,从 HTTPS RR (HTTPS Resource Records,DNS SVCB) 中获得公钥并用以加密 TLS ClientHello 消息。
如果 DNS 请求暴露,那么 ECH 就毫无意义,所以使用 ECH 的前提是使用了 DoH。
和 Surge 间有什么关系吗?
该功能的目的与 Surge 的工作原理相冲突,因为 Surge 确实需要获知目标域名以进行规则判定。当 ECH 与 DoH 完整工作时,将使得 Surge 无法获取到主机名/域名,只能获得目标 IP 地址。
如果想在使用 Surge 时同时使用 ECH,该怎样做?
首先先明确声明,除非你有特别的需要,我们严重不推荐进行这样的配置,这会使得 Surge 的大量功能失效,还有可能出现 CDN 分配问题导致部分网站访问速度下降。
关闭 Surge 的代理模式,仅使用增强模式(VIF)接管。对于 Surge iOS,即开启兼容模式中的 VIF Only 选项。
这是因为目前所有浏览器均不支持在代理模式下使用 DNS-over-HTTPS (DoH),而 DoH 是 ECH 的前提。
打开浏览器设置,开启 DNS-over-HTTPS (DoH) 选项并配置为 Cloudflare。已确认 Chrome 与 Firefox 的最新正式版本中已默认开启 ECH 支持。
访问 https://crypto.cloudflare.com/cdn-cgi/trace 确认其中的 sni 字段为 encrypted 即表示 ECH 握手成功。
此时打开 Surge Dashboard 可看到,浏览器所发出的请求均直接使用了 IP 地址而非域名。所有域名规则均无法被正确匹配。