2021-10-01 | 翻译 | UNLOCK

译作 | 我们如何使用 ECS 功能来让 DNS 既快速又私密

译者按:本文原文: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 或基于延迟的路由(取决于使用的数据源)。

translate-article-how-we-made-dns-both-fast-and-private-with-ecs-1

DNS 流量控制的工作前提是 DNS 解析器由 ISP[译注 4] 提供,这样 DNS 解析器和用户就能位于同一网络中的附近位置。由于 ISP 的所有用户可能共享同一组 DNS 解析器缓存,因此 DNS 流量控制提供了一种相对有效的方法来将流量定向到最近的位置,而不会在 DNS 级别暴露太多用户隐私。

在过去的十年中,随着像 Google DNS 和 OpenDNS 这样的公共 DNS 解析器的普及,DNS 流量控制不再有效地为这些解析器的用户提供服务。即使这些解析器有更快的 DNS 响应时间,但这些解析器会让用户请求的域名使用不接近用户的 IP 地址进行响应,从而降低了 HTTP 请求的速度。由于 HTTP 延迟在总体加载时间中所占的比例比 DNS 大得多,因此这是一个糟糕的折衷方案。

translate-article-how-we-made-dns-both-fast-and-private-with-ecs-2

为了解决此问题,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
2
3
4
5
194.55.44.0 - 194.55.47.255: 12874:IT
194.55.48.0 - 194.55.63.255: 20570:DE
194.55.64.0 - 194.55.79.255: 3320:DE
194.55.80.0 - 194.55.83.255: 48095:US:618
194.55.84.0 - 194.85.47.255: 12874:IT

对于每个密钥,我们从所有共享相同密钥的 IP 地址块中随机挑选一个 /24 子网,并创建最终的映射表,用来定义如何用随机挑选的 /24 从相同的 ASN:Country[:Metro Code] 中替换一个 IP 块。

1
2
3
4
12874:IT: 2.224.0.0/24
20570:DE: 91.207.93.0/24
3320:DE: 2.160.0.0/24
48095:US:618: 94.176.172.0/24

然后,我们的解析器在运行时使用该地图,将客户端的 IP 地址映射到这些 /24

1
2
3
4
5
194.55.44.0 - 194.55.47.255: 2.224.0.0/24
194.55.48.0 - 194.55.63.255: 91.207.93.0/24
194.55.64.0 - 194.55.79.255: 2.160.0.0/24
194.55.80.0 - 194.55.83.255: 94.176.172.0/24
194.55.84.0 - 194.85.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
2
3
4
5
6
7
8
9
10
11
12
13
$ dig +tcp +nocomment chaos wikipedia.org @ecs-test.nextdns.io
;; Warning: Message parser reports malformed message packet.; <<>> DiG 9.11.3-1ubuntu1.8-Ubuntu <<>> +tcp +nocomment chaos wikipedia.org @dns.nextdns.io
;; global options: +cmd
;wikipedia.org. CH A
wikipedia.org. 600 IN A 198.35.26.96
proto.nextdns.io. 0 CH TXT "TCP"
client.nextdns.io. 0 CH TXT "67.164.100.157"
conf.nextdns.io. 0 CH TXT "default"
smart-ecs.nextdns.io. 0 CH TXT "23.24.192.0/24"
;; Query time: 123 msec
;; SERVER: 2a07:a8c0::65:849d#53(45.90.28.0)
;; WHEN: Tue Aug 20 21:55:42 PDT 2019
;; MSG SIZE rcvd: 229

你可以看到 smart-ecs 的 TXT 记录显示了用于客户端 IP 的替代子网,它来自与客户端 IP 完全不同的子网,但来自同一个 ASN / Metro。这也意味着 facebook.com[译注 12] 在 ECS 白名单中。

translate-article-how-we-made-dns-both-fast-and-private-with-ecs-3

现在,如果用另一个域名进行尝试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ dig +tcp +nocomment chaos apple.com @ecs-test.nextdns.io
;; Warning: Message parser reports malformed message packet.; <<>> DiG 9.11.3-1ubuntu1.8-Ubuntu <<>> +tcp +nocomment chaos apple.com @dns.nextdns.io
;; global options: +cmd
;apple.com. CH A
apple.com. 2545 IN A 17.172.224.47
apple.com. 2545 IN A 17.178.96.59
apple.com. 2545 IN A 17.142.160.59
proto.nextdns.io. 0 CH TXT "TCP"
client.nextdns.io. 0 CH TXT "67.164.100.175"
conf.nextdns.io. 0 CH TXT "default"
smart-ecs.nextdns.io. 0 CH TXT "not sent"
;; Query time: 73 msec
;; SERVER: 2a07:a8c0::65:849d#53(45.90.28.0)
;; WHEN: Tue Aug 20 21:56:36 PDT 2019
;; MSG SIZE rcvd: 265

我们可以看到,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,不知是笔误还是其他原因。

评论加载中