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
使用的命令如下:
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,那么我们对其进行测试:
☁ ~ 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:
☁ ~ 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 地址测试一下,发现响应的信息依旧如此。
☁ ~ 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 功能是一个什么样的响应。
☁ ~ 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
☁ ~ 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
☁ ~ 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 地址去请求:
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"
➜ ~ dig +nocl TXT o-o.myaddr.l.google.com @119.29.29.29 +short
"192.144.210.111"
这个行为就很奇怪,当使用预设的 IP 去请求,它会返回一个 /32 的 IP 地址,当不自定义子网信息,ECS 支持又突然消失了,这就非常令人不解,可见其 ECS 支持并不完整。
使用国外预设 IP 地址请求:
☁ ~ 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 地址去请求的时候,它会规规矩矩的按照标准去执行。
当使用国外服务器请求
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 进行请求:
☁ ~ 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 地址查询:
☁ ~ 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 地址测试:
☁ ~ 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 地址测试:
☁ ~ 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 的背景板了。