mihomo(Clash Verge 的内核)的 TUN 模式下 DNS 泄漏已经被社区反复验证过了——在 ipchecking 和 dnsleaktest 上能看到自己的中国运营商 DNS 出现在结果里。所以很多人切到了 sing-box,觉得切了就安全了。但 sing-box 的 DNS 也不是默认就锁死的——dns_mode 设错了,或者 real-ip 搭配了不合理的直连域名列表,一样会有泄漏。
下面按配置层面最容易出错的三个点排查。
sing-box TUN 模式的三个 dns_mode,该怎么选?
v1.14.0-alpha.21(2026 年 5 月)开始,sing-box 把 DNS 行为收敛为三个清晰的模式:
| dns_mode | DNS 解析路径 | 劫持系统 DNS? | 泄漏风险 |
|---|---|---|---|
disabled | 系统自己的 DNS(路由器下发的或手动设的) | 不劫持 | 最高——所有 DNS 请求走系统出口 |
native | 系统 DNS,但 sing-box 往接口上写自己的 DNS 地址 | 不劫持 | 中——由系统 DNS 解析,但用的是 sing-box 指定的服务器 |
hijack(默认) | sing-box 内部 DNS 服务器 | 劫持 53 端口 + 防火墙规则 | 最低——所有 DNS 请求都在 sing-box 内部处理 |
hijack 模式做的额外动作:在 Linux 上用 nftables 做 DNAT 把 UDP 53 端口流量重定向到 sing-box 内部的 DNS 服务器;在 Windows 上用 WFP(Windows Filtering Platform)达到同样的效果;在 macOS 上用 Network Extension 框架做 DNS 拦截。
如果你的配置里 dns_mode 这一项不存在或是 native,这就是泄漏的第一优先级排查点。改到 hijack 后重启 sing-box 再看。
fake-ip 和 real-ip:不是谁更好,而是谁在什么场景下漏
| fake-ip | real-ip | |
|---|---|---|
| DNS 解析控制权 | 在 sing-box 内部 | 依赖上游 DNS 服务器可达性 |
| 返回给应用的是什么 | 198.18.x.x 虚拟 IP | 真实公网 IP |
| 代理节点挂掉后国内域名能不能解析 | 能(sing-box 内部缓存了绑定关系) | 否(国外 DNS 不可达时,即使域名要走直连也解析不了) |
| DNS 泄漏风险 | 低——DNS 请求不离开 sing-box | 中——直连域名的 DNS 请求可能走系统 DNS |
| 需要额外配置吗 | 需要配置 fake-ip 地址池和域名缓存规则 | 需要配置至少两个上游 DNS(国内外分开) |
| 兼容性 | 对 IP 直连命名的规则(如 IP-CIDR)可能有预检延迟 | 规则兼容性好,因为规则直接拿到真实 IP |
fake-ip 的真正优势:代理节点不稳定或临时挂掉时,如果你的配置是 real-ip + 国外 DNS 服务器,所有需要 DNS 解析的请求都得等国外 DNS 响应——国外 DNS 也不可达时,连国内的直连域名也可能跟着挂。fake-ip 没有这个问题:即使国外代理全断开,sing-box 内部维护的映射表仍然可以为本机请求提供服务。
real-ip 的真正风险:在 real-ip 模式下,如果你在 DNS 规则里写了「geosite:cn → 国内 DNS 服务器」这样的分流,但实际上有些被标记为 geosite:cn 的域名仍然会产生向系统出口的 DNS 查询。real-ip 不给域名和 IP 之间建立虚拟绑定,所以每个新连接可能需要做一次新的 DNS 查询——查询多了,总有漏的。
规则命中顺序:最容易把 DNS 请求「放跑」的三种写法
以下三种配置会让 DNS 请求绕过 sing-box 直接走系统 DNS,在日志或检测工具里表现为「泄漏」:
1. 直连 bypass 列表包含了 DNS 本身
"rules": [
{ "domain_suffix": ["dns.alidns.com", "doh.pub"], "server": "local" }
]
server: local 在某些配置下会走到系统 DNS,等于把阿里 DNS 或腾讯 DoH 的请求直接放给了本地网络。如果你必须用这些国内 DNS 服务器,至少改成 server: domestic-dns(一个你明确配置的 DNS 服务器标签)而不走 local。
2. domain_strategy 设成了 prefer_ipv4 且没有对应的 fake-ip 回退
real-ip 模式下如果你指定了 domain_strategy: prefer_ipv4,sing-box 对每个域名做 A 记录查询。如果查询失败(国外 DNS 不可达),sing-box 可能会让系统代劳。解决方案是给所有域名规则加一个末尾兜底 server: fake-ip-server。
3. sniff 关闭后域名被当成 IP 包直接过路由
sing-box 的 sniff 功能可以从 TLS 握手包里解析出 SNI 域名。如果 sniff 被关闭,sing-box 看到的是目的 IP 而非域名——此时 DNS 路由规则(按域名分流)不生效,所有流量走默认出站。确认配置里有 "sniff": true 和 "sniff_override_destination": false。
实操:把 real-ip 配置改成 fake-ip 配置
假设你现有的 real-ip DNS 配置:
"dns": {
"servers": [
{ "tag": "domestic", "address": "223.5.5.5", "detour": "direct-out" },
{ "tag": "remote", "address": "https://dns.google/dns-query", "detour": "proxy-out" }
],
"rules": [
{ "geosite": "cn", "server": "domestic" },
{ "geosite": "geolocation-!cn", "server": "remote" }
]
}
改成 fake-ip 版本:
"dns": {
"servers": [
{ "tag": "domestic", "address": "223.5.5.5", "detour": "direct-out" },
{ "tag": "remote", "address": "https://dns.google/dns-query", "detour": "proxy-out" },
{ "tag": "fakeip", "address": "fakeip" }
],
"rules": [
{ "outbound": "any", "server": "fakeip" },
{ "geosite": "cn", "server": "domestic" }
]
}
关键变化:"outbound": "any" → server: "fakeip" 放在了第一条规则的位置。这样所有出站连接在做 DNS 解析时都先进 fake-ip 映射表,sing-box 内部根据请求的目标域名决定用国内还是国外 DNS 解析实际 IP。
改完重启 sing-box 后,用 nslookup google.com 测试,返回的应该是 198.18.x.x 而非真实 IP。
TUN 模式下自己验证 DNS 是否泄漏
不用依赖社区测试,自己验证最快:
- 开 sing-box TUN 模式,确认
dns_mode: hijack。 - 关闭所有其他代理客户端(避免干扰)。
- 打开浏览器进
https://dnsleaktest.com,点「Extended test」。 - 看返回的 DNS 服务器列表。
期望结果:列表里只有你代理出口的 DNS 服务器,没有中国运营商 DNS(China Telecom、China Unicom、China Mobile 等)。
如果出现本地运营商 DNS,回到上面三步排查顺序:dns_mode → fake-ip → 规则命中。90% 的泄漏是 dns_mode 还在 native 状态。
换了 sing-box 还缺一套兼容订阅
sing-box 的配置文件是 JSON 格式,而很多订阅服务默认只提供 Clash YAML。如果你的订阅来源不支持直接导出 sing-box 格式的 JSON,需要手动写一段转换,或者在客户端里导入 YAML 后转换格式。
如果你同时维护多端设备(iOS 上 Stash、Android 上 sing-box、PC 上 Clash Verge Rev),每个端需要的格式可能不同——订阅如果不支持多格式导出,每个端都得手动改。
有些用户会在全端统一用 sing-box 后,选一套能直接导出 sing-box JSON 格式且支持多协议的订阅,避免每个设备单独折腾配置文件。如果你需要一个同时兼容 Clash Meta、sing-box 和 V2Ray 的配套订阅线路,可以让所有客户端用同一套配置格式。
相关阅读: