写在前面
复杂方案看起来高大上的样子,但有可能并没什么用,反而引入其他插件依赖,出问题排查更麻烦,所以我更推荐简单方案
前面介绍了 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 的内容已经基本完结了,除了开头两篇,还有这两篇。后续再看看有什么好玩的可以分享~
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
,