Shadowrocket 规则不生效或 TUN 断网?先按这条链排查
简答:规则不生效先确认 Global Routing 为 Config、目标配置已启用且 FINAL 在末尾;TUN 断网先恢复原代理类型,再逐项检查 DNS、局域网排除和系统 VPN 权限。
定义:Shadowrocket 规则决定请求匹配后走 PROXY、DIRECT 或 REJECT,TUN 模式则改变连接进入客户端的网络接口,二者不是同一个开关。
先看 30 秒速查卡:规则问题还是 TUN 路径问题
规则不生效时,先把 Global Routing 设为 Config,确认目标配置文件已使用,并检查具体规则是否排在宽泛规则前、FINAL 是否位于末尾。TUN 开启后断网时,先恢复开启前的代理类型,再测试同一个目标;不要同时修改规则、DNS 和路由参数。
| 现象 | 第一步 | 结果如何判断 | 下一步 |
|---|---|---|---|
| Proxy 能用,Config 不能用 | 回到 Config,查看活动配置和命中规则 | 如果 Proxy 正常而 Config 异常,优先怀疑规则、策略或 FINAL | 检查规则顺序、策略名称和目标域名 |
| 开启 TUN 后所有应用断网 | 恢复原代理类型并重新连接 | 恢复后正常,说明变化与 TUN 路径、DNS 或系统 VPN 权限有关 | 一次只改一个 TUN 相关参数 |
| 公网正常,局域网设备打不开 | 检查私有网段是否被排除或设为 DIRECT | 公网与局域网结果不同,优先查局域网路由和 iOS 本地网络权限 | 确认实际 Wi-Fi 网段,不要盲目排除整个地址范围 |
| 配置文件改了但没有效果 | 重新确认该文件是否为活动 Config | 文件存在或编辑器打开,不代表它正在控制连接 | 保存、启用、断开并重新连接后再测 |
本文与 Shadowrocket 项目及其开发者无隶属关系。App Store 页面将 Shadowrocket 描述为基于规则的网络工具,并说明它不提供代理服务或服务器资源;具体菜单名称和功能表现请以设备实际显示为准。参考:Shadowrocket App - App Store。
先分清服务器、Config、规则和 Global Routing
服务器或订阅主要提供连接所需的节点信息;Config 是规则、DNS 和其他配置的载体;规则负责把请求匹配到某个策略;Global Routing 决定当前使用 Config、Proxy 还是 Direct。导入节点不等于导入规则,导入配置文件也不等于已经选中它。
| 对象 | 解决什么问题 | 常见误判 | 检查方法 |
|---|---|---|---|
| 服务器或订阅 | 提供地址、端口、协议和认证信息 | 节点出现在列表中就代表一定可用 | 在 Home 手动选择节点并建立连接 |
| Config | 保存 General、Rule、DNS 等配置 | 文件出现在列表中就代表已经生效 | 确认文件被选中并完成使用或编译 |
| 规则 | 按域名、IP 或 GeoIP 匹配策略 | 写入一条规则就会覆盖所有相关请求 | 查看实际请求、命中规则和应用策略 |
| Global Routing | 选择 Config、Proxy 或 Direct 路由方式 | 切换模式能修复节点地址或认证错误 | 分别做 Config、Proxy、Direct 对照测试 |
第三方使用指南通常将 Config、Proxy、Direct 解释为三种路由模式:Config 按活动配置的规则处理,Proxy 用于通过选定代理路径测试,Direct 用于比较直连结果。它们改变的是请求如何路由,不会自动修复失效节点、错误认证字段或过期订阅。参考:Shadowrocket Quick Start(第三方使用指南)。
规则怎么写:具体在前,宽泛在后,FINAL 放末尾
规则排查的核心是“先确认匹配对象,再确认策略”。常见类型包括 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、IP-CIDR 和 GEOIP;PROXY、DIRECT、REJECT 是匹配后的处理策略。具体域名应放在更宽泛的关键词或后缀规则之前,FINAL 用于处理前面没有匹配到的请求,通常放在规则末尾。
| 类型 | 适用场景 | 示例 | 注意事项 |
|---|---|---|---|
| DOMAIN | 只匹配一个确切域名 | DOMAIN,example.com,PROXY | 不应默认理解为覆盖全部子域名 |
| DOMAIN-SUFFIX | 匹配域名及其子域名 | DOMAIN-SUFFIX,example.com,PROXY | 不要写协议、端口或网页路径 |
| DOMAIN-KEYWORD | 按域名关键词匹配 | DOMAIN-KEYWORD,example,DIRECT | 范围较宽,可能误匹配,应放在更具体规则之后 |
| IP-CIDR | 匹配 IPv4 地址段 | IP-CIDR,192.168.0.0/16,DIRECT,no-resolve | 只覆盖 IPv4;地址段应按实际网络确认 |
| GEOIP | 按 IP 地理数据库分类 | GEOIP,CN,DIRECT | 按 IP 分类,不等于按网页语言或账号地区判断 |
| FINAL | 处理未匹配请求 | FINAL,DIRECT | 策略应按自己的分流目标选择,不能照抄 |
下面是用于结构验证的最小示例,example.com 是示例域名,请替换为你要测试的域名;PROXY 必须对应已导入且可用的策略。示例不是完整配置,也不代表所有用户都应该使用 FINAL,DIRECT。
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
FINAL,DIRECT
这里的 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16 是常见私有地址范围示例;192.168.0.0/16 只覆盖 192.168.x.x,不代表所有局域网。若你的实际 Wi-Fi 网段不同,应先查看路由器或设备分配的地址,再决定是否加入规则。
规则语法和策略顺序可参考社区配置资料,但这些资料不是已核实的开发者官方文档。参考:GitHub - Shadowrocket config files、LOWERTOP/Shadowrocket Wiki。
开启 TUN:先确认节点和 Config,再只改一个变量
- 在 Home 选择一个已经手动验证可用的节点,先不要改 DNS 或规则。
- 进入 Config,确认目标配置文件已选中;如果配置来自 URL,先导出或复制一份作为备份。
- 回到 Home,将 Global Routing 设为 Config,访问一个固定测试目标,记录结果。
- 进入“设置 > 代理 > 代理类型”,如果当前版本显示 None,可将其作为 TUN 模式测试入口;若没有该选项,不要自行猜测字段。
- 允许系统添加或使用 VPN 配置,重新连接后只测试一个网页或一个应用。
- 如果 TUN 后断网,立即恢复原代理类型;网络恢复后,再分别测试 DNS、局域网排除和节点连接。
社区配置资料把“代理类型 None”与 TUN 模式对应,并将其关联到 compatibility-mode=3。但该字段的界面位置、支持情况和具体表现可能随应用版本变化,因此应把它当作社区参数说明,不应当作所有版本的固定操作路径。参考:Shadowrocket config files、Lᴜᴄʏ's Tool:常见问题与附录。
| 界面或现象 | 可能对应的字段 | 是否建议直接编辑 | 判定标准 |
|---|---|---|---|
| 代理类型 None | compatibility-mode=3 | 社区说明,版本行为未核实;优先使用界面 | 同一测试目标在重新连接后能访问 |
| DNS 覆写 | dns-server | 可在界面配置;纯文本字段需保持格式正确 | 域名能解析,且解析失败不被误判为节点故障 |
| 局域网排除 TUN | tun-excluded-routes | 先确认实际私有网段,再小范围修改 | 公网访问正常,局域网设备也能按预期访问 |
| 代理接口绕过列表 | skip-proxy | 字段作用与 TUN 的组合行为需按当前版本验证 | 只观察目标应用是否恢复,不把它等同于 DIRECT |
| 指定流量进入 TUN | tun-included-routes | 通常不作为第一步;社区参数说明,未核实通用行为 | 只有在明确知道目标路由缺失时才做对照 |
局域网、skip-proxy 与 tun-excluded-routes:不要把“绕过”混成一件事
skip-proxy 主要影响代理接口的绕过列表。社区配置资料将它描述为让指定域名或地址不经过代理接口,但在 TUN 模式下的实际行为可能受当前版本和其他路由设置影响,本文不把它等同于 DIRECT,也不把“仍由 TUN 接管”作为所有版本都成立的结论。
tun-excluded-routes 是把指定 IP 段排除出 TUN。局域网设备不可访问时,先确认实际私有网段是否已经加入排除,或者是否有对应的 DIRECT 规则;不能把“局域网被排除”直接当成错误。真正需要警惕的是把本应进入代理的目标网段误加入排除,导致规则看似存在但请求绕开了预期路径。
tun-included-routes 用于增加进入 TUN 的指定路由。它通常不适合作为第一步排障手段,因为范围写错可能影响本地网络和其他地址。以上字段来自社区配置说明,具体版本兼容性应以实际测试为准。参考:Shadowrocket config files。
iOS 本地网络权限可按“设置 > 隐私与安全性 > 本地网络 > Shadowrocket”检查,路径可能随系统版本变化。如果列表中没有该项目,先让应用触发一次局域网访问请求,再返回系统设置查看。
DNS、IPv6、UDP 和 QUIC:按现象逐项验证
- 域名无法解析:先用同一网络访问另一个已知域名;如果只有一个目标失败,优先检查该域名规则和解析结果,不要立即替换全部 DNS。
- 能解析但连接超时:检查实际命中的策略、节点状态以及目标使用的 IPv4 或 IPv6 地址,不要把所有超时都归因于 DNS。
- 公网正常、局域网失败:检查私有网段是否已排除出 TUN、是否存在 DIRECT 规则,以及 iOS 本地网络权限是否开启。
- UDP 或 QUIC 异常:网页能打开不代表 UDP 或 QUIC 一定正常。需要分别确认节点、客户端和配置是否支持相关流量,未核实当前版本行为时不要直接复制第三方开关。
- IPv6 访问异常:分别记录目标返回的 IPv4 和 IPv6 地址,再比较两种地址的连接结果;不要只凭关闭 IPv6 后网页恢复就断定根因。
DNS 只负责解析地址,规则决定请求采用什么策略;DNS 修改不能修复节点认证错误、失效订阅或不可达服务器。App Store 页面确认 Shadowrocket支持规则匹配、DNS 相关能力和 IPv6 等功能,但具体配置字段仍应以当前应用界面或已验证的配置资料为准。参考:Shadowrocket App - App Store。
远程配置更新可能覆盖本地修改:先备份再编辑
如果配置文件通过 URL 导入,更新配置时可能用远程内容覆盖本地编辑。订阅更新、配置更新和规则集更新也可能是不同动作,不能因为节点订阅更新成功,就认为活动 Config 的 Rule 部分已经更新。
- 在编辑前复制或导出原配置,保留一个不修改的基线文件。
- 记录活动文件名、Global Routing 状态和关键规则位置。
- 一次只改一个字段或一组相邻规则,保存后重新选择该文件。
- 重新连接,使用新的请求验证,不要只观察已经打开的网页或长连接。
- 需要长期保留的本地规则,放在自己维护的本地副本或包含配置中,更新远程文件后重新核对。
社区资料明确提示,远程配置的“更新配置”可能覆盖本地修改;因此修改前备份不是可选装饰,而是恢复路径的一部分。参考:GitHub:shadowrocket README、Lᴜᴄʏ's Tool:配置文件。
最终排查顺序:用 A、B 两次测试定位问题层级
- A 测试:Proxy。选择已知可用节点,Global Routing 暂时设为 Proxy,访问同一个测试目标。若仍失败,先查节点、系统 VPN 权限或基础网络。
- B 测试:Config。切回 Config,确认活动文件和目标规则,重新发起同一个请求。若 A 成功、B 失败,优先查规则顺序、策略名称、DNS 和 FINAL。
- C 测试:TUN。在 A 或 B 已经稳定的前提下,只切换代理类型或 TUN 入口。若恢复原代理类型后网络恢复,优先查 TUN 相关字段、DNS、局域网排除和系统权限。
- D 测试:局域网。分别访问公网目标和同一 Wi-Fi 下的局域网设备,确认是全部断网还是只有私有地址失败。
每次测试都使用相同网络、相同节点和相同目标,并在改变一个变量后断开再重新连接。不要公开订阅地址、密码、UUID、证书或包含账号信息的完整配置文件。若当前版本没有对应菜单,或社区字段与实际行为不一致,应标记为未核实,而不是用猜测值覆盖整份配置。
常见问题
Shadowrocket 里 Config、Proxy、Direct 应该选哪个?
日常按规则分流时使用 Config;需要暂时绕开规则测试节点时使用 Proxy;需要比较直连能力时使用 Direct。测试完成后恢复原来的路由模式。
Shadowrocket 开启 TUN 后断网,最先恢复什么?
先恢复开启 TUN 前的代理类型或兼容设置,确认网络恢复后,再依次检查系统 VPN 权限、节点、DNS 和局域网排除,不要同时修改多项。
为什么 DOMAIN 规则没有匹配到子域名?
DOMAIN 通常针对确切域名,不能直接理解为覆盖全部子域名。需要覆盖主域名及其子域名时,可检查是否应使用 DOMAIN-SUFFIX,并确认规则位于更宽泛规则之前。
局域网设备打不开,是不是 tun-excluded-routes 配错了?
不一定。局域网不可达时,应先确认实际私有网段是否已加入排除或对应 DIRECT 规则;排除局域网本身通常是为了让它直连。真正的风险是把需要代理的目标网段误排除。
skip-proxy 和 tun-excluded-routes 有什么区别?
skip-proxy 主要影响代理接口的绕过列表;tun-excluded-routes 是把指定地址段排除出 TUN。两者在不同版本和 TUN 状态下的组合行为可能不同,不能把 skip-proxy 直接当作 DIRECT。
修改远程 Config 后,为什么本地规则消失了?
远程配置更新可能覆盖本地编辑。修改前应先复制或导出原文件;更新后重新检查 Rule、General、DNS 和 FINAL,并把长期保留的规则放入自己维护的本地副本。
TUN 模式等于全局代理吗?
不完全等同。TUN 改变连接进入客户端的接口,最终路径仍可能受到 Global Routing、规则策略、DNS、排除路由、节点能力和系统权限影响。
参考资料
- Shadowrocket App - App Store
- GitHub - Shadowrocket config files
- LOWERTOP/Shadowrocket Wiki
- GitHub:shadowrocket README
- Lᴜᴄʏ's Tool:配置文件(doc.repcz.link)
- Lᴜᴄʏ's Tool:常见问题与附录(doc.repcz.link)
- Shadowrocket Quick Start(第三方使用指南)(shadow-tunnel.com)