看了不少smartdns设置两组服务器组,进行dns国内外分流的操作,让我无语的是smartdns的教程好多都是错的。其设置的两组监听端口是不假,但是默认情况下这两组监听端口都是共用一样的上游dns服务器,也就是这些普通用户费心费力添加的一堆起名为cn的dns服务器,还有一堆起名为oversea的dns服务器。而当你查询时,就是这两组一起查,把两组监听端口名字设为cn和oversea并不能起到配对同名上游dns服务器的作用。。。
正确做法是通过高级设置,手动指定特定域名通过哪个group查询
如下图所示


当然,这样的操作费时费力,远不如直接装两个adguardhome省事。
以我用的esir高大全版本openwrt为例,内自带一个插件版本的adguardhome和docker,只需docker安装一个adguardhome即可。
将插件版本的adgh设为解析国内以及内网域名用(端口3053),docker版本的设为解析国外域名使用(端口3153)
国内用adgh,上游dns:
223.5.5.5
180.76.76.76
114.114.114.114

Bootstrap DNS 服务器:(如在企业等内网下可增加内网dns服务器地址)
114.114.114.114
223.5.5.5
240C::6666
240C::6644
2400:da00::6666

dns缓存配置一栏,增加
覆盖最小TTL值:480
覆盖最大TTL值:86400

国外用adgh,上游dns:(自己寻找无污染dns上游)
tls://1.1.1.1
https://sg.adhole.org/dns-query
tls://dns.google

Bootstrap DNS 服务器:
114.114.114.114
223.5.5.5
240C::6666
240C::6644
2400:da00::6666

dns缓存配置一栏,增加
覆盖最小TTL值:480
覆盖最大TTL值:86400

此时在dhcp/dns中设置转发127.0.0.1#3053,
另在ssr+中设置GFW列表模式,使用dns2socks查询127.0.0.1:3153,保存应用。
如果使用passwall,同样设置TCP代理模式为GFW,udp为不代理,dns为自定义:127.0.0.1:3153,勾选chinadns-ng,保存应用。(考虑到GFW规则较多,据说chinadns-ng判定域名的方式效率比ssr+使用Dnsmasq 的遍历方法要高,花的时间要少很多,刚刚转了passwall正在使用中)

此时,基本配置完成,理论上所有dns查询都会经过这两个dns服务器。但如果仔细测试的话会发现,会有少数查询并不经过这俩dns服务器,说明Dnsmasq还有其他上游dns服务器,他们抢答了
经过查询发现,确实还有其他上游dns服务器,具体可参考以下内容:
https://v2ex.com/t/649603
https://renyili.org/post/openwrt_dns_process/
wan口或者其他拨号接口会默认添加上一级给的dns服务器。要关闭掉这些默认的上游,需要在”DHCP/DNS”中的 “hosts和解析文件” 一栏中勾选 “忽略解析文件”。或者关闭wan口和vpn拨号接口高级设置中的“使用对端通告的 DNS 服务器”,同样会使上游通告的dns服务器不写入 /tmp/resolv.conf.d/resolv.conf.auto 文件中,也起到了忽略这个解析文件的作用。

查看两个adgh的dns查询日志,可以发现分工明确,一个处理国内查询,一个处理被污染域名的dns查询。

大功告成!
以上。

原文地址:https://www.ccnm.cc/archives/3291/2022/01/%E8%BD%AF%E8%B7%AF%E7%94%B1%E5%AE%89%E8%A3%85%E5%8F%8Cadguardhome%E9%85%8D%E7%BD%AE%E5%9B%BD%E5%86%85%E5%A4%96dns%E5%88%86%E6%B5%81/