本文速览

Shadowrocket(小火箭)的 On Demand 管理系统 VPN 隧道何时建立或断开,不代替连接后的分流规则。本文面向已有自己的服务商与订阅、且已能手动连接的用户:先建立按 Wi-Fi 与蜂窝网络区分的最小规则,再单独验证域名触发,最后检查优先级与系统授权,避免把“已连接”误认为“所有请求都走代理”。

先区分 On Demand 与 Global Routing

On Demand 的入口是 Settings → On Demand。它把按需连接条件交给系统 VPN 机制执行,条件可以涉及网络接口、Wi-Fi 名称及域名求值。它不是定时任务,也不以 Shadowrocket 是否停留在前台作为唯一触发依据。自动连接仍依赖有效的 VPN 配置、系统许可和可用的网络。

Global Routing 则决定隧道建立后怎样处理请求。Home 中的 Global Routing 提供 Proxy、Direct、Config、Scene 等选项;其中 Config 按当前配置的规则分流。On Demand 的 Connect 不等于把 Global Routing 改成 Proxy,Disconnect 也不等于把它改成 Direct。排查时必须分开核对这两个层次。

网络条件变化 按需条件匹配 系统建立隧道 请求规则分流 执行出站策略

例如,蜂窝网络命中 Connect 后,若 Global Routing 为 Config,匹配 DIRECT 的请求仍然直接连接;匹配代理策略的请求才使用相应出站。反过来,即使配置里有 DOMAIN-SUFFIX 规则,也不能据此推断隧道会在访问该域名时自动建立。

2 层
隧道连接条件与连接后的请求分流分别核对
3 步
Settings → On Demand → 核对条件与动作
1 项
每轮验证只修改一个条件,保留可比较结果

判断顺序:先确认隧道,再检查出站

自动连接未发生时先查 On Demand;系统已显示连接、但请求路径不符时,再查 Global Routing 与 Config,避免反复改动无关设置。

启用前:用手动连接建立基线

自动化规则不能修复失效的连接参数。开始前,先在 Home 选定一项已有配置,手动开启连接,确认系统允许添加 VPN 配置,并访问实际需要使用的目标。订阅只负责提供和更新已有连接信息,不会替你决定 Wi-Fi 条件或域名触发方式。

  1. 保存现状:记录 Home 当前选择、Global Routing 选项,以及 Config 中正在使用的配置;已有 On Demand 规则也先记录顺序和动作。
  2. 验证连接:分别在准备测试的 Wi-Fi 与蜂窝网络上手动连接。若其中一种网络下本来就无法使用,先处理网络或已有配置问题。
  3. 进入入口:打开 Settings → On Demand,查看网络条件、动作与规则顺序。控件位置和可用条件以当前应用内显示为准,不要只凭旧教程寻找某个按钮。
  4. 核对系统:在 iPhone / iPad 的系统 Settings 中找到 VPN 配置,核对 Shadowrocket 对应配置及 Connect On Demand 状态。系统路径的具体名称以设备当前显示为准。
  5. 开始单项测试:先只启用网络条件规则,暂不叠加域名求值;网络切换行为符合预期后,再添加下一类条件。

按 Wi-Fi 名称与蜂窝网络设置动作

先写清目标:例如,连接名为 Home-WiFi 的无线网络时断开隧道,切到蜂窝网络时建立隧道。Home-WiFi 在这里仅是自定义网络名称示例,填写时必须替换成设备实际连接的 SSID;不要照抄一个并不存在的名称。

SSID 条件应按实际名称核对大小写、空格与标点。相同名称的多个接入点可能命中同一条条件,SSID 本身也不能证明网络可信。如果办公网络和家庭网络恰好重名,仅靠名称就无法区分两者。

指定 Wi-Fi 条件

入口
Settings → On Demand
接口
Wi-Fi
SSID 示例
Home-WiFi,填写实际网络名称
动作
Disconnect
顺序
放在通用 Wi-Fi 条件之前

只在确实希望该网络不建立隧道时使用 Disconnect;这不是网络安全性判定。

蜂窝网络条件

入口
Settings → On Demand
接口
Cellular
SSID
不适用于蜂窝接口
动作
Connect
验证
关闭 Wi-Fi 后发起新请求

没有蜂窝能力的 iPad 不适用此项;连接个人热点时,接收端通常使用 Wi-Fi 接口。

  1. 为指定 Wi-Fi 添加 SSID 条件并选择 Disconnect,保存后检查条件确实绑定到 Wi-Fi,而不是无接口限制的通用规则。
  2. 为 Cellular 添加 Connect 条件。确认设备有可用蜂窝数据;仅关闭 Wi-Fi 而没有蜂窝数据,不构成有效的联网测试。
  3. 如果还希望其他 Wi-Fi 自动连接,再添加覆盖其他 Wi-Fi 的 Connect 条件,并放在指定 SSID 的例外之后。
  4. 重新连接目标 Wi-Fi,随后切换到蜂窝网络,各发起一次新请求。记录网络名称、预期动作和系统 VPN 实际状态。

网络切换时,已有连接、正在切换的接口及系统处理时序可能影响观察结果。不要把刚切换瞬间的图标当作最终结论;先确认网络已可用,再检查 VPN 状态与新请求结果,也不要通过连续快速切换来测试规则。

