写在前面

复杂方案看起来高大上的样子,但有可能并没什么用,反而引入其他插件依赖,出问题排查更麻烦,所以我更推荐简单方案

前面介绍了 openwrt 的插件时候挖了一个多级 DNS 的坑,现在补上

文章大纲如下

openwrt 软路由多级 DNS 配置学习分享

方案说明

AdGuard Home 本身是不具备域名解析分流功能,如果你看到的方案只有一个 AdGuard Home 对接两组 smartdns,那基本没啥用

普通方案

简单暴力,就是引入 AdGuard Home 就可以了

openwrt 软路由多级 DNS 配置学习分享

启用一个 AdGuard Home:

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

复杂方案

方案架构如下:

openwrt 软路由多级 DNS 配置学习分享

用到的组件也比较常规了:

  • dnsmasq,成熟的 dns 缓存服务
  • chinadns-ng,负责维护 chnroute 等列表,然后通过 dnsmasq 注入配置
  • AdGuard Home,提供基于 dns 拦截 AD 功能
  • smartdns,优化域名解析,防污染

接下来就是从后往前的进行配置

smartdns 配置

该工具主要提供了以下两个功能:

  1. 海外国内解析分流
  2. 最优解析延迟返回

在配置上,虽然版本有所更替,但基本的配置内容还是兼容的,如果是迁移路由可复制配置文件

/etc/config/smartdns

复制完成后执行 reload_config 生效,而对于全新部署的场景,这里也提供一些我的一些配置参考

基础配置说明

如上面的架构图,smartdns 是需要分两个组的,对应到配置就是:

  • 默认组(default),监听 6053 端口
  • 海外组(oversea),监听 7053 端口

这两者是互相独立了,具体使用哪个组,是由下游的 dns 缓存来决定

国内组

对应的就是 smartdns 的基础配置

  • 勾选启用
  • 本地端口设置 6053
  • 不需要勾选设置 dnsmasq,因为最终还是要通过 dnsmasq 来提供服务

openwrt 软路由多级 DNS 配置学习分享

国内组的上游 DNS,建议设置方式是:

  • 最优先使用运营商分配的 DNS 缓存服务器,以确保就近解析、避免跨运营商解析
  • 额外再补充一些国内公共 DNS,如 114DNS、DNSPOD、USTC 等
  • 全部默认使用 udp 协议即可

运营商分配的 DNS 缓存服务器,可通过主路由的 WAN 状态拿到,比如

openwrt 软路由多级 DNS 配置学习分享

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

openwrt 软路由多级 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
  • 下面一系列都是选择逃过,不要求能解析到多优秀的入口,只要能解析到就行

openwrt 软路由多级 DNS 配置学习分享

海外组的上游 DNS,建议设置方式是:

  • 尽量使用 TLS、HTTPS 协议
  • 尽量使用非标准端口
  • 如果有合理的网络条件,才考虑设置 UDP 协议 dns

openwrt 软路由多级 DNS 配置学习分享

这里以 cloudflare 的 https dns 为例:

  • DNS服务器名称,CloudFlare 1 号 DNS,对应 CloudFlare #1
  • IP 填写 cloudflare 的 https 解析入口
  • 类型使用 https
  • 服务器组修改为 oversea

最后在额外参数那里,增加 -exclude-default-group,避免默认组使用到该上游 DNS

openwrt 软路由多级 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,所以直接进入配置即可

更新核心版本

进入服务配置页面后,先点击 更新核心版本

openwrt 软路由多级 DNS 配置学习分享

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

openwrt 软路由多级 DNS 配置学习分享

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

配置使用

openwrt 软路由多级 DNS 配置学习分享

点击开始配置,接下来需要设置两个端口:

  • 网页管理界面:所有接口 3000 端口
  • DNS 服务器:所有接口 8053 端口

再设置用户名密码,后续其他的就按照默认即可,设置完成后会跳转到登录页面,输入用户密码登录:

