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

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

  •  
  •   baraja · 28 天前 · 3529 次点击
    这几天折腾了一下自建 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 )
    第 1 条附言  ·  13 天前
    新增几个测试结果

    完美支持 ECS 的:字节跳动 DNS (没有国际节点,仅限 wall 内使用)


    支持 ECS 但不适合作为 AdGuard Home/unbound 等上游的(会造成 ECS 缓存策略失效):

    - dns0eu https://www.dns0.eu/ (服务器在欧洲,延迟高不稳定,国内用实属鸡肋)
    - gcore DNS https://gcore.com/public-dns (不支持 DoH 、DoT ,延迟高,移动或可一用)
    - mosdns 自建

    预期将支持 ECS 是否完美尚未知晓的:
    controlD 私人 dns https://controld.com/(这家不免费,但承诺 ECS 功能正在开发中,即将上线)

    没有细测的: https://dash.xns.one/(国人商家,不免费,有兴趣的自己测)
    33 条回复    2024-11-27 08:42:54 +08:00
    baraja
        1
    baraja  
    OP
       28 天前
    当然 ECS 现在看起来就是个鸡肋功能。
    最佳的策略还是用域名分流,国内用运营商 dns ,国外反正都走代理了,解析连接都交给远端就没有 ECS 什么事了
    baraja
        2
    baraja  
    OP
       28 天前
    遗漏了几个测试结果:

    完美支持的还有:字节 dns
    支持有问题的还有:mosdns 自建
    crysislinux
        3
    crysislinux  
       28 天前 via Android
    ecs 兜底很有用
    gentrydeng
        4
    gentrydeng  
       28 天前 via Android
    AdGuard DNS 的 ECS 可用?
    使用中国电信网络请求的 ECS 会被替换为中国电信南非 IP 地址段,而且这是他们的预期实现,不会更改。
    dalaoshu25
        5
    dalaoshu25  
       28 天前
    这是我的 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
       28 天前
    @gentrydeng AdGuard DNS 的 ECS 对国外的还可以,对国内的简直就是鸡肋。他们的实现为了隐私做了模糊处理( nextdns 亦如此),精确度很差。论精确度可能还是 google 最好,quad9 和 nextdns 稍差,AdGuard DNS 最次
    但是 AdGuard DNS 的 ECS 功能实现是完整的
    baraja
        7
    baraja  
    OP
       28 天前
    @dalaoshu25 208.67.220.220 opendns 的 ECS 形同虚设,我正文里写了。不过不图它 ECS 功能的话就无所谓了。
    WAHSUN
        8
    WAHSUN  
       28 天前 via iPhone
    我也发现了,所以准备自建 DNS 系统!
    https://pkg.labs.nic.cz/doc/?project=knot-dns
    52acca
        9
    52acca  
       28 天前 via Android
    但是 adguard 的 quic dns 差不多是唯一可以直连的
    XiLingHost
        10
    XiLingHost  
       28 天前
    用 dnsdist 自建的 dns 也能支持 ecs ,前提是配置正确
    baraja
        11
    baraja  
    OP
       28 天前
    @52acca quad9 的 doh ,nextdns 的 doq doh3 ,cf-gateway 的 doh 以及 opendns 的 doh 国内都可以直连,只是延迟和稳定性欠佳。如果你的线路是 cn2 9929 cmin2 这种精品网,那延迟和稳定性会好不少
    loveqianool
        12
    loveqianool  
       28 天前 via Android
    一直用的 rethinkdns ,不知道支持不。
    fanxasy
        13
    fanxasy  
       28 天前
    怎么看 adg home 请求的上游 dns 服务是否支持 ecs 呢,在 adg home 前端面板没找到
    baraja
        14
    baraja  
    OP
       28 天前
    @loveqianool 完全不支持 ECS ,q TXT o-o.myaddr.l.google.com @tls://max.rethinkdns.com ,应答里没有 subnet 信息
    rethink 还支持在 cf 上自建,我测试同样也不支持
    baraja
        15
    baraja  
    OP
       28 天前
    @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  
       27 天前
    @baraja 刚才确认了一下 quad9 的 doh 和 dot 的确都是可以直连的,解析速度比 adguard 还少快点,直连的就换成这个了。
    ddczl
        17
    ddczl  
       27 天前
    请问一下阿里云的免费版如何对接 ADG ?感觉它的 JSON API 还要代理一层加密功能
    fanxasy
        18
    fanxasy  
       27 天前
    @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  
       27 天前
    @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
       27 天前
    baraja
        21
    baraja  
    OP
       27 天前
    @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  
       27 天前
    @baraja #21 感谢,成功复现了

    还想问下目前国内的 ecs 只能根据运营商去响应吗,可不可以根据省市地域响应最近的结果
    TanKuku
        23
    TanKuku  
       26 天前 via Android
    阿里云的账号绑定的 doh ,请求一次使用明细里面的抵扣量就几千上百了,不清楚计算方式
    baraja
        24
    baraja  
    OP
       26 天前
    @fanxasy 是响应离自己最近的,但是公共 dns 效果肯定不如当地运营商效果好,毕竟阿里腾讯没在每个省都部署 dns
    baraja
        25
    baraja  
    OP
       26 天前
    @TanKuku 具体确实不明,但目前看起来正常使用不会超,而且 AGH 有缓存
    HalloCQ
        26
    HalloCQ  
       25 天前
    感谢测试,很有参考价值
    hiyoi
        27
    hiyoi  
       24 天前 via Android
    请教一下 ADH cache 设置,最小 TTL 和最大 TTL 怎么设置比较好?
    baraja
        28
    baraja  
    OP
       22 天前
    @hiyoi 开乐观缓存就好,这个可以不用改
    Aicerk
        29
    Aicerk  
       9 天前
    adguard dns (注意不是 adguard home 自建,而是去 adguard-dns.io 免费开通)
    使用这个私有的 DoH DoT 无法解析 pi.3.cn 地址。可以试试看 ?
    baraja
        30
    baraja  
    OP
       6 天前
    @Aicerk 并没有 pi.3.cn 这个域名,阿里 dns 也解析不出来。
    如果你说的 i.3.cn ,那是有的,adguard dns 也能解析,但是解析到了南非……
    这种国内域名还是做个分流规则吧,国外 dns 即便有 ECS 也不能保证解析到国内的。苹果系域名就是重灾区之一,ECS 都给解析到了国外
    Joomaen
        31
    Joomaen  
       4 天前
    可以编译 unbound 做递归 dns,开启 ECS 支持。不过我使用 technitium dns server 这个来自建
    Aicerk
        32
    Aicerk  
       4 天前
    @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
        33
    Aicerk  
       4 天前
    @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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2511 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:57 · PVG 12:57 · LAX 20:57 · JFK 23:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.