openwrt 软路由多级 DNS 配置学习分享
写在前面
复杂方案看起来高大上的样子,但有可能并没什么用,反而引入其他插件依赖,出问题排查更麻烦,所以我更推荐简单方案
前面介绍了 openwrt 的插件时候挖了一个多级 DNS 的坑,现在补上
文章大纲如下

方案说明
AdGuard Home 本身是不具备域名解析分流功能,如果你看到的方案只有一个 AdGuard Home 对接两组 smartdns,那基本没啥用
普通方案
简单暴力,就是引入 AdGuard Home 就可以了

启用一个 AdGuard Home:
提供基于 dns 拦截 AD 功能(只能拦截一部分,效果没想象中完美)
上游设置运营商提供的两个 DNS,然后额外补充 1-2 个公共 DNS,如 114DNS、DNSPOD 之类
设置作为 dnsmasq 的上游服务器
复杂方案
方案架构如下:

用到的组件也比较常规了:
dnsmasq,成熟的 dns 缓存服务
chinadns-ng,负责维护 chnroute 等列表,然后通过 dnsmasq 注入配置
AdGuard Home,提供基于 dns 拦截 AD 功能
smartdns,优化域名解析,防污染
接下来就是从后往前的进行配置
smartdns 配置
该工具主要提供了以下两个功能:
海外国内解析分流
最优解析延迟返回
在配置上,虽然版本有所更替,但基本的配置内容还是兼容的,如果是迁移路由可复制配置文件
/etc/config/smartdns
复制完成后执行 reload_config 生效,而对于全新部署的场景,这里也提供一些我的一些配置参考
基础配置说明
如上面的架构图,smartdns 是需要分两个组的,对应到配置就是:
默认组(default),监听 6053 端口
海外组(oversea),监听 7053 端口
这两者是互相独立了,具体使用哪个组,是由下游的 dns 缓存来决定
国内组
对应的就是 smartdns 的基础配置
勾选启用
本地端口设置 6053
不需要勾选设置 dnsmasq,因为最终还是要通过 dnsmasq 来提供服务

国内组的上游 DNS,建议设置方式是:
最优先使用运营商分配的 DNS 缓存服务器,以确保就近解析、避免跨运营商解析
额外再补充一些国内公共 DNS,如 114DNS、DNSPOD、USTC 等
全部默认使用 udp 协议即可
运营商分配的 DNS 缓存服务器,可通过主路由的 WAN 状态拿到,比如

这部分目前变化的情况非常少,并且即使失效了,smartdns 也会用上其他的 dns 来解析

这里以添加第一个 DNS 为例 211.136.192.6,在 smartdns 上点击添加上游服务器
DNS服务器名称,广东移动 1 号 DNS,对应 GD_CMCC #1
类型使用 udp 即可
端口保留默认 default,实际上就是 53 端口
服务器组也是保持默认的 default 不用修改
依次完成国内组服务器的添加,这里除了运营商的 DNS 缓存,我也推荐一些 DNS:
QINGHUA #1:166.111.8.28
USTC #1:202.141.160.95
114DNS #1:114.114.114.114
DNSPOD#1:119.29.29.29
上述配置统一使用 udp 协议、默认端口、默认服务器组即可
海外组
注意,如果你请求海外域名是走特殊网络环境,那么海外组配置的上游 DNS 也必须跟着一起走,不然会出现绕路情况导致最终访问效果较差
对应的就是 smartdns 的第二 DNS 服务器
勾选启用
本地端口设置 7053
服务器组设置为 oversea
下面一系列都是选择逃过,不要求能解析到多优秀的入口,只要能解析到就行

海外组的上游 DNS,建议设置方式是:
尽量使用 TLS、HTTPS 协议
尽量使用非标准端口
如果有合理的网络条件,才考虑设置 UDP 协议 dns

这里以 cloudflare 的 https dns 为例:
DNS服务器名称,CloudFlare 1 号 DNS,对应 CloudFlare #1
IP 填写 cloudflare 的 https 解析入口
类型使用 https
服务器组修改为 oversea
最后在额外参数那里,增加 -exclude-default-group,避免默认组使用到该上游 DNS

海外组的 DNS 除了知名的那些大家都懂的,这里也给一些我设置的:
Quad9 #1,https,https://dns.quad9.net/dns-query
Quad9 #2 TLS,tls,149.112.112.112,端口 853
OpenDNS #1,udp,208.67.222.222 端口 443
AdGuardHome 设置
之前在硬路由的 openwrt 上用的是其他方案,迁移过来软路由才使用 AdGuardHome,所以是从 0 开始配置
路由器固件已经默认带了 AdGuardHome,所以直接进入配置即可
更新核心版本
进入服务配置页面后,先点击 更新核心版本

然后勾选启用,再点击保存并应用,这个时候可以看到:AdGuardHome 运行中未重定向

此页面上其他配置都无需调整,点击中间的按钮进入 AdGuardHome 的配置页面进行配置即可
配置使用

点击开始配置,接下来需要设置两个端口:
网页管理界面:所有接口 3000 端口
DNS 服务器:所有接口 8053 端口
再设置用户名密码,后续其他的就按照默认即可,设置完成后会跳转到登录页面,输入用户密码登录:

