Checking DNS ECS Feature Support

前言#

上篇我写了 Adguard Home 配置 UpSteam DNS Server 需要选择支持 ECS 功能的 DNS，那么本文将带你主动探测一个 DNS 是否支持 ECS 功能，以及其是否完整。

测试#

当然，在连接国外 DNS 的时候，我使用了国外服务器去请求。

在这里，假设：

国内网络号为 222.29.12.0/24，IP 地址为 222.29.12.23/32

国外网络号为 110.20.20.0/24，IP 地址为 110.20.20.23/32

使用的命令如下：

Copy
dig +nocl TXT o-o.myaddr.l.google.com @<dns server> +subnet=<your ip address> +short

Google DNS#

我们都知道 Google 的 DNS Server 是 8.8.8.8，那么我们对其进行测试：

Copy
☁ ~ dig +nocl TXT o-o.myaddr.l.google.com @8.8.8.8 +subnet=222.29.12.23/32 +short
"172.253.237.3"
"edns0-client-subnet 222.29.12.0/24"

其中响应的第一行表示回送 DNS 信息的 DNS Server，第二行表示我们传送的 ECS 信息，它可能是一个网络号，或者一个具体的 IP 地址。

这样的传送信息是比较不错的，传送我当前网络的网络号，可以认为是兼顾了 ECS 功能和隐私要求。

OpenDNS#

OpenDNS，我们可以测试 208.67.222.222：

Copy
☁ ~ dig +nocl TXT o-o.myaddr.l.google.com @208.67.222.222 +subnet=222.29.12.23/32 +short
"2620:0:cce::78"
"edns0-client-subnet 2620:0:cce::78/0"

可以看到的是，OpenDNS 回送信息中，响应的 DNS 地址和传送的 ECS 信息一样，所以可以判断，OpenDNS 采用了构建子网替换映射表这个方法来保护用户隐私。

那我们使用一个国外的 IP 地址测试一下，发现响应的信息依旧如此。

Copy
☁ ~ dig +nocl TXT o-o.myaddr.l.google.com @208.67.220.220 +subnet=110.20.20.23/32 +short
"2620:0:cce::77"
"edns0-client-subnet 2620:0:cce::77/0"

你也许会说，OpenDNS 的 ECS Support 是假的，但实际上这就是 OpenDNS 采用构建子网替换映射表方法的结果。当然这个响应信息可能不如采用同方法的阿里 DNS？

CloudFlare#

CloudFlare，我们可以测试 1.1.1.1，用于观察不支持 ECS 功能是一个什么样的响应。

Copy
☁ ~ dig +nocl TXT o-o.myaddr.l.google.com @1.1.1.1 +subnet=110.20.20.23/32 +short
"172.71.209.45"

可以看到，仅仅打印了响应的 DNS 地址，并没有打印子网信息。因为 CloudFlare 承诺不收集用户 IP 信息，那么自然是没有 ECS 支持的了。

Microsoft DNS#

Microsoft DNS 地址为 4.2.2.2

Copy
☁ ~ dig +nocl TXT o-o.myaddr.l.google.com @4.2.2.2 +subnet=222.29.12.23/32 +short
"192.221.176.2"

可见其不支持 ECS 功能。

dns.sb#

从官网上可以看到，其 DNS 地址为 185.222.222.222

Copy
☁ ~ dig +nocl TXT o-o.myaddr.l.google.com @185.222.222.222 +subnet=110.20.20.23/32 +short
"2403:2c80:8888::2"

可以看到，其不支持 ECS 功能。

DNSPOD DNS#

这是一家国内的 DNS，可以认为是腾讯 DNS，它的 DNS 地址为 119.29.29.29。

但是这家 DNS 的行为很有意思，当你传送的子网信息来自国外 IP 地址，它会按照规范去传送网络号，但是如果传送的子网信息来自国内 IP 地址，它会不按照规范，传送用户 IP 地址，在这里，我传送的 IP 地址会强制变成 222.29.12.1/32

使用国内 IP 地址去请求：

Copy
dig +nocl TXT o-o.myaddr.l.google.com @119.29.29.29 +subnet=222.29.12.23/32 +short
"edns0-client-subnet 222.29.12.23/32"
"60.29.229.99"

