一、背景
ImmortalWrt部署SmartDNS负责域名解析加速,默认监听 6053
端口,解析国内域名,开启第二DNS服务器监听 6553
端口,解析国外域名;OpenClash来实现分流及代理访问。
- 固件版本:ImmortalWrt 24.10.2
- 硬件版本:Intel(R) Celeron(R) N5105 @ 2.00GHz
二、网络拓扑构思
**🤔**整体思路是:客户端发起DNS查询请求,dnsmasq只做“甩手掌柜”,将收到的所有DNS查询请求原封不动的转给Clash;Clash先按域名规则判断国内/国外,国内问SmartDNS(6053-国内组),国外问SmartDNS(6553-国外组),拿到结果后再按IP决定直连还是代理(根据订阅规则),整个流程一条链走完,没有二次查询和循环。

🎗️好处是:
- 分流点前置到 Clash,域名和 IP 策略集中在一处,规则不打架。
- 两套 SmartDNS 只负责“纯净解析”,不用考虑代理逻辑,配置简单、缓存命中高。
- 客户端→dnsmasq→Clash→SmartDNS 全程本地回环,一次往返就能拿到解析结果,延迟低、易排错。
三、配置
3.1、smartdns配置
这里主要是配置上游dns服务器并且分组,china服务组给 6053
端口使用,用来解析国内域名;foreign服务组给 6553
端口使用(第二dns服务器)。
- smartdns:46.1-r1
- luci-app-smartdns:1.2025.46-r1
- luci-i18n-smartdns-zh-cn:25.226.42624~5c34675
1、配置上游dns服务器
**在SmartDNS的菜单“**上游服务器”中,点击【添加】按钮,添加你要使用的第三方DNS服务器地址:
- DNS服务器名称:随便写,你自己分得清就行
- ip:ip或者是其他协议地址,除了都得写完整,不写协议头
- 类型:根据你的dns服务器的协议类型写
- 服务器组:这里建议将国内dns提供商标记为国内组,china、cn等;国外标记为foreign、oversea、en等。
⚠️国内、外组的服务器记得进【高级设置】中,勾选“从默认组中排除”。
✨记得还要配置一组默认的服务器,用来给解析DOT、DOH类型服务的域名,不然就会导致SmartDNS无法解析域名。


2、开启“第二DNS服务器”
在菜单【第二DNS服务器】中:
- 启用:✔️
- 本地端口:6553
- TCP 服务器:✔️
- 服务器组:foreign(国外组)
其他按下图勾选。

点击【保存应用】然后点击【重启服务】,保证端口正常监听。
🎗️这里要不要“跳过cache”都不影响,大家按需勾选,跳过相当于不使用smartdns的缓存功能,仅仅当个转发器,但是不跳过也可能因为缓存导致一些访问错误,这个大家试着看。
3、编辑smartdns.conf文件
SSH登录路由器,找到路径 /etc/config/smartdns
文件,找到 config smartdns
的子项 option port '6053'
在它的下方中添加一行 option bind_group 'cn'
,让 6053
端口监听到 cn
服务器组。
🎗️这是为了让smartdns把cn组的上游dns绑定到6053端口,但是这么设置会不会导致默认服务器组悬空就不清楚了,反正是目前没出现问题,了解的朋友可以评论区告诉我一下。
4、拦截广告(可选)
下载去广告 hosts
cd /etc/smartdns
curl -L https://anti-ad.net/anti-ad-for-smartdns.conf -o anti-ad.conf
文件里全是:
address=/doubleclick.net/#
address=/googlesyndication.com/#
...
让 SmartDNS 加载它 **LuCI → 服务 → SmartDNS → **自定义设置 → 追加:
conf-file /etc/smartdns/anti-ad-for-smartdns.conf
保存 → 重启 SmartDNS
🎗️效果:匹配到的广告域名直接 NXDOMAIN,浏览器看不到任何请求。
3.2、openclash配置
经过3.1的设置,smartdns已经实现cn组监听6053,en组监听6553端口,下边我们设置clash,让clash的上游指向smartdns。
这里主要是设置clash的上游服务器,让它指向smartdns,其他可选都是捎带手配置一下,没有也行。
- luci-app-openclash:0.47.001
- 内核版本:v1.19.13
- 编译版本:linux-amd64-v2(x86-64)
1、配置上游dns
在【覆写设置】→【DNS设置】中设置:
- 自定义上游服务器:✔️
- 追加上游DNS:❌
- 追加默认DNS:❌
取消下方“NameServer”、“FallBack”中的所有勾选,然后在“NameServer”中添加 127.0.0.1:6053
。“Default-NameServer”保持勾选,或者自己设置一个外部公共dns的ip,“FallBack”我们不用。
🎗️NameServer是Clash 将绝大部分域名查询请求发送到这里。通常,这里应该指向国内速度快、延迟低的 DNS 服务器**,主要目标是“快”;Fallback是如果 NameServer
返回的 IP 地址被 fallback-filter
(如 geoip:cn
)判定为不属于中国,Clash 就会用 FallBack
的服务器重新查询这个域名。通常,这里应该指向海外无污染、支持加密的 DNS,目标是“准”;Default-NameServer是当 Clash 需要解析一些内部域名时(例如:解析订阅中代理节点的域名 us.example.com
,或者下载 GEOIP 数据库),它会使用这组服务器,而不会使用上面的 NameServer
/FallBack
,目标是“稳”。
⚠️这里取消FallBack是因为我们接下来不用这套逻辑。
2、配置Nameserver-Policy
在【覆写设置】→【DNS设置】中:
然后在下方的输入框填入
"geosite:cn": "127.0.0.1:6053"
"geosite:geolocation-!cn": "127.0.0.1:6553"

