OpenWRT软路由多级DNS配置详解
OpenWRT软路由多级DNS配置详解
OpenWRT软路由的多级DNS配置方案,既能实现国内和海外DNS的分流,又能提供广告拦截功能。本文将详细介绍两种配置方案:普通方案和复杂方案,并重点讲解复杂方案的具体配置步骤,包括SmartDNS、AdGuardHome、chinadns-ng和dnsmasq的配置细节。
方案说明
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的httpsdns为例:
- DNS服务器名称,CloudFlare1号DNS,对应CloudFlare#1
- IP填写cloudflare的https解析入口
- 类型使用https
- 服务器组修改为oversea
最后在额外参数那里,增加-exclude-default-group,避免默认组使用到该上游DNS
海外组的DNS除了知名的那些大家都懂的,这里也给一些我设置的:
- Quad9#1,https,https://dns.quad9.net/dns-query
- Quad9#2TLS,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
- 同样,BootstrapDNS服务器也是填入国内分组127.0.0.1:6053
bootstrapdns并不是用来解析海外dns的,而是用来解析一些写了域名的DNS服务器
最后点击测试上游服务器,确认能正常运行即可,最后点击应用进行保存
DNS服务配置:
- 速度限制调整为0,也就是不进行限制
- 启用EDNS客户端子网
- 启用DNSSEC
- 因为需要用到ipv6解析,所以这个没有禁用
缓存配置全部留空,由smartdns来管理
至此,DNS基础配置已经完成,其他的加密设置、客户端设置、DHCP设置均用不到。
目前广告商也都是在与时俱进的,所以别想着一个AdGuardHome就能解决所有问题,只能拦截掉一部分
接下来进入过滤器配置,这里主要添加了4个黑名单过滤广告
在AdGuardHome配置完成后,回到openwrt后台,继续设置重定向:
这里选择:作为dnsmasq的上游服务器
踩坑分享:日志配置
在配置完某一天,电脑访问网页出现打不开情况
但是通过IP的请求可以正常访问,因此定位是dns问题,在路由器上一条链路排查下来
- digwww.baidu.com失败,代表dnsmasq及后续链路异常
- digwww.baidu.com@127.0.0.1:8053失败,代表AdGuardHome及后续链路异常
- digwww.baidu.com@127.0.0.1:6053成功,代表smartdns正常
从上面的排查可以定位就是AdGuardHome问题,然后查看日志发现是磁盘被打满了
主要是家里设备比较多,dns请求频繁,因此调整日志保留天数,改到6小时
在设置->常规设置中,下拉找到日志配置,可考虑关闭日志,或者调整日志保留时间(默认为90天)
chinadns-ng设置
关于chinadns-ng这部分,我不是直接单独使用这个插件,所以一些配置不好展开来讲,仅提供一个配置思路
基础说明
chinadns-ng的作用就是区分国内域名与海外域名(或者说容易污染的域名),进行分流分别请求不同的上游dns
- 对于国内域名,设置上游为AdGuardHome对应的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并不需要做什么特殊配置,在AdGuardHome那里设置了作为dnsmasq的上游服务器
对应的dnsmasq会自动进行如上设置调整,也就是将AdGuardHome作为dnsmasq的上游
踩坑分享:无法解析内网域名
之前配置了之后,出现一些内网域名无法解析,返回为空的情况,如下图:
- 域名请求状态为NOERROR,也就是没有错误
- 但是ANSWER为0,代表没有返回域名解析
依次进行排查,发现请求上游AdGuardHome是正常的,对应就是127.0.0.1:8053
那么可以肯定就是dnsmasq的问题了,最终排查到是开了重定向保护导致的
原因就是开启了该参数就会过滤掉外域名解析到私有IP地址,私有ip包含
写在后面
复杂方案确实是挺复杂
- 不弄清楚原理,很容易就配置失败或者配置了没啥用效果
- 并且要正确解析海外那些域名,你需要一个“良好的网络环境”,也就涉及到不止dns插件的配置了
目前我也是出于技术学习去搭建这些东西,不过也用了有半年错没啥问题:
- 效果不好说,因为我也没时间去做详细的数据对比,比如解析耗时、解析准确性
- 功能算是正常,至少没有出现什么解析耗时过长、解析不了的问题
但是我还是推荐,跑一个AdGuardHome去设置dnsmasq重定向就行了,简单可靠
ok,目前软路由openwrt的内容已经基本完结了,除了开头两篇,还有这两篇。后续再看看有什么好玩的可以分享~