Checking DNS ECS Feature Support

AI 生成的摘要

加载中...

(此服务由 xLog 驱动)

这篇文章上次修改于 1 年前,可能部分内容已经不适用,如有疑问可询问作者。

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

使用的命令如下:

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

Google DNS

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

BASH
☁  ~  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"
Copy

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

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

OpenDNS

OpenDNS,我们可以测试 208.67.222.222:

BASH
☁  ~  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"
Copy

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

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

BASH
☁  ~  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"
Copy

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

CloudFlare

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

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

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

Microsoft DNS

Microsoft DNS 地址为 4.2.2.2

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

可见其不支持 ECS 功能。

dns.sb

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

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

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

DNSPOD DNS

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

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

使用国内 IP 地址去请求:

BASH
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
BASH
➜  ~ dig +nocl TXT o-o.myaddr.l.google.com @119.29.29.29 +short 
"192.144.210.111"
Copy

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

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

BASH
☁  ~  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"
Copy

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

当使用国外服务器请求

BASH
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
Copy

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

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

阿里 DNS

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

使用国内 IP 进行请求:

BASH
☁  ~  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"
Copy

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

使用国外 IP 地址查询:

BASH
☁  ~  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"
Copy

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

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

114 DNS

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

使用国内 IP 地址测试:

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

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

Baidu DNS

百度 DNS 地址为 180.76.76.76。

使用国内 IP 地址测试:

BASH
☁  ~  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"
Copy

总结

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

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

此文章已经由它的创作者签名并安全地存储在区块链上。