openwrt 软路由多级 DNS 配置学习分享

然后再页面上方点击 设置 - DNS 设置

  • 上游服务器输入 smartdns 的国内分组对应端口 127.0.0.1:6053
  • 同样,Bootstrap DNS 服务器也是填入国内分组 127.0.0.1:6053

bootstrap dns 并不是用来解析海外 dns 的,而是用来解析一些写了域名的 DNS 服务器

最后点击测试上游服务器,确认能正常运行即可,最后点击 **应用 **进行保存

openwrt 软路由多级 DNS 配置学习分享

DNS 服务配置:

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

openwrt 软路由多级 DNS 配置学习分享

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

openwrt 软路由多级 DNS 配置学习分享

至此,DNS 基础配置已经完成,其他的加密设置、客户端设置、DHCP 设置均用不到。

目前广告商也都是在与时俱进的,所以别想着一个 AdGuard Home 就能解决所有问题,只能拦截掉一部分

接下来进入过滤器配置,这里主要添加了 4 个黑名单过滤广告

openwrt 软路由多级 DNS 配置学习分享

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

openwrt 软路由多级 DNS 配置学习分享

这里选择:作为dnsmasq的上游服务器

踩坑分享:日志配置

在配置完某一天,电脑访问网页出现打不开情况

openwrt 软路由多级 DNS 配置学习分享

但是通过 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 问题,然后查看日志发现是磁盘被打满了

openwrt 软路由多级 DNS 配置学习分享

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

openwrt 软路由多级 DNS 配置学习分享

设置->常规设置中,下拉找到日志配置,可考虑关闭日志,或者调整日志保留时间(默认为 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

openwrt 软路由多级 DNS 配置学习分享

在对应插件的基本设置中,进入 DNS 配置页面,进行如下调整:

  • 过滤模式通过 UDP 请求 DNS
  • 远程 DNS 设置为 smartdns 的海外分组 127.0.0.1:7053
  • 启用 ChinaDNS-NG 功能

在进行如上设置后,最终会在 dnsmasq 的子配置目录下注入新的配置

openwrt 软路由多级 DNS 配置学习分享

其中 127.0.0.1#7053 就是 smartdns 的 oversea 分组,也就是可信 DNS,从而能获取到正确域名解析

Dnsmasq 配置

基础设置

实际上 dnsmasq 并不需要做什么特殊配置,在 AdGuard Home 那里设置了作为dnsmasq的上游服务器

openwrt 软路由多级 DNS 配置学习分享

对应的 dnsmasq 会自动进行如上设置调整,也就是将 AdGuard Home 作为 dnsmasq 的上游

踩坑分享:无法解析内网域名

之前配置了之后,出现一些内网域名无法解析,返回为空的情况,如下图:

  • 域名请求状态为 NOERROR,也就是没有错误
  • 但是 ANSWER 为 0,代表没有返回域名解析

openwrt 软路由多级 DNS 配置学习分享

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

openwrt 软路由多级 DNS 配置学习分享

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

openwrt 软路由多级 DNS 配置学习分享

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

openwrt 软路由多级 DNS 配置学习分享

写在后面

复杂方案确实是挺复杂

  • 不弄清楚原理,很容易就配置失败或者配置了没啥用效果
  • 并且要正确解析海外那些域名,你需要一个“良好的网络环境”,也就涉及到不止 dns 插件的配置了

目前我也是出于技术学习去搭建这些东西,不过也用了有半年错没啥问题:

  • 效果不好说,因为我也没时间去做详细的数据对比,比如解析耗时、解析准确性
  • 功能算是正常,至少没有出现什么解析耗时过长、解析不了的问题

但是我还是推荐,跑一个 AdGuard Home 去设置 dnsmasq 重定向就行了,简单可靠

ok,目前软路由 openwrt 的内容已经基本完结了,除了开头两篇,还有这两篇。后续再看看有什么好玩的可以分享~

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

,

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。