V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
baraja
V2EX  ›  DNS

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

  •  
  •   baraja · 4 天前 · 2231 次点击
    这几天折腾了一下自建 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 )
    27 条回复    2024-11-07 01:14:42 +08:00
    baraja
        1
    baraja  
    OP
       4 天前
    当然 ECS 现在看起来就是个鸡肋功能。
    最佳的策略还是用域名分流,国内用运营商 dns ,国外反正都走代理了,解析连接都交给远端就没有 ECS 什么事了
    baraja
        2
    baraja  
    OP
       4 天前
    遗漏了几个测试结果:

    完美支持的还有:字节 dns
    支持有问题的还有:mosdns 自建
    crysislinux
        3
    crysislinux  
       4 天前 via Android
    ecs 兜底很有用
    gentrydeng
        4
    gentrydeng  
       4 天前 via Android
    AdGuard DNS 的 ECS 可用?
    使用中国电信网络请求的 ECS 会被替换为中国电信南非 IP 地址段,而且这是他们的预期实现,不会更改。
    dalaoshu25
        5
    dalaoshu25  
       4 天前
    这是我的 AdGuard Home 用的上游:

    208.67.220.220
    [2620:119:35::35]
    tls://8.8.8.8
    https://doh.pub/dns-query
    [/docker.io/] tls://1.1.1.1

    当然了,我的 AGH 运行在境外的 VPS 上,家里路由器通过 DoH 访问过去,不开不加密的 53 UDP 什么的。
    baraja
        6
    baraja  
    OP
       4 天前
    @gentrydeng AdGuard DNS 的 ECS 对国外的还可以,对国内的简直就是鸡肋。他们的实现为了隐私做了模糊处理( nextdns 亦如此),精确度很差。论精确度可能还是 google 最好,quad9 和 nextdns 稍差,AdGuard DNS 最次
    但是 AdGuard DNS 的 ECS 功能实现是完整的
    baraja
        7
    baraja  
    OP
       4 天前
    @dalaoshu25 208.67.220.220 opendns 的 ECS 形同虚设,我正文里写了。不过不图它 ECS 功能的话就无所谓了。
    WAHSUN
        8
    WAHSUN  
       4 天前 via iPhone
    我也发现了,所以准备自建 DNS 系统!
    https://pkg.labs.nic.cz/doc/?project=knot-dns
    52acca
        9
    52acca  
       4 天前 via Android
    但是 adguard 的 quic dns 差不多是唯一可以直连的
    XiLingHost
        10
    XiLingHost  
       4 天前
    用 dnsdist 自建的 dns 也能支持 ecs ,前提是配置正确
    baraja
        11
    baraja  
    OP
       4 天前
    @52acca quad9 的 doh ,nextdns 的 doq doh3 ,cf-gateway 的 doh 以及 opendns 的 doh 国内都可以直连,只是延迟和稳定性欠佳。如果你的线路是 cn2 9929 cmin2 这种精品网,那延迟和稳定性会好不少
    loveqianool
        12
    loveqianool  
       4 天前 via Android
    一直用的 rethinkdns ,不知道支持不。
    fanxasy
        13
    fanxasy  
       4 天前
    怎么看 adg home 请求的上游 dns 服务是否支持 ecs 呢,在 adg home 前端面板没找到
    baraja
        14
    baraja  
    OP
       4 天前
    @loveqianool 完全不支持 ECS ,q TXT o-o.myaddr.l.google.com @tls://max.rethinkdns.com ,应答里没有 subnet 信息
    rethink 还支持在 cf 上自建,我测试同样也不支持
    baraja
        15
    baraja  
    OP
       4 天前
    @fanxasy 安装 q: https://github.com/natesales/q/releases

    1. q TXT o-o.myaddr.l.google.com @https://xxxxxx.com/dns-query 看应答里有没有类似 edns0-client-subnet 0.0.0.0/24 的信息,这是第一步,但还不够。cf-gateway nextdns 以及 opendns 这里都是通过的,但第二步通过不了

    2. 向自建 agh 发送请求,看上游有没有正确传 subnet 给 agh
    q A www.iqiyi.com /subnet 电信的某 subnet @agh 的 dns
    q A www.iqiyi.com /subnet 联通的某 subnet @agh 的 dns
    完美支持 ECS 的 dns 应该是显示不同 ip 的,比如 alidns quad9 等
    而不完美支持 ECS 的 dns ,联通再过去请求时得到的却是电信的 IP ,agh 的日志里显示命中缓存了,而这是错误的。workaround 是禁用 agh 的缓存功能,这样每次查询 ecs 才能发挥作用
    52acca
        16
    52acca  
       3 天前
    @baraja 刚才确认了一下 quad9 的 doh 和 dot 的确都是可以直连的,解析速度比 adguard 还少快点,直连的就换成这个了。
    ddczl
        17
    ddczl  
       3 天前
    请问一下阿里云的免费版如何对接 ADG ?感觉它的 JSON API 还要代理一层加密功能
    fanxasy
        18
    fanxasy  
       3 天前
    @baraja #15 试了下

    $ q TXT o-o.myaddr.l.google.com @https://1.12.12.12:443/dns-query
    o-o.myaddr.l.google.com. 1m TXT "157.255.7.44"
    o-o.myaddr.l.google.com. 1m TXT "edns0-client-subnet x.x.x.x/24"

    $ q TXT o-o.myaddr.l.google.com @https://223.5.5.5:443/dns-query
    o-o.myaddr.l.google.com. 1m TXT "39.97.162.23"

    看上去阿里的 dns 并不支持 ecs?
    fanxasy
        19
    fanxasy  
       3 天前
    @baraja #15 另外我尝试用各种不同的运营商跑这两条命令

    q A www.iqiyi.com /subnet 不同运营商的 subnet @https://1.12.12.12:443/dns-query
    q A www.iqiyi.com /subnet 不同运营商的 subnet @https://223.5.5.5:443/dns-query

    结果都是千篇一律的
    ipv6-static.dns.iqiyi.com. 4m14s A 220.181.184.12
    ipv6-static.dns.iqiyi.com. 4m14s A 220.181.184.20
    ipv6-static.dns.iqiyi.com. 4m14s A 220.181.184.24
    ipv6-static.dns.iqiyi.com. 4m14s A 220.181.184.25
    ipv6-static.dns.iqiyi.com. 4m14s A 220.181.184.40
    www.iqiyi.com. 4m14s CNAME ipv6-static.dns.iqiyi.com.

    是我哪里没操作对?
    baraja
        20
    baraja  
    OP
       3 天前
    baraja
        21
    baraja  
    OP
       3 天前
    @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
        22
    fanxasy  
       3 天前
    @baraja #21 感谢,成功复现了

    还想问下目前国内的 ecs 只能根据运营商去响应吗,可不可以根据省市地域响应最近的结果
    TanKuku
        23
    TanKuku  
       2 天前 via Android
    阿里云的账号绑定的 doh ,请求一次使用明细里面的抵扣量就几千上百了,不清楚计算方式
    baraja
        24
    baraja  
    OP
       2 天前
    @fanxasy 是响应离自己最近的,但是公共 dns 效果肯定不如当地运营商效果好,毕竟阿里腾讯没在每个省都部署 dns
    baraja
        25
    baraja  
    OP
       2 天前
    @TanKuku 具体确实不明,但目前看起来正常使用不会超,而且 AGH 有缓存
    HalloCQ
        26
    HalloCQ  
       1 天前
    感谢测试,很有参考价值
    hiyoi
        27
    hiyoi  
       12 小时 27 分钟前 via Android
    请教一下 ADH cache 设置,最小 TTL 和最大 TTL 怎么设置比较好?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5172 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:42 · PVG 13:42 · LAX 21:42 · JFK 00:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.