收起左侧

openwrt完美smartdns+openclash方案

3
回复
478
查看
[ 复制链接 ]

3

主题

11

回帖

0

牛值

江湖小虾

一、背景

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决定直连还是代理(根据订阅规则),整个流程一条链走完,没有二次查询和循环。

image.png

🎗️好处是:

  • 分流点前置到 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无法解析域名

image-20250909111818799

image-20250909145349757

2、开启“第二DNS服务器”

在菜单【第二DNS服务器】中:

  • 启用:✔️
  • 本地端口:6553
  • TCP 服务器:✔️
  • 服务器组:foreign(国外组)

其他按下图勾选。

image-20250904185744479

点击【保存应用】然后点击【重启服务】,保证端口正常监听。

🎗️这里要不要“跳过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设置】中:

  • Nameserver-Policy:✔️

然后在下方的输入框填入

"geosite:cn": "127.0.0.1:6053"
"geosite:geolocation-!cn": "127.0.0.1:6553"

image-20250909152139276

🎗️使用 geosite:cngeosite: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转发

然后顺手点一下“清理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”点击【添加】:

image-20250909153716782

🎗️这里我们使用的是秋风广告规则

3.3、dnsmasq配置

1、转发dns请求

点击【网络】→【DNCP/DNS】进入dnsmasq设置,在【常规】下设置:

  • DNS重定向:❌

**🎗️如果在设置Clash的时候选择了劫持DNS,在【转发】设置中应该能看到“DNS转发”项的内容类似 **127.0.0.1#7874,没有就手动指向clash的DNS监听端口。

2、IPV6设置(可选)

在【过滤器】中设置:

  • 过滤 IPV6 AAAA记录:×

🎗️不过滤客户端就能收到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服务器,没有就是没有泄露。

参考

收藏
送赞 1
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

5

主题

94

回帖

0

牛值

初出茅庐

社区上线纪念勋章

听说 分国内外DNS没用,因为在yaml的文件里面,proxy直接走机场了
有用的,dns决定了能不能解析到真实的地址  详情 回复
3 天前

3

主题

11

回帖

0

牛值

江湖小虾

3 天前 楼主 显示全部楼层
屯屯鼠 发表于 2025-9-11 06:21
听说 分国内外DNS没用,因为在yaml的文件里面,proxy直接走机场了

有用的,dns决定了能不能解析到真实的地址
那就是为了解析DNS服务器的 DNS?  详情 回复
5 小时前

5

主题

94

回帖

0

牛值

初出茅庐

社区上线纪念勋章

aliha 发表于 2025-9-11 09:01
有用的,dns决定了能不能解析到真实的地址

那就是为了解析DNS服务器的 DNS?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则