然后再页面上方点击 设置 - DNS 设置:
上游服务器输入 smartdns 的国内分组对应端口 127.0.0.1:6053
同样,Bootstrap DNS 服务器也是填入国内分组 127.0.0.1:6053
bootstrap dns 并不是用来解析海外 dns 的,而是用来解析一些写了域名的 DNS 服务器
最后点击测试上游服务器,确认能正常运行即可,最后点击 **应用 **进行保存

DNS 服务配置:
速度限制调整为 0,也就是不进行限制
启用 EDNS 客户端子网
启用 DNSSEC
因为需要用到 ipv6 解析,所以这个没有禁用

缓存配置全部留空,由 smartdns 来管理

至此,DNS 基础配置已经完成,其他的加密设置、客户端设置、DHCP 设置均用不到。
目前广告商也都是在与时俱进的,所以别想着一个 AdGuard Home 就能解决所有问题,只能拦截掉一部分
接下来进入过滤器配置,这里主要添加了 4 个黑名单过滤广告

在 AdGuardHome 配置完成后,回到 openwrt 后台,继续设置重定向:

这里选择:作为dnsmasq的上游服务器
踩坑分享:日志配置
在配置完某一天,电脑访问网页出现打不开情况

但是通过 IP 的请求可以正常访问,因此定位是 dns 问题,在路由器上一条链路排查下来
dig www.baidu.com 失败,代表 dnsmasq 及后续链路异常
dig www.baidu.com @127.0.0.1:8053 失败,代表 AdGuard Home 及后续链路异常
dig www.baidu.com @127.0.0.1:6053 成功,代表 smartdns 正常
从上面的排查可以定位就是 AdGuard Home 问题,然后查看日志发现是磁盘被打满了

主要是家里设备比较多,dns 请求频繁,因此调整日志保留天数,改到 6 小时

在设置->常规设置中,下拉找到日志配置,可考虑关闭日志,或者调整日志保留时间(默认为 90 天)
chinadns-ng 设置
关于 chinadns-ng 这部分,我不是直接单独使用这个插件,所以一些配置不好展开来讲,仅提供一个配置思路
基础说明
chinadns-ng 的作用就是区分国内域名与海外域名(或者说容易污染的域名),进行分流分别请求不同的上游 dns
对于国内域名,设置上游为 AdGuard Home 对应的 127.0.0.1:8053,最终走到 smartdns 的国内组
对于海外域名,设置上游为 smartdns 的海外组,对应 127.0.0.1:7053
配置
这里我并不是直接使用了 chinadns-ng 插件,而是通过了 passwa** 插件自定的 chinadns-ng

在对应插件的基本设置中,进入 DNS 配置页面,进行如下调整:
过滤模式通过 UDP 请求 DNS
远程 DNS 设置为 smartdns 的海外分组 127.0.0.1:7053
启用 ChinaDNS-NG 功能
在进行如上设置后,最终会在 dnsmasq 的子配置目录下注入新的配置

其中 127.0.0.1#7053 就是 smartdns 的 oversea 分组,也就是可信 DNS,从而能获取到正确域名解析
Dnsmasq 配置
基础设置
实际上 dnsmasq 并不需要做什么特殊配置,在 AdGuard Home 那里设置了作为dnsmasq的上游服务器

对应的 dnsmasq 会自动进行如上设置调整,也就是将 AdGuard Home 作为 dnsmasq 的上游
踩坑分享:无法解析内网域名
之前配置了之后,出现一些内网域名无法解析,返回为空的情况,如下图:
域名请求状态为 NOERROR,也就是没有错误
但是 ANSWER 为 0,代表没有返回域名解析

依次进行排查,发现请求上游 AdGuard Home 是正常的,对应就是 127.0.0.1:8053

那么可以肯定就是 dnsmasq 的问题了,最终排查到是开了重定向保护导致的

原因就是开启了该参数就会过滤掉外域名解析到私有 IP 地址,私有 ip 包含

写在后面
复杂方案确实是挺复杂
不弄清楚原理,很容易就配置失败或者配置了没啥用效果
并且要正确解析海外那些域名,你需要一个“良好的网络环境”,也就涉及到不止 dns 插件的配置了
目前我也是出于技术学习去搭建这些东西,不过也用了有半年错没啥问题:
效果不好说,因为我也没时间去做详细的数据对比,比如解析耗时、解析准确性
功能算是正常,至少没有出现什么解析耗时过长、解析不了的问题
但是我还是推荐,跑一个 AdGuard Home 去设置 dnsmasq 重定向就行了,简单可靠
ok,目前软路由 openwrt 的内容已经基本完结了,除了开头两篇,还有这两篇。后续再看看有什么好玩的可以分享~
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

Makvesky
校验提示文案
愚以为
校验提示文案
iamnio
校验提示文案
我是元芳
校验提示文案
joeyzhou1980
校验提示文案
叫我abalone
校验提示文案
远远的目光
校验提示文案
挚友一心
校验提示文案
值友7828692418
校验提示文案
yiccccc
校验提示文案
Makvesky
校验提示文案
值友7828692418
校验提示文案
yiccccc
校验提示文案
挚友一心
校验提示文案
远远的目光
校验提示文案
叫我abalone
校验提示文案
joeyzhou1980
校验提示文案
我是元芳
校验提示文案
iamnio
校验提示文案
愚以为
校验提示文案