SmartDNS
SmartDNS 是一个运行在本地的 DNS 服务器软件,它接收本地客户端的域名解析请求,同时向多个上游 DNS 服务器发起查询,再把从本地访问速度最快的解析结果返回给客户端,以此改善网络访问体验。[1] 该软件由开发者彭瑞林(Nick)以 pymumu 的名义维护,2018 年起以 GPL V3 协议开源,支持 OpenWrt、树莓派、华硕路由器固件以及 Windows 等多种平台,并可通过域名分组实现国内外域名分流解析。
定义
SmartDNS 是一款运行在本地网络中的 DNS 服务器程序,其代码以 C 语言编写,定位是获取访问最快的网站 IP 地址。 它并不直接托管域名的权威记录,而是处在客户端与上游递归服务器之间,充当转发与择优的中间层。[1]
按照官方项目的说明,该软件接受来自本地客户端的解析请求,向多个上游 DNS 服务器并发查询,再把访问延迟最低的结果交还客户端。[1] 这一点与 dnsmasq 的 all-servers 模式不同:后者会把所有上游返回的地址一并交给客户端,而前者只挑选其中最快的一条。[2]
原理
SmartDNS 的工作流程分为 4 个步骤:先接收局域网内设备发出的 DNS 查询,再把请求同时发往配置好的多个上游服务器,然后从上游返回的地址列表中探测本机访问速度最快的 IP,最后将该地址返回给客户端。[1] 探测方式包括对 TCP 80 端口、TCP 443 端口以及 ping 时延的检测,速度比较针对的是实际连接路径,而不只是 DNS 服务器本身的响应快慢。[3]
该软件在协议层面支持 UDP、TCP 等传统查询方式,也支持 DoT、DoH、DoQ 和 DoH3 等加密传输,并可监听 53 以外的端口。[1] 对加密上游的查询还可以经由 socks5 或 HTTP 代理转发,从而让域名解析流量与代理通道结合。[2]
分流依靠上游分组实现。配置文件中的 server 条目可以用 -group 参数划入不同分组,再通过 nameserver 规则把特定域名后缀指向对应分组,形成国内域名走国内解析、境外域名走境外解析的结构。[3] 除域名后缀匹配外,软件还支持将解析结果写入 ipset 与 nftset 集合,供路由层直接使用;测速失败时也可以按设定把结果归入相应集合。[1] 后缀匹配经过专门优化,过滤 20 万条记录的时间小于 1 毫秒。[2]
发展历程
SmartDNS 项目由彭瑞林以 pymumu 的名称建立,代码仓库创建于 2018 年 4 月 22 日,源文件中的版权声明从 2018 年起算。 项目采用 GPL V3 协议发布,此后被收录进 Debian、Ubuntu 等发行版的软件源,并由 OpenWrt 的软件包仓库维护其构建配方。[4]
随着版本迭代,软件在加密协议支持上逐步扩展。早期文档描述的特性集中在 DoT 与 DoH,后续版本的说明中已列明对 DoQ、DoH3 的支持,并增加了 DNS64 转换、IPv4 与 IPv6 双栈优选等功能。[2] 围绕主程序还出现了若干衍生与配套项目,其中 SmartDNS-rs 是以 Rust 语言重写、意图兼容原有配置格式的跨平台实现,作者说明该项目当时仍处于开发阶段。[5]
应用
该软件最常见的部署位置是 OpenWrt 路由器与软路由系统,通过软件包安装后在路由器上提供解析服务,让局域网内所有设备的域名查询统一经过它处理。[3] 除路由器外,官方说明还列出对标准 Linux 系统(如树莓派)、华硕路由器原生固件以及 Windows 的 WSL 环境的支持。[2]
在复合方案中,SmartDNS 常被放在解析链路的后段。有实践把 AdGuard Home 作为面向客户端的入口负责过滤,再由 SmartDNS 承担上游测速与缓存,按国内、代理、备用三组上游分别监听不同端口。[6] 这类组合也见于 Android 平台的模块化部署,通过 iptables 将 53 端口的请求重定向到本地服务,由过滤组件与 SmartDNS 依次处理。[7]
域名分流是另一类主要用法。借助社区维护的域名列表,可以将待解析域名划分为直连、代理等类别,分别交由不同的上游分组解析,并利用结果 IP 是否属于国内地址来决定是否采纳解析结果。[6] 此外,通过配置特定域名的静态地址或屏蔽规则,该软件也可用于过滤广告与拦截指定域名。[5]
在流媒体场景中,它被用来把指定平台或地区的域名解析指向具备相应访问条件的服务器,从而由不同服务器分别处理不同区域的解锁需求。[8]
局限
SmartDNS 本身不是完整的递归解析器,也不内置庞大的过滤规则库,其分流效果依赖用户自行配置上游分组和域名列表。相关实践指出,若域名清单收录不全,未列入名单的域名可能解析到不理想的地址,出现访问缓慢的情况。[9]
分流规则按域名匹配,而同一站点可能使用大量子域名,规则覆盖难以完全跟上。项目讨论中有用户反映部分视频类域名因清单遗漏而出现播放卡顿,维护者亦认为域名数量过多导致收集不全。[10]
配置复杂度是另一项限制。有使用者在对比方案时提到,该软件的配置较为繁琐,需要同时理解代理软件的解析流程与自身的分组、测速机制,才能得到预期的分流结果。[11] 此外,C 语言版本对平台的支持存在边界,MacOS 与 Windows 主要借助 Docker 或 WSL 运行,这也是 Rust 重写版本出现的直接动因。[5]
参见
参考资料
- SmartDNS [引用日期2026-10-14]
- nee207/smartdns: smart dns server · GitHub [引用日期2026-10-14]
- SmartDNS 多上游测速 DNS 服务器指南 | 部署、分流与对比(2026版) | 冲浪笔记 [引用日期2026-10-14]
- +copyright [引用日期2026-10-14]
- SmartDNS-rs [引用日期2026-10-14]
- 217heidai/nestingdns repository overview [引用日期2026-10-14]
- hoshitele-dns-module [引用日期2026-10-14]
- Smartdns_sniproxy_installer [引用日期2026-10-14]
- openwrt 通过smartdns 加速国外网站访问 [引用日期2026-10-14]
- github.com 上的网页 [引用日期2026-10-14]
- 【分享自用极速DNS方案】AdGuard + SmartDNS + OP【去广 + 防泄漏分流 + 课学】 [引用日期2026-10-14]