OpenWrt DNS 加速神器 SmartDNS:分流与缓存,告别 DNS 污染
写在前面
先定个目标:解决三类很常见的上网问题——网页首屏转圈、偶尔打不开、同一个网址时快时慢。排查到最后,根子往往不在带宽,而在 DNS:设备把域名解析成 IP 这一步出了问题。解决手段选的是软路由上口碑很稳的 SmartDNS,一款开源的本地 DNS 服务器,核心三件事:缓存解析结果、按域名分组上游、测速返回最快 IP。
全文走实测路线:测试环境是 OpenWrt 24.10.7(QEMU 虚拟机,x86_64),LuCI 中文界面,SmartDNS 和 luci-app-smartdns 都从 OpenWrt 官方软件源安装(版本见「安装与版本」表格),所有界面路径、默认值、命令都在这套环境里实际点过、敲过。DNS 基础概念(设备怎么发 DNS 请求、dnsmasq 怎么转发)在《软路由入门(三):首次配置与旁路由》讲过,这篇文章默认你已经有一台能正常上网的 OpenWrt。
阅读建议:只想让国内网页打开快一点,从「上游服务器配置」开始,国内单组就够;家里已经装了 AdGuard Home 去广告的,「和 AdGuard Home 组 DNS 双件套」是重点章节,链路顺序搞反会全家断网;想玩透缓存、第二端口、自定义规则的,直接读「深入配置」。
DNS 为什么需要优化:污染、劫持、慢
一次网页访问里的 DNS 环节
浏览器输入网址回车,第一件事不是连服务器,而是先问 DNS:“这个域名对应的 IP 是多少”。这个请求走 UDP 协议、目标端口 53,发给设备上配置的 DNS 服务器——默认就是路由器自己。路由器上的 DNS 服务(OpenWrt 里是 dnsmasq)如果自己不知道答案,会把请求转发给它的上游 DNS 服务器,拿回结果后先存进自己的缓存,再回给设备;设备自己也缓存一份,下次访问同样的域名就不用再问一遍。缓存能留多久由 TTL 决定,TTL 到期,这条记录就从缓存里删掉,重新走上游查询。
这一段链路里任何一个环节慢,网页就慢:上游响应慢、缓存命中率低、请求被劫持、结果被污染,各有各的表现。
把这整段画成一条链,就是 DNS 优化的全部战场:
设备(浏览器)
↓ UDP 53 查询"域名→IP"
路由器 dnsmasq(默认 DNS)
↓ 自己没有缓存,转发
运营商下发的上游 DNS(PPPoE 拨号时自动分配)
↓ 逐级查询
根/权威 DNS → 返回解析结果
↓ 路由器缓存(TTL 到期前)
设备收到 IP,开始建连
注意一个细节:运营商下发的 DNS 服务器来自 PPPoE 拨号时自动分配,质量不受你控制——这正是很多人直接改 DNS 地址、换公共 DNS 的原因。SmartDNS 做的,就是把这条链里的"上游 DNS"这一段换成你自己选的、分组的、会测速的多台上游。
国内用户的三个真实痛点
第一个是 DNS 污染运营商或中间设备对 DNS 查询返回错误结果,让域名解析到错误 IP,导致网站访问失败或跳转广告。 :网络中间设备对 DNS 查询返回错误结果,让域名解析到错误 IP。对国内用户来说最典型的是访问境外网站时,查询在链路上被干扰,返回一个不存在的 IP,表现为"网页打不开、偶尔能打开"。
第二个是 DNS 劫持运营商或中间设备在 DNS 链路上改写解析结果,把用户导向广告页或自有缓存服务器,解析结果不受用户控制。 :运营商在链路里把解析结果改写成自己的页面,最常见的就是访问不存在的域名时跳转运营商广告页,还有把部分资源域名劫持到运营商的缓存服务器,解析结果不受你控制。
第三个是慢:运营商下发的 DNS 服务器质量参差不齐,跨运营商链路绕路、高峰期丢包,一次解析几百毫秒很正常;再加上很多站点的 TTL 设置短,缓存刚存上就过期,每次访问都重新走上游,首屏自然慢。
DNS 优化的边界:能解决的与不能解决的
SmartDNS 这类工具能解决的,是上面三类里的解析准确性和解析速度:用多组上游互相备份、避开污染源,用 DNS 缓存DNS 服务器把解析结果临时保存一段时间,TTL 到期前再次查询同域名直接返回,不再访问上游。 减少重复查询,用 测速选优对多个上游返回的多个候选 IP 做连通性测速,把访问最快的结果返回给客户端。 挑最快的 IP 返回。它不能解决带宽不足、服务器本身慢、跨网路由绕路这些传输层问题——这些得靠换宽带、换线路、上 CDN 解决。“装了 DNS 工具网速变快"大多出现在原本 DNS 配置就有问题的场景,比如运营商 DNS 又慢又被劫持;正常网络下感知最明显的是"网页打开更快、打不开的情况变少”,不是下载带宽变大。
SmartDNS 是什么
一个开源的本地 DNS 服务器
开源的本地 DNS 服务器,从多个上游获取解析结果并返回最快 IP,支持域名分流与广告过滤。
SmartDNS 的官方定位一句话:本地 DNS 服务器,从多个上游 DNS 获取查询结果,把访问速度最快的结果返回给客户端。它由开发者 Nick Peng(GitHub 名 pymumu) 用 C 语言编写,GPL-3.0 协议,2018 年 4 月在 GitHub 开源,仓库约 1.1 万 Stars(截止到本文更新时间)。作者在恩山论坛的发布帖里写明,开发动机是自己的使用需求,不是商业项目——这解释了它为什么一直免费、没有会员分层。
功能也是一路加出来的:早期版本只做"多上游取最快 IP",2022 年的版本把 dnsmasq 自动接管做成了安装默认行为;2023 年 5 月的 Release42 给 server 参数加了 bootstrap-dns(专用引导 DNS)和 subnet(ECS 模拟)选项,luci 第二服务器页也补上了 ipset、nftset 支持。这套"内核 C 语言 + LuCI 界面"的架构从 2018 年沿用到现在,配置文件的兼容性一直没断过。
和同类工具不一样的地方在于,SmartDNS 已经合入主流发行版的软件仓库,OpenWrt 官方安装文档直接给 opkg install 的装法,luci-app-smartdns 这个图形界面插件也是作者本人维护、同步进官方源的,装完不用碰命令行配置文件。核心能力一张表:
| 能力 | 说明 |
|---|---|
| DNS 缓存 | 缓存上游解析结果,命中后不再重复查询上游 |
| 测速选优 | 对多个上游返回的多个 IP 测速,返回最快的那个 |
| 域名分流 | 按域名规则把查询交给不同组的上游(国内组/国外组) |
| 域名屏蔽 | 把指定域名解析到无效地址,就是 DNS 级去广告 |
| 加密上游 | 支持 DoT、DoH、DoQ,上游查询走加密链路 |
| 第二服务器 | 再开一个监听端口,绑定不同的上游分组 |
和 AdGuard Home 的分工:它管拦截,SmartDNS 管解析
AdGuard Home 和 SmartDNS 都做 DNS,但干的是两件事:AdGuard Home 的核心是过滤拦截——用黑名单把广告域名解析成无效地址;SmartDNS 的核心是解析加速——把查询交给最合适的上游、返回最快的 IP。用一条广告的加载链路看就清楚了:广告域名解析失败 → 广告加载不出来(AdGuard 的活);正常域名解析又快又准 → 网页打开顺畅(SmartDNS 的活)。
两个都装不冲突,反而能串成一条链(后面「双件套」章节详述):AdGuard Home 负责拦,SmartDNS 负责快,各管一段。只装 AdGuard Home 的问题在于,所有域名都走同一组上游,国外域名解析受污染影响时去广告服务也跟着不稳;只装 SmartDNS 的问题在于,它能屏蔽域名,但黑名单管理、查询统计、误杀排查都比 AdGuard Home 弱一截。软路由上两个都装,是 DNS 层面最完整的组合。
安装:官方源一条命令
安装与版本
OpenWrt 官方软件源里就有现成的包,装法和普通插件一样(opkg 换国内镜像源的配置在《软路由入门(四):插件与系统维护》里有完整教程,这里只给装法):
root@OpenWrt:~# opkg update
...(软件源更新输出)...
root@OpenWrt:~# opkg install luci-app-smartdns
...(自动装上 smartdns 依赖)...
root@OpenWrt:~# /etc/init.d/smartdns enable
root@OpenWrt:~# /etc/init.d/smartdns start
装 luci-app-smartdns 会自动带上 smartdns 本体,不需要分两次装。装完在 LuCI 左侧菜单 Services(服务)→ SmartDNS 进入配置页。测试环境里两个包的实际版本:
| 软件包 | 版本 | 说明 |
|---|---|---|
| smartdns | 1.2023.43 | OpenWrt 官方源版本(2023-08 更新),缓存、分流、测速核心功能齐全 |
| luci-app-smartdns | 1.2023.42 | LuCI 图形界面,作者 Nick Peng 维护,随官方源分发 |
官方源版本停在 2023 年:追新与稳定
两个版本号看着旧,是因为 OpenWrt 官方源没有跟着作者仓库同步更新:截止到本文更新时间,官方源里的 smartdns 还停留在 1.2023.43(2023 年 8 月的包)。作者 pymumu/smartdns 仓库一直在发新版本,新版本加了 DoQ、DoH3 这类新协议支持。我的建议:默认用官方源,稳定优先。DNS 服务是全家上网的底层,官方源版本经过 OpenWrt 发行版测试,够用;真想追新,去作者仓库下载对应平台的 ipk 手动安装,装完留意升级固件时会不会被覆盖。
首次配置:主页面逐项看
主页面总览
打开 SmartDNS 配置页,顶部是 常规设置、上游服务器、域名规则、高级设置、Second Server Settings、DNS64 Server Settings、Download Files Settings、Proxy Server Settings、Custom Settings 共 9 个标签页(域名规则里还有 5 个子 tab),初始状态如图:

