这几天折腾了一下自建 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 )
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/1086059
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.