Copy
➜ ~ dig +nocl TXT o-o.myaddr.l.google.com @119.29.29.29 +short
"192.144.210.111"

这个行为就很奇怪，当使用预设的 IP 去请求，它会返回一个 /32 的 IP 地址，当不自定义子网信息，ECS 支持又突然消失了，这就非常令人不解，可见其 ECS 支持并不完整。

使用国外预设 IP 地址请求：

Copy
☁ ~ dig +nocl TXT o-o.myaddr.l.google.com @119.29.29.29 +subnet=110.20.20.23/32 +short
;; communications error to 119.29.29.29#53: timed out
"edns0-client-subnet 110.20.20.0/24"
"101.226.232.24"

可见，在使用国外 IP 地址去请求的时候，它会规规矩矩的按照标准去执行。

当使用国外服务器请求

Copy
timochan@timochan-cloud:~$ dig +nocl TXT o-o.myaddr.l.google.com @119.29.29.29 +short

; <<>> DiG 9.16.42-Debian <<>> +nocl TXT o-o.myaddr.l.google.com @119.29.29.29 +short
;; global options: +cmd
;; connection timed out; no servers could be reached

直接屏蔽了国外服务器连接（6

而且在我测试的时候，这个 DNS 经常超时，很难想象，这是一家国内大企业推出的 DNS 服务。

阿里 DNS#

阿里的 DNS 为 223.5.5.5，这是令人容易记忆的地址。

使用国内 IP 进行请求：

Copy
☁ ~ dig +nocl TXT o-o.myaddr.l.google.com @223.5.5.5 +subnet=222.29.12.23/32 +short
"60.205.226.65"
"edns0-client-subnet 42.83.199.0/25"

可以看到，回送的子网信息完全是个错误的，和我传送的 IP 地址不一样！！但是 IP 地址归属地和我示例的一样，所以它采用的是构建子网替换映射表，以达到保护用户隐私的目的。

使用国外 IP 地址查询：

Copy
☁ ~ dig +nocl TXT o-o.myaddr.l.google.com @223.5.5.5 +subnet=110.20.20.23/32 +short
"60.205.209.221"
"edns0-client-subnet 1.0.0.0/25"

可以看到，按照映射表，这个传送的 ECS 信息是正确的，因为和我举例的 IP 地址同一个归属地。

使用 /25 这样的地址块似乎不看重用户隐私，但是实际上和用户真实的 IP 地址几乎没有关系。

114 DNS#

这在中国也是一个很出名的 DNS 服务器，它的 IP 地址为 114.114.114.114，宣传保护不受广告侵害，保护用户隐私，绿色上网环境。

使用国内 IP 地址测试：

Copy
☁ ~ dig +nocl TXT o-o.myaddr.l.google.com @114.114.114.114 +subnet=222.29.12.23/32 +short
"60.215.138.229"

可以看到其不支持 ECS 功能。

Baidu DNS#

百度 DNS 地址为 180.76.76.76。

使用国内 IP 地址测试：

Copy
☁ ~ dig +nocl TXT o-o.myaddr.l.google.com @180.76.76.76 +subnet=222.29.12.23/32 +short
"2400:a980:db::dec7:bf06"

总结#

通过前面的测试，我们知道部分 DNS 似乎不太注重用户隐私，采用 /32 之类的地址块，很容易猜测出用户的 IP 地址，而某些更为高明的 DNS Server 采用构建子网替换映射表方法，可以随意限缩地址块的范围，因为实际指向的和用户真实 IP 地址几乎完全不同，只是归属地一样罢了。而且 DNSPOD 国外国内的行为不一致，这不是提供公共服务应该有的行为，区别对待自己国家的用户，同为中国企业的阿里则没有这样做。

那么，在中国，我只能夸 阿里 DNS 了，因为 DoT/DoH/H3/DoQ 支持完善，ECS 功能完整，并且采用了更牛逼的构建子网替换映射表方法去保护用户隐私。作为公共 DNS，如果不是在国内，我认为它有更大的发展前途。当然在中国现行政策下，它依旧是国内一流公共 DNS 服务器。自然，DNSPOD DNS（Tencent）只能当 阿里 DNS 的背景板了。

此文由 Mix Space 同步更新至 xLog
原始链接为 https://www.timochan.cn/posts/study/check_dns_ecs_support