系统
它能做的,不超过 iOS 给个人 VPN 的那一块。
Shadowrocket 跑在 Network Extension 里,因此继承该框架的限制。下面这些不是「设置没找对」,而是平台边界。隧道如何启动见 隧道。
01
不是所有进程都会被送进扩展
连接开启后,大部分应用的出站 TCP / UDP 会进入隧道。部分系统进程、部分应用会检测「VPN 已连接」或走独立通道。客户端无法强迫每一个二进制都进入虚拟网卡,也不能修改其它 App 的行为。
表现为:Data 在涨、某一个 App 仍失败——对照时应把「记录不可用」和「该 App 拒绝隧道」分开。前者在策略切到 Proxy 时,其它应用也会一起失败;后者是只有这一个应用失败,浏览器或其它客户端在 Proxy 下是通的。
个人 VPN 对消费者设备通常是整机粒度,不是「只代理这一个 App」。没有在 Shadowrocket 里勾选某个图标就能让系统按应用分流的通用开关。按域名分流是规则引擎的工作,见 规则。
02
隧道会被系统拆掉
低电量模式、关闭后台 App 刷新、飞行模式、Wi-Fi 与蜂窝切换,都会让扩展退出或暂停。恢复后需要再开开关,或等系统按需拉起。这不能靠重装应用解决,重装也带不回一条已经被系统回收的会话。
企业设备上的 MDM 可以禁止个人 VPN。屏幕时间也可以限制 VPN。这两种情况下,应用内再怎么开开关,系统都不会建立扩展。授权对话被拒、或事后在系统设置里删掉 Shadowrocket 这一条 VPN 配置,效果相同:开关没有可作用的对象。
后台刷新容器或规则,依赖系统仍允许该应用在后台运行。关掉「后台 App 刷新」之后,只有你把应用拿到前台时才会再拉。省电模式会进一步收紧。把「列表没更新」当成 URL 失效之前,先看系统有没有让它跑。
03
门户页,以及系统里同时只能有一条个人 VPN
酒店、机场、校园网常常先弹出登录页(Captive Portal)。设备在完成这页之前,自己还没有真正的出站。开关打开、策略 Proxy,登录页可能打不开,认证完不成,隧道也没有网可转。先在 Direct 下、或关掉开关,让系统自己打开登录页,完成后再开隧道。
另一款 VPN 应用处于连接状态时,iOS 通常不会把流量再交给 Shadowrocket。此时本应用开关即使亮着,字节也可能从未进入本扩展,Data 两条都不动。对照故障时,先看系统 VPN 列表里当前生效的是哪一条,而不是先换记录。
04
HTTPS 解密会改这台设备的信任模型
分流、浏览、调用 API 都不依赖 HTTPS 解密。规则看主机名和目的地址,不需要打开加密内容。改写 若只动 URL 或明文头,也不一定要解密。
只有需要查看或改写 HTTPS 内容时才会用到解密,并会安装用户描述文件。这会削弱该设备上「只信任系统根证书」的默认状态:本机扩展能够看到原本仅对端可见的内容。用完应卸掉描述文件。不要把为解密而安装的证书留在长期使用、或存放网银与口令的设备上。
证书未装、已过期、或系统不信任时,解密清单里的主机表现为握手失败,容易被当成记录坏了。先关掉解密再对照:若其它访问恢复,问题在证书,不在出口。
Config 下的 DOMAIN / GEOIP / FINAL 在不开解密时照常工作。为了「让规则更准」去开 MITM,会付出整机信任模型的代价,通常也并不能让 GEOIP 更准。
05