Shadowrocket DNS 泄露怎么解决?检测、DoH 配置与 IPv6 排查
简答:检测到运营商、家庭路由器或本地网络 DNS 时,才优先按泄露排查;最常见原因是 Direct 模式、DNS 回退到 system、IPv6 未接管或浏览器自带 DoH。先用 DNSLeakTest 建立基线,再逐项修改 Shadowrocket 的 DNS 和配置,最后在 Wi-Fi、蜂窝网络下复测。
定义:Shadowrocket DNS 泄露,是指域名解析请求仍由本地网络、运营商或系统 DNS 处理,而不是按当前配置使用指定的加密 DNS 或代理路径。
先试这一步:确认是不是 DNS 泄露
先不要直接把 DNS 改成某个公共地址。DNSLeakTest 的 Standard Test 会进行一轮查询,Extended Test 会进行多轮查询,用来发现可能只在部分请求中出现的其他解析器。打开 DNSLeakTest,关闭 Shadowrocket 测一次作为本机基线,再打开 Shadowrocket、保持同一网络和同一节点,分别运行 Standard Test 与 Extended Test。测试说明可参考 DNSLeakTest 对 Standard 与 Extended 的解释。
- 记录关闭 Shadowrocket 时显示的 DNS 服务商、网络归属和 IPv4/IPv6 情况。
- 打开 Shadowrocket,进入首页的 全局路由(Global Routing),先记下当前模式:
代理(Proxy)、直连(Direct)、配置(Config)或场景(Scene)。 - 保持同一节点和网络,先选择
Proxy测试,再选择原本使用的Config测试。 - 关闭 Wi-Fi、改用蜂窝数据重复测试;如果设备使用 IPv6,再单独记录 IPv6 结果。
- 保存修改前的配置文件。DNS 测试页面有缓存时,断开 Shadowrocket 后重新连接,并重新打开浏览器再测。
| 检测结果 | 优先判断 | 应该改哪里 | 如何复测 |
|---|---|---|---|
| 出现运营商、家庭路由器或本地网络 DNS | 系统 DNS、备用回退、Direct 模式或 IPv6 可能未被接管 | 先查全局路由,再查 DNS 回退和 IPv6 | 断开重连后跑 Extended Test |
| 出现 223.5.5.5、119.29.29.29 等国内公共 DNS | 检测到的是本地网络可达的明文或系统 DNS,不等于 DoH 已经生效 | 检查 dns-server、fallback-dns-server 和系统回退 | 同一节点下对比 Proxy 与 Config |
| 出现 Cloudflare、Google 或其他公共解析器 | 不能只凭名称判定泄露,可能是远程加密 DNS,也可能是浏览器自身 DoH | 对比 Direct、Proxy、Config,并关闭浏览器自带安全 DNS 做一次对照 | 换网络后重复测试 |
| 出现节点机房或代理出口附近的解析器 | 可能表示 DNS 由服务端远程解析或节点出口侧解析器处理 | 结合当前 DoH、代理模式和出口 IP 判断 | 不能只凭国家或城市判断是否泄露 |
| 出现 Apple 或 Private Relay 相关解析路径 | iCloud Private Relay 或“限制 IP 地址跟踪”可能参与了 Safari 的解析 | 记录并暂时关闭相关功能做对照 | 只用 Safari 与另一浏览器分别测试 |
先分清四种问题:DNS 泄露不等于所有网络异常
| 问题 | 含义 | 常见表现 | 先做什么 |
|---|---|---|---|
| DNS 泄露 | 域名查询由本地网络、运营商或系统 DNS 处理 | 检测结果出现本地运营商或家庭网络 | 查 DNS 来源、回退和 IPv6 |
| DNS 污染或错误解析 | 返回的地址被篡改、过期或与目标服务不匹配 | 同一域名在不同 DNS 下得到不同结果,或网页跳转异常 | 比较不同 DNS 结果,不要仅凭检测站判断 |
| 真实 IP 泄露 | 网站或服务看到的连接地址仍是本机公网出口 | IP 检测显示本地网络出口 | 单独测试公网 IP,不能用 DNS 结果代替 |
| WebRTC 泄露 | 浏览器 WebRTC 暴露额外的本地或公网地址 | WebRTC 页面出现与当前代理不同的地址 | 单独检查浏览器 WebRTC,不能用 DNSLeakTest 代替 |
| 代理未接管流量 | 当前应用或请求没有经过预期的 Shadowrocket 路由 | Proxy 模式正常,Config 模式异常,或某个 App 始终直连 | 比较全局路由和配置文件是否选中 |
因此,“网页打不开”不自动等于 DNS 泄露;也可能是节点不可用、规则匹配错误、IPv6 连接超时或应用自带 DNS。每次只修改一个变量,才能知道实际原因。
Shadowrocket 当前配置要检查的入口
- 打开 Shadowrocket 首页,点击 全局路由(Global Routing),临时选择
Proxy。这是为了减少规则干扰,测试结束后恢复原来的模式。 - 如果
Proxy正常、Config异常,进入 配置(Config),确认当前配置文件已经被选中。配置文件只存在于列表中但没有启用,不会改变当前路由。 - 点击当前配置右侧的 i 或编辑入口,优先查看图形化设置;如果当前版本提供 编辑纯文本(Edit Raw),再检查配置中的
[General]和[Rule]。 - 进入 设置(Settings)→ DNS,查看当前版本显示的 DNS Server、Fallback DNS Server、Bootstrap DNS 或相关代理选项。不同版本可能显示不同字段,界面没有的字段不要凭网上截图硬填。
- 修改远程订阅下载的原文件,更新订阅后可能被覆盖。需要长期保留的改动,应使用当前版本支持的覆写或本地配置,而不是只编辑一次远程内容。
公开配置参考中,dns-server = system 表示使用系统提供的 DNS,并不固定指向某个公共 DNS;其中的 no-resolve 也只是控制 IP 规则是否额外触发解析,并不是全局关闭 DNS。可参阅 Shadowrocket 配置与规则参考,但该页面未能核实为开发者官方站点,不能当作官方产品公告。
两套可复制配置:严格排查版与兼容排查版
下面的字段来自公开 Shadowrocket 配置示例和配置参考,适用于“当前版本能够识别这些字段”的情况。Shadowrocket 版本、内核和图形界面可能不同;保存前先备份原配置。若保存后无法解析域名,立即恢复兼容版或原配置,不要继续叠加字段。
严格排查版:减少系统 DNS 和明文 53 端口参与
适用场景:你已经确认当前版本支持这些 DNS 字段,并且设备能够访问所填 DoH 地址。下面的地址只是示例,不代表在每个网络环境都可达。
[General]
dns-server = https://1.1.1.1/dns-query, https://8.8.8.8/dns-query
fallback-dns-server = https://1.1.1.1/dns-query, https://8.8.8.8/dns-query
dns-fallback-system = false
dns-direct-system = false
dns-direct-fallback-proxy = true
hijack-dns = :53
ipv6 = false
[Rule]
FINAL,PROXY- 进入 配置(Config)→ 当前配置右侧 i → 编辑纯文本(Edit Raw),或在当前版本的 DNS 设置页逐项填写。
- 保存后重新选中该配置,回到首页,将全局路由切换为
Config。 - 断开并重新连接 Shadowrocket,再用 DNSLeakTest 的 Extended Test 测试。
- 如果全部域名无法解析、DoH 地址无法连接或连接明显异常,恢复原配置;先不要把
dns-fallback-system改回true后直接长期使用,因为这会允许系统 DNS 参与回退。
这套配置的关键是:dns-fallback-system = false 不允许失败时回退到系统 DNS;dns-direct-fallback-proxy = true 表示直连 DNS 失败时尝试通过代理路径;hijack-dns = :53 用于接管普通 DNS 端口。它们是否被当前版本识别,必须以设备实际日志和复测结果为准。
兼容排查版:先恢复可用,再定位是哪一项造成问题
适用场景:严格版导致解析失败、节点尚未建立、当前版本不识别某些字段,或你需要先建立稳定基线。
[General]
dns-server = system
fallback-dns-server = system
dns-fallback-system = true
dns-direct-system = true
ipv6 = false
[Rule]
FINAL,PROXY- 保存为本地副本并启用,确认 Shadowrocket 可以正常打开测试页面。
- 在首页的 全局路由(Global Routing) 选择
Proxy,测试节点和基础连接。 - 再选择
Config,测试规则是否生效。 - 确认基础连接后,只把
dns-server改为一个当前网络可达的 DoH 地址,再测试一次;不要同时改 IPv6、规则和节点。 - 如果改回 DoH 后仍无法解析,恢复兼容版,重点检查 DoH 主机是否可达、Bootstrap DNS 是否可用,以及当前版本是否支持该格式。
兼容版不是防泄露配置,而是用于确认“客户端、节点和网络本身是否正常”。其中 dns-fallback-system = true 明确允许系统 DNS 回退,因此如果检测结果出现运营商或本地网络 DNS,应回到严格排查版继续定位。
DNS-over-Proxy、备用 DNS 与 hijack-dns 怎么组合
| 字段 | 作用 | 排查时的建议 |
|---|---|---|
dns-server | 主 DNS 来源,可以是 system、明文地址或 DoH/DoT 地址 | 严格排查时使用当前版本支持的加密 DNS;不要把明文 1.1.1.1 当成 DoH |
fallback-dns-server | 主 DNS 失败时使用的备用来源 | 备用地址必须可达;不要无意中填入 system |
dns-fallback-system | 是否允许失败时回退到系统 DNS | 排查泄露时使用 false,但必须确认当前版本支持,否则可能造成解析失败 |
dns-direct-system | 直连解析是否使用系统 DNS | 希望减少本地 DNS 参与时使用 false;本地设备或内网域名异常时先恢复并测试 |
dns-direct-fallback-proxy | 直连 DNS 失败时是否尝试代理路径 | 需要 DNS-over-Proxy 时可尝试 true,但要观察日志和实际可达性 |
hijack-dns | 接管普通 DNS 请求,例如端口 53 | 公开示例使用 :53;当前版本不识别时不要强行添加 |
ipv6 | 是否启用 IPv6 连接路径 | IPv6 未确认由代理接管时,可临时设为 false 做对照 |
主 DoH 经代理并不等于“检测站一定显示代理节点名称”。检测站通常显示实际回答请求的远程解析器或其网络归属,因此应同时比较节点出口、DNS 服务商、IPv4 和 IPv6,而不是只看名称。
规则、no-resolve 与 IPv6 的具体排查
no-resolve 应该怎么写
no-resolve 只避免某条 IP 规则为了匹配而额外触发域名解析,不会关闭所有 DNS,也不会自动把请求改成代理。示例:
[Rule]
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
IP-CIDR6,fc00::/7,DIRECT,no-resolve
FINAL,PROXY规则从上到下匹配,FINAL,PROXY 必须放在后面,否则可能让后面的特定规则失效。若把所有 IP 段都加上 no-resolve,域名请求可能没有可供 IP 规则匹配的地址,表现为规则不命中或连接异常。公开配置参考也将 no-resolve 定义为避免额外解析,而不是关闭 DNS,可参考 Shadowrocket 配置与规则参考。
IPv6 不能只看 IPv4 结果
- 在配置的
[General]中先备份,再将ipv6 = true改为ipv6 = false;如果图形界面提供 IPv6 开关,则在当前版本的 DNS 或通用设置中关闭。 - 重新连接 Shadowrocket,同时测试 IPv4 和 IPv6。
- 如果关闭 IPv6 后检测正常,说明 IPv6 可能是未被代理接管的一条路径,但不能据此证明 IPv4 和其他 App 都没有问题。
- 如果关闭 IPv6 后某些内网服务或应用异常,恢复
ipv6 = true,改为检查节点、规则和应用自身解析。
国内应用解析异常怎么回滚
如果把所有请求都写成 FINAL,PROXY 后,国内应用变慢、内网设备打不开或本地服务无法访问,先恢复原配置;再把明确的局域网地址加入 DIRECT,no-resolve,不要继续扩大直连范围。DNS 规则、路由规则和本地网络可达性是三个不同问题,不能只靠增加一条 FINAL 规则解决。
浏览器 DoH、Private Relay 与检测缓存怎么处理
浏览器可能自带安全 DNS,导致 Safari、Chrome 或 Firefox 的检测结果与其他 App 不同。排查时先用 Safari 测一次,再用另一款浏览器做对照;在浏览器的隐私或安全设置中暂时关闭“安全 DNS”或“DNS over HTTPS”,重新打开页面测试。不同浏览器的菜单名称和版本会变化,无法核实当前设备界面时,不要把某个固定路径当成所有 iPhone 都适用。
Apple 说明,iCloud Private Relay 会保护 Safari 浏览和 DNS 解析;使用代理配置时,相关流量可能不再按 Private Relay 的路径处理。排查 Shadowrocket 时,可以在 设置 → Apple 账户 → iCloud → Private Relay 查看状态,并在蜂窝网络或 Wi-Fi 的网络详情中记录“限制 IP 地址跟踪”是否开启。详情见 Apple 关于 iCloud Private Relay 的说明。
检测站缓存也会造成误判:浏览器可能复用已有连接,DNS 服务器也可能缓存先前结果。每次修改后都要断开 Shadowrocket、重新连接、关闭并重新打开浏览器,再用新的 Standard 或 Extended Test 测试。只看到一次异常结果,不要立即判断为稳定泄露;但如果在 Wi-Fi 和蜂窝数据、Proxy 和 Config 下都重复出现本地运营商 DNS,就应继续检查系统回退和 IPv6。
修复后的验收与回滚清单
- 在 Wi-Fi 下,关闭 Shadowrocket 测一次基线。
- 打开 Shadowrocket,选择固定节点和
Proxy,运行 DNSLeakTest Standard Test。 - 保持节点和网络不变,运行 Extended Test,记录是否仍出现运营商或本地网络 DNS。
- 切换到
Config,重复测试;如果只有 Config 异常,回到当前配置检查 DNS、规则和 IPv6。 - 关闭 Wi-Fi,使用蜂窝数据重复一次;再单独检查 IPv6、浏览器安全 DNS 和 Private Relay。
- 如果严格版导致所有域名无法解析,关闭连接,恢复原配置或兼容版,重新选择配置后再测试固定网址。
最终验收不是“检测站显示某个熟悉品牌”这么简单,而是同一节点、同一网络下,Proxy 与 Config 结果可解释,Wi-Fi 与蜂窝网络没有反复出现本地运营商 DNS,IPv6 也没有走出预期路径。
常见问题
DNSLeakTest 的 Standard 和 Extended 应该选哪个?
先用 Standard Test 快速确认,再用 Extended Test 做复核。Standard 查询较少,Extended 会进行更多轮查询,更适合检查备用或间歇出现的解析器;两者都只代表当前浏览器和当前网络下的测试结果。
Shadowrocket 中 dns-fallback-system 应该填什么?
如果目标是排查系统 DNS 回退,且当前版本支持该字段,可填 false;如果严格版导致解析失败,应恢复兼容版或原配置。填 true 会允许系统 DNS 参与回退,不能当作防泄露设置。
主 DoH 经代理后,检测站为什么不显示节点机房 DNS?
检测站通常显示实际回答请求的远程解析器或其网络归属,不一定显示节点机房名称。应结合 Proxy、Config、Direct、IPv4 和 IPv6 结果判断,不能只凭解析器名称下结论。
把 FINAL,PROXY 放进去后国内应用打不开怎么办?
先恢复原配置,确认是全局规则导致还是 DNS 导致;再只为明确的局域网地址使用 DIRECT,no-resolve,并把 FINAL 放在规则末尾。不要同时更换节点、DNS 和规则。
关闭 IPv6 后检测正常,是否代表已经彻底修复?
不代表。它只说明 IPv6 可能是一条绕过路径。还要在 Wi-Fi、蜂窝数据、Proxy 和 Config 下重复测试,并单独检查浏览器 DoH、Private Relay、真实 IP 和 WebRTC。
参考资料
- DNSLeakTest:DNS 泄露检测(dnsleaktest.com)
- DNSLeakTest:Standard Test 与 Extended Test 的区别(dnsleaktest.com)
- Shadowrocket 配置与规则参考(shadow-tunnel.com)
- Apple Support:About iCloud Private Relay
- 公开 Shadowrocket 配置示例:DNS 回退、hijack-dns 与 IPv6 字段