按域名触发:不是把 DOMAIN-SUFFIX 搬进 On Demand

域名按需连接与普通域名分流的目标不同。前者由系统按域名相关的连接求值条件决定是否需要隧道;后者是在隧道工作期间为请求选择策略。Apple 的按需机制可通过 EvaluateConnection 及其域名求值动作处理此类需求,ConnectIfNeeded 表示按条件判断是否需要建立连接,不是每次打开某个网址就无条件连接。

在 Settings → On Demand 中核对当前界面是否提供域名求值项及对应动作。若提供,应填写域名,例如 internal.example.com,而不是 https://internal.example.com/path。示例域名仅用于说明输入格式,不是可用的内部服务;实际测试须使用用户有权访问、且了解其 DNS 条件的域名。

因此,“任意 Wi-Fi 都先 Connect”与“只在需要某个域名时才连接”不是同一个目标。前者已经要求网络一匹配就建立隧道,不能再用后置域名条件把它收窄。需要按域名连接时,应单独审查通用网络规则是否提前覆盖了求值机会。

Config 中的域名规则只处理连接后的流量

下面是 Config 的规则语法示例,不是 On Demand 的配置文本。它表示相关请求使用指定策略,而不是声明系统的自动连接触发条件。

[Rule]
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

在 Global Routing 为 Config 时,前一条规则匹配相应域名后使用 PROXY,其余请求落到 FINAL 的 DIRECT。实际配置须确认 PROXY 对应有效出站。把这段规则保存到 Config,不等于已经完成域名按需连接设置。

多条条件同时成立:先查匹配顺序

系统按需规则按顺序求值,首先匹配的规则决定该轮采用的动作,不是所有动作叠加执行。较具体的例外通常应位于较宽泛的网络条件之前;域名求值规则内部的条件还须另行核对,不能把它与 Config 中的规则顺序混为一谈。

顺序匹配条件动作验证要点
1Wi-Fi 且 SSID 为 Home-WiFiDisconnect具体名称例外先于通用 Wi-Fi
2其他已匹配的 Wi-Fi 网络Connect第一条不匹配才进入此条
3CellularConnect蜂窝数据可用时验证

表格是网络优先方案,不包含域名求值。若把通用 Wi-Fi 的 Connect 移到第一条,Home-WiFi 同样满足它,后面的 Disconnect 就无法实现预期例外。若加入不限制接口的通用条件,也必须检查它是否遮住后续所有网络规则。

  1. 发现结果不符时,从第一条开始逐项写出“当前接口是否匹配、SSID 是否匹配、动作是什么”。
  2. 临时停用新增规则,保留此前验证成功的最小集合,确认问题是否随新增条件消失。
  3. 每次只调整一条规则的位置或一个动作,保存后重新进行网络切换和新请求测试。

这里的“顺序”不能用 Config 中的 FINAL 来补救。FINAL 只兜底请求分流;它不会成为系统 On Demand 的兜底连接动作,也不会修正错误的 SSID 条件。

不自动连接、断开后重连与域名不触发的检查

先记录一个可复现的过程:从哪种网络切换到哪种网络、当前选中的配置、命中的第一条条件,以及系统 VPN 状态。以下按症状检查,不需要同时重置所有设置。

打开了 On Demand,切到蜂窝网络仍不连接?

先确认蜂窝数据本身可用,再进入 Settings → On Demand 核对 Cellular 条件和 Connect 动作。检查是否有更早的通用 Disconnect;随后在系统 VPN 配置中核对 Connect On Demand。若手动连接也失败,先返回已有连接配置排查。

在 Home 手动断开,为什么稍后又连接了?

如果 On Demand 仍启用,后续网络事件或请求可能再次满足连接条件。要做暂停验证,先在 Settings → On Demand 停用按需连接,再手动断开,并检查系统对应配置的状态;不要只反复点击 Home 的连接开关。

指定 Wi-Fi 已设 Disconnect,怎么还显示连接?

核对实际 SSID,特别是名称末尾空格及相似字符;确认具体 SSID 规则位于通用 Wi-Fi Connect 之前。再查看系统当前连接的是不是 Shadowrocket 对应的 VPN 配置,避免把其他配置的连接状态算到本规则上。

访问目标域名没有触发,是域名写错了吗?

先确认填写的是域名而不是完整 URL,再检查是否有更早的网络动作直接结束匹配。若使用 ConnectIfNeeded,还应检查直接网络的 DNS 是否已经满足条件,以及测试应用是否复用了连接;不要用向 Config 反复添加 DOMAIN-SUFFIX 的方式修复系统触发。

自动连接成功,为什么某些请求仍直接连接?

回到 Home 检查 Global Routing。使用 Config 时,逐条检查目标匹配的策略及 FINAL;使用 Direct 时,请求不会因为 On Demand 的 Connect 自动改走代理。先确定请求命中的策略,再检查已有出站是否可用。

需要回退时,先停用 On Demand,恢复手动连接,确认基线仍然有效,再逐条恢复规则。日常使用建议保留能够解释每个结果的最小规则集合;不要用相互覆盖的重复条件掩盖问题。