🎗️使用 geosite:cn
和 geosite:geolocation-!cn
规则,直接在 DNS 查询层面根据域名进行分流,比依赖 fallback-filter
的 IP 地理信息判断更加直接和准确,从根源上避免了「国内 DNS 解析国外域名拿到污染IP」的问题。省去了「先查 CN → 判断 IP → 再触发 fallback 重查」的步骤,减少了潜在的查询延迟。
⚠️这个配置的核心 nameserver-policy
是Clash.Meta内核 的特有功能,所以必须启用meta内核。此配置需要 Clash 能正确加载 geosite.dat
文件。要确保在 OpenClash 的「全局设置」中,「GEO 数据库」的自动更新是开启的且没有报错。
2、启用DNS劫持
在【插件设置】→【DNS设置】中设置:
然后顺手点一下“清理DNS缓存”,成功不成功都无所谓。设置完记得保存设置。
🎗️这里设置劫持dnsmasq其实就是在dnsmasq的设置中开启了转发,并且将转发地址指向了clash的dns监听端口。
3、IPV6代理(可选)
在【插件设置】→【IPV6设置】中设置:
- IPV6流量代理:✔️
- UDP流量转发:✔️
- 允许IPV6类型DNS解析:✔️
- 实验性:绕过制定区域IPV6:绕过中国大陆
🎗️这里启用了以后,clash才会代理ipv6的流量。
4、DNS防泄露(可选)
在【配置订阅】→【编辑配置文件订阅信息】处点击【添加】添加订阅信息,用你自己的,主要设置如下:
- 配置文件名:随便写
- 订阅地址:你的订阅的地址
- 在线订阅转换:✔️
- 订阅转换服务地址:填上
https://api.asailor.org/sub
- 订阅转化模板:Aethersailor 规则 标准版 Custom_Clash
- UDP 支持:启用
- 跳过证书验证:启用
🎗️DNS泄露就是指我们在查询国外域名时候,向国内的DNS服务器发起了查询请求,这里防泄露是使用“参考1”的大神的配置方式。
5、拦截广告(可选)
在【规则附加】→【自定义规则集附加】中的“ALL”点击【添加】:

🎗️这里我们使用的是秋风广告规则
3.3、dnsmasq配置
1、转发dns请求
点击【网络】→【DNCP/DNS】进入dnsmasq设置,在【常规】下设置:
**🎗️如果在设置Clash的时候选择了劫持DNS,在【转发】设置中应该能看到“DNS转发”项的内容类似 **127.0.0.1#7874
,没有就手动指向clash的DNS监听端口。
2、IPV6设置(可选)
在【过滤器】中设置:
🎗️不过滤客户端就能收到ipv6地址。
四、验证
4.1、连通性验证
1、测试smartdns
在路由器终端,或者是下级设备上使用dig命令执行 dig @[地址] -p [端口] [域名]
,看能否获得IP地址
# 路由器终端
dig @127.0.0.1 -p 6053 baudi.com
dig @127.0.0.1 -p 6553 google.com
# 下级设备(windows),地址换路由器地址
dig '@192.168.10.1' -p 6053 baidu.com
dig '@192.168.10.1' -p 6553 google.com
🎗️可能设备没有安装dig,可以使用代替命令或者是安装上再测试,路由器直接安**ind-dig就行,windows看”参考3“安装
2、测试clash
最简单的就是打开谷歌搜索看能不能上去。
找到clash的【运行日志】→【内核日志】,查看没有类似 can not find ip
类似的字段,就是正常的。
4.2、DNS泄露验证
访问ipleak.net等一会测试完,看下方是否有出现国内的dns服务器,没有就是没有泄露。
参考