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

35 天前
 pdone

我的 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 服务器)

2235 次点击
所在节点    宽带症候群
20 条回复
itiao
35 天前
试试看开启 禁用 IPV6 解析?
Puteulanus
35 天前
试试用 client 规则呢,客户端那边能不能区分出内网和外网的解析,然后让规则只应用在内网请求上面

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

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

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

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

@fuzzsh 我研究一下
fuzzsh
35 天前
手机 PC 网用 v6 Only 没问题,有嵌入式设备就要另外开 wifi, 大多数不支持 ipv6
mac100
35 天前
@Puteulanus 完全看不明白什么意思。。
bjfane
35 天前
家里的东西 虽然 ipv6 ,是不是套一层 vpn 比较好,比如 wg , 不知道有没有成熟的 v4 on ipv6 的解决方案。
pdone
34 天前
@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
34 天前
#12 另外黑名单中的规则,也可以放在 ddnsgo webhook 的请求体里,就不用添加黑名单,不过这部分都是固定内容,不必每次 ipv6 变化后都重新设置,所以选择分开设置这两部分规则。
jesky
34 天前
@pdone #12 祝贺解题成功。不过,请教一下,你执意实现“内网请求,要返回内网 IPv4”,我觉得即便解析为公网 IPv6 地址,实际访问速度应该无差吧,本机和目标设备都是相同的 IPv6 前缀,同一子网,并不会从公网绕一圈。
pdone
34 天前
@jesky #14 之前执意要返回内网 v4 是因为公网 v6 要去上游查询太慢,现在这个问题已解决。
目前配置的规则,在内网时,会同时返回内网 v4 和公网 v6 ,在外网时,仅返回公网 v6 。





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

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

我本地就是这么配置的。NAS 使用群晖的 DDNS 进行 AAAA 解析,MOSDNS 配置本地 V4 解析。
局域网内我本地 PC 是正常的,只能拿到 NAS 的 V4 地址,但是内网的 Shield TV 还是会走 V6 去连,这个我还没搞定。局域网手机表现和电视盒子一致。
yangfan1999
33 天前
@yangfan1999 想了下,考虑直接在 MOSDNS 上面同时配置 NAS 的 V4 和 V6 本地解析,V6 随便写一个,让 V6 不再向上游进行解析,这样 perfer_ipv4 应该能生效,下班回去试试。
trott
31 天前
你的 adg 还对外提供服务吗,这个还没本人找上门?
pdone
28 天前
@trott 仅自用

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

https://ex.noerr.eu.org/t/1151573

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

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

© 2021 V2EX