图注:主配置页常规设置:启用开关、Server Name、本地端口 53、Automatically Set Dnsmasq 已勾选;下方是空的上游服务器列表和域名规则区
常规设置里有四个关键项:
- 启用(Enable):SmartDNS 服务的总开关。
- Server Name:服务名称,默认
smartdns,不用改。 - 本地端口:SmartDNS 自己监听的端口,默认 53——这个必须改,原因见下。
- Automatically Set Dnsmasq:是否自动把 dnsmasq 的解析接到 SmartDNS,默认已勾选,含义见下。
本地端口 6053:三个服务三个端口
53 端口是 DNS 的默认端口,但 OpenWrt 上 53 已经归 dnsmasq——系统的 DHCP 和 DNS 转发都靠它,SmartDNS 再监听 53 会直接冲突。装了 AdGuard Home 的家庭,5353 又归了 AdGuard。所以 SmartDNS 的本地端口改到 6053,三个服务各占一个端口,互不干扰。记住这个分配:
| 服务 | 端口 | 职责 |
|---|---|---|
| dnsmasq | 53 | DHCP 分配 + 全屋 DNS 入口(默认) |
| AdGuard Home | 5353 | 广告域名过滤拦截 |
| SmartDNS | 6053 | 上游分组 + 缓存 + 测速选优 |
Automatically Set Dnsmasq 的三种协作方式
这个选项决定 SmartDNS 怎么和 dnsmasq 协作,官方安装文档写得很明确,三种情况:
- 本地端口设为 53:SmartDNS 自动接管 dnsmasq,成为主 DNS。和代理插件、其他 DNS 工具叠用时容易出问题,官方建议改非 53 端口。
- 本地端口非 53 + 勾选 Automatically Set Dnsmasq:自动把 SmartDNS 配置成 dnsmasq 的上游,链路是设备 → dnsmasq → SmartDNS → 上游 DNS。
- 本地端口非 53 + 取消勾选:SmartDNS 作为独立 DNS 服务运行,不接管 dnsmasq,谁要用就手动把 DNS 指到
路由器IP#6053。
单独跑 SmartDNS 用第二种方式:6053 + 勾选自动设置;要和 AdGuard Home 组双件套,取消勾选、手动配 dnsmasq 转发(原因在双件套章节)。改完点「保存并应用」,回主页面看到 SmartDNS 状态变成"运行中"(绿色)就说明服务起来了。
SmartDNS 装好只是"服务在跑",设备不把 DNS 请求发给它,加速就是空转。让设备用上它,按你的网络架构选一种姿势:
▸生效方式:全屋自动 / 单机手动 / DHCP 指定下发
全屋自动(最省事):靠 Automatically Set Dnsmasq 或 LuCI 的 Network → DHCP and DNS → 高级设置 → DNS 转发 指到 SmartDNS 端口,dnsmasq 收到全屋设备的解析请求后统一转过去,设备零配置。主路由模式下用这个。
单机手动:只想让一两台设备走 SmartDNS,在手机/电脑的网络设置里把 DNS 手动填成 路由器IP(53 端口,由 dnsmasq 转发)或 路由器IP:6053(直连 SmartDNS,需要 SmartDNS 取消勾选自动设置、作为独立服务监听内网)。其他设备不受影响。
DHCP 指定下发:在 Network → DHCP and DNS → Advanced Settings → DHCP Options 里加一条 6,<路由器IP>,让 DHCP 直接把自定义 DNS 发给设备。适合"全屋都走 SmartDNS,但想跳过 dnsmasq 转发"的玩法。
三种姿势的共同点:改完都要等 DNS 缓存过期或手动清缓存才生效,验证方法见「实测效果」。
这里的 6, 是 dnsmasq 里 DNS 服务器的 DHCP 选项编号,机制在《软路由入门(三):首次配置与旁路由》的 DHCP 章节讲过,不重复展开。
上游服务器配置:国内组 + 国外组
上游分组与测速选优
上游服务器AdGuard Home 自己无法解析时转发查询的公共 DNS 服务器,相当于 DNS 请求的二级代理。
是 SmartDNS 自己搞不定解析时,转发查询的公共 DNS。SmartDNS 的玩法是不只用一台,而是配多台,再按域名分组:给上游填一个 Server Group(服务器组) 名字,比如国内组叫 china、国外组叫 oversea,后面域名规则里指定"哪个域名走哪个组"。
配多台上游的核心机制是测速选优:SmartDNS 向组内所有上游同时发查询,拿到多个候选 IP 后,按测速结果返回访问最快的那一个。官方测速模式说明里写明了默认三轮:先 ping,再探测 tcp:80,最后探测 tcp:443,取综合最快的;这个顺序可以在高级设置里用 speed-check-mode 调整。测速带来的实际收益是:同一个 CDN 域名在全国有大量节点 IP,运营商网络不同、最优节点不同,SmartDNS 会按你当前网络挑。
▸方案一:国内单组双上游,覆盖绝大多数家庭场景
适用场景:主要上国内网站,不关心境外解析,或者境外流量走代理工具(代理自己解析)。
- Server Group 填
china,添加两台上游:223.5.5.5(阿里 AliDNS) 和 119.29.29.29(腾讯 DNSPod)。 - 两台都是国内公共 DNS,响应快、符合国内网络环境;配两台是为了互相备份,一台抽风另一台顶上。
- 不做域名分流,所有查询都走这组。改完保存应用,用
dig @127.0.0.1 -p 6053验证(命令见「实测效果」)。
几家常被拿来当上游的公共 DNS 放一起对比:
| 公共 DNS | IP | 特点 |
|---|---|---|
| 阿里 AliDNS | 223.5.5.5 | 国内响应快,有 DoT/DoH 服务 |
| 腾讯 DNSPod | 119.29.29.29 | 国内响应快,有 DoT/DoH 服务 |
| 114DNS | 114.114.114.114 | 老牌,广告拦截版可选 |
| Cloudflare | 1.1.1.1 | 国外快,隐私强,DoT/DoH/DoQ 齐全 |
| 8.8.8.8 | 国外老牌,被干扰时可用 DoT 缓解 |
国内组优先选前三个,国外组选后两个,组内两台互为备份就够了。
▸方案二:国内国外双组,配合域名分流
适用场景:直连访问境外网站较多,或者想让境外域名解析更稳定。
- 国内组:Server Group 填
china,上游223.5.5.5、119.29.29.29。 - 国外组:Server Group 填
oversea,上游1.1.1.1(Cloudflare)、8.8.8.8(Google);网络能直连 DoT 的可以把国外组上游写成tls://1.1.1.1、tls://8.8.8.8,解析结果在传输中不可篡改。 - 两组配好后,还要在「域名规则」里告诉 SmartDNS 哪些域名走国外组,否则所有查询还是走默认组——这是下一章的内容。
域名分流按域名把 DNS 查询分给不同的上游服务器组,国内域名走国内 DNS、国外域名走国外 DNS,兼顾速度与准确性。 就是把查询按域名分给不同的上游组:国内域名交给国内组(快),国外域名交给国外组(不易被污染),一刀切全走一组,总有半头吃亏。
域名分流:国内域名走国内组
域名规则的 5 个子 tab
「域名规则」标签页下有 5 个子 tab,功能各管一块:
| 子 tab | 作用 |
|---|---|
| DNS 转发设置 | 把指定域名的查询转发给指定服务器组 |
| DNS 屏蔽设置 | 把指定域名解析成无效地址(去广告) |
| Domain Rule List | 上传域名列表文件,按列表批量套规则 |
| 域名地址 | 指定域名直接返回固定 IP |
| IP 黑名单 | 屏蔽返回特定 IP 的解析结果 |
Domain Rule List:把国内域名挂给国内组
国内网站成千上万,一条条加不现实,Domain Rule List 支持上传域名列表文件(每行一个域名),再给这份列表指定 Server Group 和规则。最典型的用法:把常用国内域名列表交给 china 组。列表文件可以自己维护,也可以从作者仓库的域名集目录取现成的,/etc/smartdns/domain-set/ 是默认存放目录。上传后记得在规则里选对 Server Group,保存应用。
实际配置里,大部分人的分流需求就一句话:国内域名走国内组,其余走国外组。实现上分两步:先用 Domain Rule List 把国内域名挂给 china 组,再把默认组的上游换成国外组(或把国外域名列表挂给 oversea 组)。想更省事,可以跳过域名规则,让 SmartDNS 全部走国内组,境外访问交给代理工具——这是和代理插件共存时最常见的组合。
国内域名列表从哪来,是新手问得最多的一个问题。三条路:第一条,自己维护一个小列表,只放常用网站,几十行够用;第二条,用现成的国内域名合集,网上有热心人维护的 china-list 这类项目,定期更新,把下载地址填进 SmartDNS 的 Download Files Settings 标签页,它可以定时自动拉取;第三条,反着来——列表只放国外域名(思路类似代理圈的 gfwlist),其余默认走国内组。三条路的效果差别不大,选一条能稳定更新的就行,列表文件大了反而拖慢规则匹配。
规则语法速览
想精确控制某个域名,在 Custom Settings 或配置文件里用 domain-rules 语法,格式是 域名 -参数:
domain-rules /baidu.com/ -group china # 该域名走 china 组
domain-rules /ads.example.com/ -address #6 # 该域名解析到无效地址(屏蔽)
domain-rules /example.com/ -speed-check-mode none # 该域名不做测速
其中 -group 指定上游组、-address #6 表示解析到无效地址(6 是 AAAA 记录,常用于屏蔽)、-speed-check-mode none 关闭测速。多级域名规则支持用 - 和 . 匹配主域名,完整语法见官方域名规则文档。
和 AdGuard Home 组 DNS 双件套
双件套的分工与链路
这是这篇文章的重点:AdGuard Home 拦截 + SmartDNS 分流加速,一套链路把 DNS 的"拦"和"快"都占了。只装 AdGuard Home 时,链路是设备 → dnsmasq → AdGuard → 上游,AdGuard 拦广告,但上游只有一组,国外域名解析不稳时,去广告服务也跟着抖。叠上 SmartDNS 后,链路变成:
设备
↓ DHCP 下发 DNS = 路由器
dnsmasq(53)
↓ DNS 转发
AdGuard Home(5353,过滤拦截)
↓ 上游
SmartDNS(6053,分流 + 缓存 + 测速)
↓ 按域名分组
国内组(223.5.5.5 / 119.29.29.29) 国外组(1.1.1.1 / 8.8.8.8)
每跳的职责:dnsmasq 收全屋查询,AdGuard 拦广告,SmartDNS 决定问谁、返回最快的 IP。广告域名在 AdGuard 这层就被解析成无效地址,不会走到 SmartDNS;正常域名一路畅通到 SmartDNS,按国内/国外分组找上游。
双件套配置步骤
▸双件套配置步骤(AdGuard 5353 + SmartDNS 6053)
前提:AdGuard Home 已经装好并监听 5353(不会配的,先按《OpenWrt 去广告神器 AdGuard Home》走一遍)。
- SmartDNS 本地端口改 6053,取消勾选 Automatically Set Dnsmasq,保存应用。取消勾选的原因:双件套里 dnsmasq 的转发要手动指给 AdGuard,不能让 SmartDNS 的自动设置半路截胡。
- SmartDNS 配好国内组 + 国外组(上一章方案二),并把国内域名列表挂给国内组。
- AdGuard Home 的上游指向 SmartDNS:进入 AdGuard 后台的 设置 → DNS 设置,上游 DNS 服务器填
127.0.0.1:6053,保存。 - dnsmasq 把查询交给 AdGuard:LuCI Network → DHCP and DNS → 高级设置 → DNS 转发,填
127.0.0.1#5353(AdGuard 教程里做过的话就保持)。 - 验证链路:
dig @127.0.0.1 -p 5353 www.qq.com能出结果,说明 AdGuard 正常;dig @127.0.0.1 -p 6053 www.qq.com能出结果,说明 SmartDNS 正常;两步都通,链路就串起来了。
双件套的第一个坑是链路顺序:AdGuard 的监听端口和它的上游是两回事——AdGuard 监听 5353 收 dnsmasq 的转发,同时把查询转发给上游 6053 的 SmartDNS,这个"下游接 dnsmasq、上游接 SmartDNS"的顺序不能反。反了会变成 SmartDNS 去问 AdGuard,广告过滤全失效,还多绕一圈。
第二个坑是别让两套规则打架:SmartDNS 的域名屏蔽和 AdGuard 的过滤列表功能重叠,两处都配屏蔽规则,误杀面翻倍。屏蔽只管 AdGuard 一层,SmartDNS 只做分流和加速,别在 SmartDNS 里再配一套广告屏蔽列表。
深入配置(进阶篇)
缓存调优
SmartDNS 的缓存默认就开着,cache-size 默认 32768 条,一般不用手动设,官方缓存文档明确说它会根据系统内存自动调整。值得手动开的三个开关(都在高级设置里):
- prefetch-domain(域名预取):缓存快过期时主动提前查询,避免设备访问时刚好过期、重新等待上游。打开后首屏"卡一下"的情况明显减少。
- serve-expired(过期响应):缓存过期但没来得及刷新时,先用旧结果顶着,同时后台刷新。追求稳定优先开启。
- cache-persist(持久化缓存):把缓存写到磁盘文件,重启路由后缓存不丢,开机前几分钟的解析速度不用重新爬坡。
缓存时长用 rr-ttl 系列参数控制:rr-ttl-min 和 rr-ttl-max 限定单条记录的缓存上下限,rr-ttl-reply-max 控制回给客户端的 TTL。默认值够用,改小让解析更"新鲜"但更频繁走上游,改大更省上游但域名换 IP 后要等更久。
Second Server:第二端口分流
Second Server Settings 允许 SmartDNS 再开一个监听端口,绑定不同的上游分组。典型场景:家里一部分设备直连、一部分走代理,可以用第二个端口给直连设备单独开一组"纯净上游",互不干扰。配置文件里对应的是 bind 指令:
bind :6053 # 主服务器,default 组
bind :7053 -group public # 第二服务器,绑定 public 组
LuCI 的 Second Server Settings 标签页里填第二监听端口和要绑定的 Server Group 即可。设置完,第二服务器的设备手动把 DNS 指到 路由器IP:7053 就能用上这组上游。
自定义规则完整语法
前面「规则语法速览」给过基础版,这里补完整用法:自定义规则写在 Custom Settings 标签页(或 /etc/smartdns/smartdns.conf 的 domain-rules 段),优先级上精确匹配优先于列表匹配,列表文件用 domain-set 引用:
domain-set -name cn-domains -file /etc/smartdns/domain-set/cn.txt
domain-rules /domain-set:cn-domains/ -group china
domain-rules /v2ex.com/ -group oversea -speed-check-mode none
domain-rules /analytics.example.com/ -address #6
▸和 OpenClash / PassWall 的三种接线方式
家里跑了代理插件的,SmartDNS 的接法和裸路由不同,三种接线按需求选:
SmartDNS 只做插件上游:插件接管 53,把插件的 DNS 上游填成 127.0.0.1:6053。SmartDNS 的分流和缓存对代理流量一样生效,插件只管代理转发。适合代理插件已经跑稳、只想补 DNS 加速的场景。
插件只管代理流量,SmartDNS 管直连:插件只接管代理规则命中的流量,直连流量的 DNS 走 SmartDNS。代理和直连互不干扰,缺点是规则边界要理清楚,容易漏。
fakeip 模式,SmartDNS 靠边站:OpenClash 的 fakeip 模式里,内核自己管理域名和 IP 的映射,SmartDNS 只作为它的上游做解析,别在 SmartDNS 里配域名屏蔽去和代理抢活,双重规则只会放大误杀。
三条路的共同前提:别让插件和 SmartDNS 同时监听 53,先到先得,后起的那个起不来。
IP 组与加密上游
IP 黑名单子 tab 和 ipset/nftset 是给进阶玩法留的口子:解析结果命中黑名单 IP 直接丢弃,或者把分流结果写进 ipset,和 PassWall、OpenClash 这类代理插件联动(代理按 ipset 判断哪些 IP 走代理)。这个玩法主要在代理插件场景里用,普通家庭配好双件套就够,不需要碰。
上游加密方面,SmartDNS 支持 DoT、DoH、DoQ:国内组可加 server-https https://dns.alidns.com/dns-query(阿里 DoH),国外组可加 server-tls 1.1.1.1、server-https https://dns.google/dns-query。加密上游防的是"传输中被篡改",并不会让解析更快,多一层握手多一层延迟;国内网络对 DoT 的 853 端口常有干扰,直连不通时退回普通 UDP 上游即可。
实测效果:dig 验证与缓存命中
dig 输出怎么读
验证 DNS 最快的工具是 dig,OpenWrt 上装个 bind-dig 就能用(或 nslookup)。指定 SmartDNS 端口查询:
root@OpenWrt:~# dig @127.0.0.1 -p 6053 www.qq.com
;; QUESTION SECTION:
;www.qq.com. IN A
;; ANSWER SECTION:
www.qq.com. 30 IN A 58.250.137.36
;; Query time: 68 msec
输出里三个关键信息:ANSWER SECTION 里的 A 记录是解析结果(IP 对不对、是不是污染地址);Query time 是本次查询耗时;status 字段 NOERROR 表示解析成功,SERVFAIL 表示上游没答上来。
缓存命中的验证方法
缓存是 SmartDNS 提速的大头,验证方法很简单:连着查两次同一个域名,第二次的 Query time 会明显低于第一次——第一次走上游(几十到几百毫秒),第二次命中 缓存命中DNS 查询在本地缓存里直接找到结果、无需访问上游服务器的状态,响应时间远低于首次查询。 (通常个位数毫秒)。再验证双件套链路:查询指向 5353 看广告域名返回的是不是无效地址,指向 6053 看正常域名能不能解析。
时效性提醒:具体毫秒数受网络环境、上游负载影响很大,不同时间测差异明显,别拿单次数值下结论;多测几次看趋势。缓存命中后的提速是机制保证的——命中缓存就不查上游,这点和测速、分组无关。
双件套场景再加一套逐跳验证,链路哪里断一眼定位:
# 第 1 跳:dnsmasq(设备默认 DNS,53)
dig www.qq.com
# 第 2 跳:AdGuard(5353)
dig @127.0.0.1 -p 5353 www.qq.com
# 第 3 跳:SmartDNS(6053)
dig @127.0.0.1 -p 6053 www.qq.com
# 广告域名是否被拦(AdGuard 层应返回 0.0.0.0)
dig @127.0.0.1 -p 5353 ad.doubleclick.net
哪一跳不通,问题就锁定在哪一段:第 1 跳不通查 dnsmasq 状态,第 2 跳不通查 AdGuard 监听和 DNS 转发,第 3 跳不通查 SmartDNS 服务和上游。广告域名在 5353 返回 0.0.0.0 而直连能解析,说明拦截链路正常。
排错对照表
| 症状 | 原因 | 解法 |
|---|---|---|
| 装完全家上不了网 | SmartDNS 抢了 53,dnsmasq 起不来 | 本地端口改 6053,重启 dnsmasq |
| SmartDNS 状态一直"未运行" | 服务没启动,或端口被占 | /etc/init.d/smartdns start,检查端口占用 |
| 上游配了但解析超时 | 上游 IP 直连不通(如 DoT 被卡) | 换普通 UDP 上游,或换国内上游 |
| 域名分流不生效 | 域名规则没选对 Server Group | 检查 Domain Rule List 的组名和上游组名一致 |
| 部分域名解析慢 | 缓存 TTL 短、预取没开 | 打开 prefetch-domain、serve-expired |
| 双件套串了但广告还在 | 链路顺序反了(SmartDNS 去问 AdGuard) | 按「双件套」步骤重查每跳,AdGuard 上游指向 6053 |
| 查询能通但结果被污染 | 国外组上游被中间链路干扰 | 国外组换 DoT 加密上游,或交给代理工具解析 |
| 改完配置不生效 | 设备还持有旧缓存 | 设备重连 Wi-Fi,或 ipconfig /flushdns 清缓存 |
FAQ:SmartDNS 常见问题
1. SmartDNS 和 AdGuard Home 能同时装吗? 能,而且推荐。AdGuard 管拦截、SmartDNS 管解析加速,串成一条链各管一段。唯一要注意的是端口分工:AdGuard 5353、SmartDNS 6053,别让两者抢同一个端口。
2. 只装 SmartDNS 能去广告吗? 能,但弱。SmartDNS 的「DNS 屏蔽设置」可以把指定域名解析成无效地址,原理和 AdGuard 一样,但黑名单管理、查询统计、误杀排查都远不如 AdGuard Home。想认真去广告,拦截这层还是交给 AdGuard。
3. 装了 SmartDNS 网速会变快吗? 解析变快、打不开的情况变少,下载带宽不会变。DNS 管的是"域名解析成 IP"这一步,不是数据传输的带宽。
4. 本地端口一定要改 6053 吗? 不一定,但建议。53 归 dnsmasq,SmartDNS 用 53 就得让 dnsmasq 让位,和代理插件、AdGuard 叠用时容易冲突。6053 只是约定,只要不和现有服务撞端口,5354、7053 都行。
5. 上游服务器填多少台合适? 每组 2-3 台。太少没备份,一台抽风全家解析断;太多每次查询都要等所有上游返回再测速,反而拖慢。国内组 223.5.5.5 + 119.29.29.29,国外组 1.1.1.1 + 8.8.8.8 是经过大量用户验证的组合。
6. 测速真的有用吗? 对 CDN 域名有用。同一个 CDN 域名在全国有大量节点 IP,SmartDNS 测速后返回你当前网络最快的那个,比运营商 DNS 随机给一个强。对解析结果只有一个 IP 的普通网站,测速环节等于空转,这也是为什么测速模式别叠太多。
7. 域名分流必须配吗? 不是必须。不上代理、主要上国内网站,国内单组就够;境外访问多或直连境外网站,再配国外组 + 域名规则。分流是锦上添花,先把单组跑稳。
8. SmartDNS 和代理插件(OpenClash/PassWall)冲突吗? 看模式。代理插件接管 53 时,SmartDNS 作为插件上游(插件里把 DNS 指到 127.0.0.1:6053)是常见组合;fakeip 模式下代理自己管理域名映射,SmartDNS 只作为它的上游做解析。关键是别让两者都监听 53。
9. 官方源版本这么旧,能用吗? 能用。1.2023.43 包含缓存、分组、测速、分流全部核心功能,官方源经过 OpenWrt 发行版测试,稳定性优先。作者仓库的新版本主要是加新协议支持,普通家庭用不上。
10. 缓存开多大合适? 默认 32768 条就够,官方文档也建议一般不用手动改。缓存占的是内存,路由内存紧张时反而要调小,不是调大。
11. 为什么改了配置不生效?
先看两处:SmartDNS 服务有没有在运行(主页面状态);设备有没有缓存旧结果。服务在跑就清设备缓存——手机重连 Wi-Fi、电脑 ipconfig /flushdns。
12. 重启路由器后配置会丢吗?
不会。SmartDNS 的配置在 /etc/config/smartdns,OpenWrt 升级固件默认保留 /etc/config;恢复出厂会丢,折腾前先备份(备份方法在维护篇)。
13. 第二服务器是干嘛的? 再开一个端口、绑定另一组上游。典型用法:直连设备和代理设备分开解析,互不影响。普通家庭用不到,进阶玩家折腾分流时才需要。
14. 加密上游(DoT/DoH)值得开吗? 解决"传输中被篡改",不解决快。国内网络对 DoT 的 853 端口常有干扰,直连不通反而拖慢解析。国外组想防污染可以开,国内组用普通 UDP 就行。
15. 配置写在哪个文件?
LuCI 页面改的所有设置最终都落在 /etc/config/smartdns(uci 配置)和 /etc/smartdns/smartdns.conf(运行时生成)。要手动加规则,编辑 smartdns.conf 后重启服务:/etc/init.d/smartdns restart。
16. SmartDNS 支持 IPv6 的 AAAA 解析吗?
支持。默认 A/AAAA 都会查;dualstack-ip-selection 开启后,IPv4 和 IPv6 结果会一起测速、挑更快的返回。家里开了 IPv6 的可以打开,双栈网站(如视频站)能自动走更快的栈。
17. SmartDNS 会把日志写满闪存吗?
默认日志量很小,官方文档支持用 log-size 和 log-num 限制单文件大小和归档个数。装完看一眼高级设置里的日志配置,保持默认即可,别为了排错把日志级别调到最大还长期不清理。
对比与取舍
| 工具 | 定位 | 强项 | 弱项 |
|---|---|---|---|
| dnsmasq | 系统自带 | 零安装、稳 | 无分组、无测速、缓存不可调 |
| SmartDNS | 解析加速 | 分组、测速、缓存、第二服务器 | 过滤统计弱,去广告不如 AdGuard |
| AdGuard Home | 过滤拦截 | 黑名单、统计、误杀排查 | 单组上游,加速能力弱 |
| mosDNS | 分流解析 | 规则灵活、配合代理 | 配置门槛高,不适合新手 |
我的取舍:去广告需求明确 → 先上 AdGuard Home 单跑;国内网页打开慢、境外访问不稳 → 上 SmartDNS 做分流加速;两个需求都有,串成双件套。DNS 层的优化收益是叠加的——拦截少了无效请求,分流让解析又快又准,缓存让重复访问不再走上游。装完按「实测效果」验证一遍,再回头看网页首屏,变化是能感知的。
想继续往下走的,三篇配套文章接着读:DNS 基础与 dnsmasq 转发看《软路由入门(三):首次配置与旁路由》,AdGuard Home 的过滤列表管理看《OpenWrt 去广告神器 AdGuard Home》,opkg 换源、备份恢复看《软路由入门(四):插件与系统维护》。
评论
本地 Worker 预览版,后续可切换到 Cloudflare D1。
正在加载评论...