V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pdone
V2EX  ›  宽带症候群

使用 ADGuardHome 时遇到的一个困扰很久的问题

  •  
  •   pdone · 28 天前 · 2166 次点击

    我的 adg 部署在家里的 NAS 上,只有公网 IPv6 ,通过 DDNS 日常使用没有问题。

    在家里,手机电脑等设备,都与 adg 在同一局域网下,但由于设备都是优先使用 IPv6 ,访问内网服务时,比如访问 NAS 后台( nas.abc.cc ),还会去 adg 的上游 DNS 查询一下 v6 地址,而不是直接使用内网 IP ( 10.0.0.10 ),而每次查询都有 100ms 左右的耗时,即使在内网也能明显感觉使用 adg 做 DNS 时,访问网页会变慢。

    用 adg 本意是为了屏蔽广告,尝试了各种方法,自定义过滤规则,重写 DNS 等,都只能顾一头,比如

    ||*.abc.cc^$client=myphone,dnstype=A,dnsrewrite=10.0.0.10
    

    这样写规则,内网使用没问题,但在外网访问时,会同时查询到公网 v6 和内网 v4 地址,但由于 v4 几乎无延迟就查询到了,返回给下游的是内网 v4 ,在外网就访问不了。

    帅气的 v 站老哥们,有没有解决方案啊,在内网使用时仅返回内网 v4 ,外网仅返回公网 v6 。 (在使用同一个私人 DNS 地址的情况下,不用每次回家或出门时修改私人 DNS 服务器)

    20 条回复    2025-08-18 12:23:38 +08:00
    itiao
        1
    itiao  
       28 天前
    试试看开启 禁用 IPV6 解析?
    Puteulanus
        2
    Puteulanus  
       28 天前   ❤️ 1
    试试用 client 规则呢,客户端那边能不能区分出内网和外网的解析,然后让规则只应用在内网请求上面

    pdone
        3
    pdone  
    OP
       28 天前
    @itiao 禁用 v6 解析 在局域网以外就访问不了了

    @Puteulanus 客户端是用安卓系统自带的私人 dns 设置,使用的是 doh ,如果每次出门都修改这个 doh 地址,可以实现分别解析 v6 和 v4 ,不过这样要经常修改
    Puteulanus
        4
    Puteulanus  
       28 天前
    @pdone 我是说 adguard home 的 客户端 设置,能不能比如把家里的 v6 段划成一个客户端,然后用 client 修饰符让规则只应用于家里过来的请求,这样就把内网和外网的 DNS 请求给分开了

    pdone
        5
    pdone  
    OP
       28 天前
    @Puteulanus #4 这个思路可以,我尝试一下,感谢👍
    jesky
        6
    jesky  
       27 天前
    看起来你在意的是“每次查询都有 100ms 左右的耗时”,那你就把你的域名 *.abc.cc 指定为公网 IPv6 就可以了,然后需要一个脚本定时更新这个记录,就如同 DDNS 服务定时把 IP 更新到 DNS 服务器,你这个就等于是定时更新到本地 DNS 服务里。
    fuzzsh
        7
    fuzzsh  
       27 天前 via Android
    内网 v6Only ,做 dns64
    pdone
        8
    pdone  
    OP
       27 天前
    @Puteulanus 再次感谢老哥,按你的思路也已经解决目前的困扰了

    @jesky 是的,这是接下来要优化的地方,既然 ddns 能更新记录,我也要更新 adg 的记录,就不用每次去上游查询了

    @fuzzsh 我研究一下
    fuzzsh
        9
    fuzzsh  
       27 天前 via Android
    手机 PC 网用 v6 Only 没问题,有嵌入式设备就要另外开 wifi, 大多数不支持 ipv6
    mac100
        10
    mac100  
       27 天前
    @Puteulanus 完全看不明白什么意思。。
    bjfane
        11
    bjfane  
    PRO
       27 天前
    家里的东西 虽然 ipv6 ,是不是套一层 vpn 比较好,比如 wg , 不知道有没有成熟的 v4 on ipv6 的解决方案。
    pdone
        12
    pdone  
    OP
       27 天前
    @Puteulanus @jesky 结合两位老哥的思路,已经完全解决问题,总结一下方法给其他可能用到朋友提供一个参考。




    以上可以实现客户端在内网时,返回内网 ipv4 ,在外网时,返回公网 ipv6 ,适用于只有公网 ipv6 的 adg 或 nas 。




    以上可以实现个人服务器已知域名的动态公网 ipv6 不再去上游 dns 查询,大幅降低查询耗时,我这里之前平均 100ms 以上,改为从规则匹配后降低到 1ms 内。

    参考文档
    https://github.com/AdguardTeam/AdGuardHome/tree/master/openapi
    https://adguard-dns.io/kb/zh-CN/general/dns-filtering-syntax/
    pdone
        13
    pdone  
    OP
       27 天前
    #12 另外黑名单中的规则,也可以放在 ddnsgo webhook 的请求体里,就不用添加黑名单,不过这部分都是固定内容,不必每次 ipv6 变化后都重新设置,所以选择分开设置这两部分规则。
    jesky
        14
    jesky  
       27 天前
    @pdone #12 祝贺解题成功。不过,请教一下,你执意实现“内网请求,要返回内网 IPv4”,我觉得即便解析为公网 IPv6 地址,实际访问速度应该无差吧,本机和目标设备都是相同的 IPv6 前缀,同一子网,并不会从公网绕一圈。
    pdone
        15
    pdone  
    OP
       27 天前
    @jesky #14 之前执意要返回内网 v4 是因为公网 v6 要去上游查询太慢,现在这个问题已解决。
    目前配置的规则,在内网时,会同时返回内网 v4 和公网 v6 ,在外网时,仅返回公网 v6 。





    goodryb
        16
    goodryb  
       27 天前
    有公网 IP , 在外面走 ddns ,回家直接用 DNS 重写相关域名到内网 IP

    v6 以前开过,麻烦切没啥用,又给关了
    yangfan1999
        17
    yangfan1999  
       26 天前
    adguard 上游配置 mosdns 做分流,使用 mosdns 的 prefer_ipv4 参数应该能满足要求:同时存在 A 和 AAAA 记录时,仅返回 A 记录。

    我本地就是这么配置的。NAS 使用群晖的 DDNS 进行 AAAA 解析,MOSDNS 配置本地 V4 解析。
    局域网内我本地 PC 是正常的,只能拿到 NAS 的 V4 地址,但是内网的 Shield TV 还是会走 V6 去连,这个我还没搞定。局域网手机表现和电视盒子一致。
    yangfan1999
        18
    yangfan1999  
       26 天前
    @yangfan1999 想了下,考虑直接在 MOSDNS 上面同时配置 NAS 的 V4 和 V6 本地解析,V6 随便写一个,让 V6 不再向上游进行解析,这样 perfer_ipv4 应该能生效,下班回去试试。
    trott
        19
    trott  
       24 天前
    你的 adg 还对外提供服务吗,这个还没本人找上门?
    pdone
        20
    pdone  
    OP
       21 天前
    @trott 仅自用
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3326 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 11:04 · PVG 19:04 · LAX 04:04 · JFK 07:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.