Astra DNS:把 OpenWrt 上的优选 IP 和广告过滤合进一条更简单的 DNS 链路
项目地址:
astra-dns
luci-app-astra-dns
在 OpenWrt 上折腾 DNS,很多人最后都会走到一个相似的场景:我想让路由器负责全家的 DNS,同时希望它能做广告过滤,还希望访问 Cloudflare 站点时可以自动返回一个更快、更稳定的优选 IP。
单独看,这些需求都不罕见。
广告过滤可以交给 AdGuard Home。DNS 转发、分流、重写可以交给 MosDNS。Cloudflare 优选 IP 可以通过 CloudflareSpeedTest 之类的工具定期测速,再把结果写进 DNS 规则里。代理相关的域名处理,还可能再接入 Mihomo 等组件。
这些工具都很好,也都各自解决了真实问题。但当它们被串在一起时,整个 DNS 链路就会变得有些重。
一个典型的 motivating example
假设我们在 OpenWrt 上已经用了 MosDNS。MosDNS 很适合做 DNS 转发、分流和规则化处理,也可以把某些域名的解析结果改写到指定 IP。于是,如果我们想做 Cloudflare 优选 IP,一个自然的方案是:
- 用 CloudflareSpeedTest 定期测出当前网络下表现最好的 Cloudflare IP。
- 把这些 IP 写入 MosDNS 的 rewrite 规则。
- 当域名解析结果落在 Cloudflare 地址段时,让 MosDNS 返回优选 IP。
这条链路本身是合理的。
但问题来了:MosDNS 并不是广告过滤器。它可以做规则匹配和 DNS 编排,却不直接提供 AdGuard Home 那种完整的广告过滤体验。如果我们还想拦截广告域名,就往往需要再引入一个 DNS 服务,比如 AdGuard Home。
于是原本的需求变成了这样:1
2
3
4
5客户端
-> OpenWrt DNS 入口(dnsmasq)
-> AdGuard Home 负责广告过滤
-> MosDNS 负责分流、转发和 Cloudflare IP 重写
-> 上游 DNS
这当然能工作,很多成熟配置也正是这么搭起来的。但它带来的代价也很明显:
- 查询链路变长,每个 DNS 请求都可能跨过多个进程。
- 每个组件都有自己的配置文件、缓存、日志和排错方式。
- 出现问题时,很难第一时间判断到底是广告规则、rewrite 规则、上游 DNS,还是服务转发顺序出了问题。
- OpenWrt 设备资源有限,长期运行多个 DNS 服务并不总是优雅。
- 对普通用户来说,理解整条链路的心智成本很高。
Astra DNS 正是为了解决这个具体场景而设计的:当你只是想在路由器上同时获得广告过滤、DNS 转发和 Cloudflare 优选 IP 重写时,能不能不要把多个 DNS 服务串起来?



