译者按:本文原文:medium.com/nextdns/how-we-made-dns-both-fast-and-private-with-ecs-4970d70401e5,作者:Olivier Poitrey。原文著作权归原作者所有,译者未经原作者授权译制,翻译仅供参考。对于用户擅自使用未授权的译文造成的法律风险,译者概不负责。
译文格式与原文保持一致,标「译注」的注释为译者所加。
本文采用 CC BY-SA 4.0 许可协议授权。
太长不看版:在本文中,我们描述了为什么公共 DNS[译注 1] 解析器需要 EDNS0 客户端子网[译注 2] (ECS) 来解决使用 DNS 将其客户端引导到附近服务器的流行服务的性能问题。然后我们将看到 ECS 可能存在隐私和 DNS 缓存效率问题。
之后,我们将描述我们从 ECS 中受益而不必遭受其缺点的方法:构建子网替换映射表和白名单。
在 NextDNS,我们努力使 DNS 既快速又私密。 定义快速 DNS 的一种简单方法是测量 DNS 服务器返回响应所需的时间,同时将网络延迟和服务器处理时间考虑在内。
终端用户请求的信息仅有 DNS 响应的情况非常罕见,最有可能的情况是 DNS 依赖于另一个更高级别的服务,如 HTTP[译注 3]。通常情况下,这些 HTTP 服务使用 DNS 将其流量引导到离其用户最近的位置,这种技术通常被称为 GeoDNS 或基于延迟的路由(取决于使用的数据源)。
DNS 流量控制的工作前提是 DNS 解析器由 ISP[译注 4] 提供,这样 DNS 解析器和用户就能位于同一网络中的附近位置。由于 ISP 的所有用户可能共享同一组 DNS 解析器缓存,因此 DNS 流量控制提供了一种相对有效的方法来将流量定向到最近的位置,而不会在 DNS 级别暴露太多用户隐私。
在过去的十年中,随着像 Google DNS 和 OpenDNS 这样的公共 DNS 解析器的普及,DNS 流量控制不再有效地为这些解析器的用户提供服务。即使这些解析器有更快的 DNS 响应时间,但这些解析器会让用户请求的域名使用不接近用户的 IP 地址进行响应,从而降低了 HTTP 请求的速度。由于 HTTP 延迟在总体加载时间中所占的比例比 DNS 大得多,因此这是一个糟糕的折衷方案。
为了解决此问题,EDNS0 客户端子网 (ECS) 应运而生。 DNS 协议的这一扩展为 DNS 解析器提供了一种方法,可以将有关请求域名的客户端 IP 地址的信息发布到权威 DNS 时不传输完整的客户端 IP,而改为仅传输其中的一部分,称为子网。
子网代表一个或多个共享相同前缀的 IP,前缀越小,子网中包含的 IP 地址越多。例如,CIDR[译注 5] 198.51.100.0/24 表示以 198.51.100.x 开头的 256 个 IP 地址,而 198.51.100.0/22 表示 198.51.100.0 到 198.51.103.255 之间的 1024 个 IP 地址。
权威 DNS(或称 auth[译注 6] DNS)是一种用于托管其拥有权限的域名区域的 DNS 服务器。它们的客户端通常是 DNS 缓存解析器,为运行存根解析器的终端客户端执行递归 DNS 查询。
在响应包含 ECS 信息的 DNS 查询时,权威 DNS 可以选择给出与子网所提供的子网前缀相等或更大范围的有效响应。这样,DNS 解析器就可以缓存更多客户机的响应,从而提高它们的 DNS 响应时间。可缓存响应前缀的大小称为作用域。如果范围为 0,则表示查询没有启用 ECS,因此可以在全局缓存。
实际上,99% 的 ECS 增强请求在 IPv4 中使用 /24
前缀,在 IPv6 中使用/56
前缀。 对于 IPv4,/24
仅有 256 个 IP。 这太窄了,可能会涉及到隐私问题。
如果可能的话,权威 DNS 应该以更大的范围进行回复以提高可缓存性,但我们检测后发现仅有 45% 的权威 DNS 支持 ECS ,而且为 IPv4 提供了 /24
范围或更小的非零范围回复。对于如此小的子网,缓存变得高度碎片化,DNS 解析器的平均缓存命中率将从大约 85% 降至仅 25%,而对于 /24
范围,平均缓存命中率接近 0%,大大降低了平均 DNS 解析时间。
由于这些原因,很少有 DNS 解析器部署 ECS。 在大多数情况下,只有像 Google DNS 和 OpenDNS 这样的公共解析器部署了它。
如今更新的、面向隐私的公共 DNS 解析器的趋势似乎是完全抛弃 ECS,比如 Cloudflare DNS 和 Quad9 就是这样选择的。他们的理由是,由于他们拥有那么多的请求位置,他们的 DNS 解析器中的缓存已经足够本地化,足以抵消没有 ECS 的影响。
如果 DNS 提供商的入网点[译注 7] (POP) 数量多于或等于具有相似位置的内容提供商所公开的 POP 的数量,则该说法可能是对的。在使用 Cloudflare 的情况下,这在大多数情况下可能是对的。
然而,一些大型内容提供商(比如 Netflix、Facebook 或者 Google)以及像 Akamai 一样的 CDN,都有直接托管在 ISP 网络中的服务器。如果解析器的 IP 地址或者通过 ECS 提供的子网是 ISP 的 IP 地址空间的一部分,那么他们的 DNS 只会引导客户端到那些 ISP 嵌入式服务器。因此公共 DNS 解析器需要 ECS 才能从这些服务器中受益。
ECS 的主要缺点是隐私性和 DNS 缓存碎片,这是由于查询和响应都使用了较窄的客户端子网导致的。我们可以通过将客户端的子网替换为另一个子网来解决这两个问题,这个子网由所有来自相同粗略位置并为相同 ISP 的客户端共享。
为了实现这一点,我们使用已聚合的 BGP 全表摘录来将所有 IP 地址块与其关联的 ASN 相关联。
简而言之,自治系统编号[译注 8] (ASN) 是归属于网络实体(比如 ISP)的 ID,用于在传播其路由策略时提取其网络资产(比如 IP 地址块)。
然后我们使用 GeoIP 数据库按国家划分区块。对于像美国这样的大国,我们进一步通过 Metro 代码进行分割。Metro 代码仍然很大,但本地化程度足以产生良好的结果。输出是一个 IP 地址块列表,映射到由 ASN:Country[:Metro Code]:
组成的密钥:
1 | 194.55.44.0 - 194.55.47.255: 12874:IT |
对于每个密钥,我们从所有共享相同密钥的 IP 地址块中随机挑选一个 /24
子网,并创建最终的映射表,用来定义如何用随机挑选的 /24
从相同的 ASN:Country[:Metro Code]
中替换一个 IP 块。
1 | 12874:IT: 2.224.0.0/24 |
然后,我们的解析器在运行时使用该地图,将客户端的 IP 地址映射到这些 /24
。
1 | 194.55.44.0 - 194.55.47.255: 2.224.0.0/24 |
多亏了这项技术,客户端子网不再泄漏,同一个 ISP 在同一粗略位置的所有客户端都能从相同的缓存空间中受益。我们注意到缓存命中率提高了约 10%,这比预期的要低,但这种方案在隐私和尾部延迟方面有很大的进步。
当我们分析结果的时候,我们发现支持 ECS 的前 100 万个域名(准确的说是 QNames[译注 9])中,超过 50% 的域名对不同位置的子网给出了相同的响应。似乎那些权威 DNS 勾选了 ECS 功能的复选框,但实际上并不需要它,迫使支持 ECS 的 DNS 解析器为每个客户子网存储相同结果的重复副本。我们还注意到,这些域名可能是响应较窄 ECS 范围的域名。
为了进一步提高缓存命中率,并避免向不使用 ECS 的域名发送任何形式的 ECS 信息以改善用户体验,我们决定生成一个白名单。这个白名单是从查询次数大于 10 次的域名中来选择产生的,这些域名需要在 3 个彼此相距较远的不同位置用 ECS 子网查询时满足以下特性:
- 显示 ECS 支持
- 给出一个非零 ECS 范围
- 为每个子网返回一组不同的 IP 地址
- 在不同区域 IP 地址之间返回 100 毫秒或更多的最大增量 RTT[译注 10],以证明它们托管在全球不同地区
有了这两个解决方案,我们的缓存命中率恢复到了 75%左右。
NextDNS 的一个鲜为人知的功能是能够获得任何查询的调试信息。这有点老旧[译注 11],因此 dig 分析器会有警告提示。为了使用这个功能,需要进行 CHAOS 查询而不是 IN 查询。NextDNS 用 IN 类的回答和 CH 类中的一些 TXT 调试字段来响应这种查询(只通过 TCP)。
1 | $ dig +tcp +nocomment chaos wikipedia.org @ecs-test.nextdns.io |
你可以看到 smart-ecs 的 TXT 记录显示了用于客户端 IP 的替代子网,它来自与客户端 IP 完全不同的子网,但来自同一个 ASN / Metro。这也意味着 facebook.com[译注 12] 在 ECS 白名单中。
现在,如果用另一个域名进行尝试:
1 | $ dig +tcp +nocomment chaos apple.com @ecs-test.nextdns.io |
我们可以看到,ECS 根本就没有发送。这意味着这个域名没有被列入白名单,因为它没有利用 ECS 信息来改善用户体验。
[译注 1] 全称域名系统(英语:Domain Name System)。
[译注 2] 原文是 EDNS0 Client Subnet。
[译注 3] 全称超文本传输协议(英语:HyperText Transfer Protocol)。
[译注 4] 全称互联网服务供应商(英语:Internet Service Provider)。
[译注 5] 全称无类别域间路由(英语:Classless Inter-Domain Routing)。参看 中文维基百科中对于 CIDR 的介绍。
[译注 6] 此处应该是前文「权威 DNS(authoritative DNS)」的缩写。
[译注 7] 原文是 Points of Presence。
[译注 8] 原文是 Autonomous System Number。
[译注 9] QNames 意为合法名,又译限定名,名称来自于英语:qualified name。参看 中文维基百科中对于「合法名」的介绍。
[译注 10] 全称往返通信时间(英语:Round-Trip Time)。
[译注 11] 原文是 “hacky”,既是 “hackneyed”(意为「陈腐」、「老套」)的变体,也是计算机圈子中一个非正式使用的名词,意为「(指计算机代码)对某一特定问题提供的笨拙或不雅的解决方案」。此处是双关。
[译注 12] 原文虽是如此,但上面的查询命令及返回结果中域名都是 wikipedia.org,不知是笔误还是其他原因。
评论加载中