测试了几家主流 DNS 的 ECS 功能

91 天前
 baraja
这几天折腾了一下自建 AdGuard Home 的上游 DNS ,发现某些号称支持 ECS 的 dns 比如 nextdns 、cloudflare-gateway 都不太适合作为 AGH 的上游。因为一旦这么设置了,AGH 的根据 subnet 来进行缓存的功能无法生效,反而会认为这些 dns 不支持 ECS ,继而使用通用的缓存策略。这样移动/联通/电信/海外发过去的请求会一致得到缓存里的应答,这样的 ECS 名存实亡。

我一开始以为这是 AGH 的 bug ,去 issue 里面找到了这个类似问题,看他们扯皮半天 AGH 一口咬定这不是 bug
https://github.com/AdguardTeam/AdGuardHome/issues/5757
而是认为 cloudflare-gateway dns 的应答里面缺少下述的 CLIENT-SUBNET 信息,所以不知道怎么根据 subnet 来缓存
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
; CLIENT-SUBNET: 192.0.0.0/16/16

不过我尝试搭建 unbound 之后,发现 unbound 对 cf-gateway nextdns 上游的 ecs 缓存策略也是一样的,看来也许是某些宣称支持 ECS 的 dns 有点不完美

经过一番测试,我锁定了几个完美支持 ECS 的 dns ,具体测试结果如下:


- 完美支持 ECS:

alidns (建议开通阿里云的免费版,每月 1000 万次查询)
dnspod (建议开通 dnspod 的免费版,每月 300 万次查询,比公共的免费版快得多了去了)
google ( doh dot 国内较难连上,需要走隧道,也可以在海外 vps 上 unbound 自建来转发 ecs )
quad9 的 9.9.9.9.11 或 9.9.9.12 (作为上游偶尔会抽风不支持 ECS 的缓存……不知何故)
adguard dns (注意不是 adguard home 自建,而是去 adguard-dns.io 免费开通)
使用 unbound 自建的 dns (上游需要使用前述几家之一)

以上这些均完美支持 ECS ,因为
1. 根据 AGH 使用它们作为上游,根据 subnet 缓存请求的功能均一切正常
2. 请求直接发到这几家 dns ,ecs 的缓存策略也完美


- 不完美支持 ECS:
360dns
nextdns
cloudflare-gateway
AdGuard Home 自建 dns (这里应该是 AGH 自己的 bug 了,下游的 AGH 无法识别到 subnet 来缓存 ecs 请求)

以上几家不适合作为 AGH/unbound 的上游,但直接发请求过去是可以正常根据 subnet 来缓存的


- 废柴般支持 ECS:
cisco opendns (根据客户端 IP 来缓存,而无视客户端传过来的 subnet )
5172 次点击
所在节点    DNS
33 条回复
baraja
90 天前
@fanxasy 阿里完美支持 ECS 的,https://v2ex.com/t/963505 这个帖子有提到“阿里只是在三大运营商网内的后端不支持 ECS (即不会向权威提交 ECS 地址解析准确度全靠后端在国内覆盖地区的数量)但入口是支持的,假如你提交的 IP 不属于三大运营商阿里就会转发到支持 ECS 后端进行查询”
我写的命令错了,linux 下面要--subnet 而不是/subnet
q A www.iqiyi.com --subnet 210.5.157.0/24 @https://1.12.12.12:443/dns-query 电信
q A www.iqiyi.com --subnet 139.226.196.0/24 @https://1.12.12.12:443/dns-query 联通
q A www.iqiyi.com --subnet 211.136.112.0/24 @https://1.12.12.12:443/dns-query 移动
可以看到三次结果 IP 都不同
fanxasy
90 天前
@baraja #21 感谢,成功复现了

还想问下目前国内的 ecs 只能根据运营商去响应吗,可不可以根据省市地域响应最近的结果
TanKuku
90 天前
阿里云的账号绑定的 doh ,请求一次使用明细里面的抵扣量就几千上百了,不清楚计算方式
baraja
90 天前
@fanxasy 是响应离自己最近的,但是公共 dns 效果肯定不如当地运营商效果好,毕竟阿里腾讯没在每个省都部署 dns
baraja
90 天前
@TanKuku 具体确实不明,但目前看起来正常使用不会超,而且 AGH 有缓存
HalloCQ
88 天前
感谢测试,很有参考价值
hiyoi
87 天前
请教一下 ADH cache 设置,最小 TTL 和最大 TTL 怎么设置比较好?
baraja
86 天前
@hiyoi 开乐观缓存就好,这个可以不用改
Aicerk
72 天前
adguard dns (注意不是 adguard home 自建,而是去 adguard-dns.io 免费开通)
使用这个私有的 DoH DoT 无法解析 pi.3.cn 地址。可以试试看 ?
baraja
69 天前
@Aicerk 并没有 pi.3.cn 这个域名,阿里 dns 也解析不出来。
如果你说的 i.3.cn ,那是有的,adguard dns 也能解析,但是解析到了南非……
这种国内域名还是做个分流规则吧,国外 dns 即便有 ECS 也不能保证解析到国内的。苹果系域名就是重灾区之一,ECS 都给解析到了国外
Joomaen
68 天前
可以编译 unbound 做递归 dns,开启 ECS 支持。不过我使用 technitium dns server 这个来自建
Aicerk
67 天前
@baraja 这个应该是 JD 的域名。用 AdGuard DNS 会解析不出来。 实际应该是解析出 SOA 。其他的 DNS 解析应该是给出 NXDOMAIN 响应状态。AdGuard DNS 时不时会响应 NXDOMAIN 。绝大部分时间是 SERVFAIL
"Question": [
{
"name": "pi.3.cn.",
"type": 1 /* A */
}
],
"Authority": [
{
"name": "3.cn.",
"type": 6 /* SOA */,
"TTL": 720,
"data": "ns1.3.cn. apollo.jd.com. 2015104107 10800 3600 604800 38400"
}
Aicerk
67 天前
@Aicerk 阿里使用 223.5.5.5 是 SERVFAIL 。使用 223.6.6.6 是 NXDOMAIN
dnslookup v1.11.1
Server: 223.6.6.6

dnslookup result (elapsed 31.533899ms):
;; opcode: QUERY, status: NXDOMAIN, id: 10291
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;pi.3.cn. IN A

;; AUTHORITY SECTION:
3.cn. 1 IN SOA ns1.3.cn. apollo.jd.com. 2015104107 10800 3600 604800 38400


dnslookup v1.11.1
Server: 223.5.5.5

dnslookup result (elapsed 32.498307ms):
;; opcode: QUERY, status: SERVFAIL, id: 893
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;pi.3.cn. IN A

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1086059

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX