Stash TUN 不路由的五层排查顺序:(1) 确认只有 Stash 一个 VPN 配置激活;(2) 启用 dns-hijack 接管所有 DNS;(3) 规则集兜底设置为 Proxy;(4) 删除多余的 .mobileconfig;(5) Stash 升级到 3.6+ 适配 iOS 19。前两层能解决 90% 的问题。
症状分类
| 症状 | 最可能根因 |
|---|---|
| 浏览器走代理,某 App 不走 | App 在规则集里被分到 DIRECT |
| 国外网站能上,国内某些 App 失败 | fakeip 与 App 内部 DNS 冲突 |
| TUN 显示已开但全无连接 | iOS VPN 配置冲突 |
| 部分时段正常部分时段不通 | iOS 后台保活被杀 |
| 切节点后偶发不通 | DNS 缓存未清空 |
| 系统设置里看不到 Stash VPN | Stash SystemExtension 授权失效 |
iOS VPN 配置优先级
最常见原因:同时装了多个代理客户端,iOS 只让一个 VPN 激活,但你不知道激活的是哪个。
检查激活的 VPN 配置
- 设置 → 通用 → VPN 与设备管理 → VPN
- 看列表里所有 VPN 配置 (可能有 Shadowrocket、Loon、Stash 各一个)
- 激活态的旁边有 √ 或灰色”未连接”标记
- 同时只能有一个绿色”已连接”
修复
- 删除不用的 VPN 配置:点旁边的 ⓘ → “删除 VPN”
- 只保留 Stash 的配置
- 在 Stash App 内 → 设置 → VPN 配置 → 强制重新生成
Apple 的 NetworkExtension 框架设计:同时只能有一个 packet tunnel 激活。多家客户端如果都装,只有最后启用 VPN 的那家有效。
Stash dns-hijack 是否启用
dns-hijack 必须开,否则 App 内部走 8.8.8.8 直查 DNS,绕过 Stash。
检查当前 yaml
在 Stash 应用内 → Profiles → 当前配置 → 编辑,查找:
tun:
enable: true
dns-hijack:
- any:53
- tcp://any:53
stack: mixed
如果 dns-hijack 不存在或为空,加上。
完整 DNS + TUN 配置
dns:
enable: true
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.0/16
use-hosts: true
default-nameserver:
- 223.5.5.5
nameserver:
- https://dns.cloudflare.com/dns-query
- https://dns.google/dns-query
fallback:
- tls://1.1.1.1:853
fallback-filter:
geoip: true
geoip-code: CN
fake-ip-filter:
- '*.lan'
- localhost.ptlogin2.qq.com
- +.msftncsi.com
tun:
enable: true
stack: mixed
dns-hijack:
- any:53
- tcp://any:53
auto-route: true
auto-detect-interface: true
保存后重启 Stash。
规则集兜底检查
在 yaml 末尾找 rules 块:
rules:
- DOMAIN-SUFFIX,cn,DIRECT
- GEOIP,CN,DIRECT
- MATCH,Proxy # 兜底应该是 Proxy
如果你的 yaml 兜底是 MATCH,DIRECT,所有未匹配的流量会走直连,这就是”某些 App 不走代理”的根因。
修复
把最后一行改为 MATCH,Proxy,或 MATCH,🚀 节点选择。
检查 RULE-SET 引用
如果你用了 RULE-SET,xxx 引用规则集,在 yaml 头部应有 rule-providers: 块定义 xxx。否则 RULE-SET 失效,规则不生效。
删除多余的 .mobileconfig
iOS 16+ 允许装 .mobileconfig 配置文件 (企业 VPN 一般这样部署)。如果你之前装过某个企业证书或 always-on VPN,可能强制让特定 App 直连。
检查与删除
- 设置 → 通用 → VPN 与设备管理 → 配置文件
- 看列表里所有 .mobileconfig
- 删除不用的 (点进入 → “删除配置文件”)
重置网络设置 (硬路线)
如果实在排查不出,重置网络设置:
- 设置 → 通用 → 转移或还原 iPhone → 还原 → 还原网络设置
- 输入密码确认
- iPhone 重启后所有 VPN 配置 + Wi-Fi 密码 + 蜂窝数据设置都被清空
- 重新装 Stash + 导入配置
注意:这会清掉所有 Wi-Fi 密码,需要重新输入。
Stash 版本兼容性
| Stash 版本 | iOS 18 表现 | iOS 19 beta 表现 |
|---|---|---|
| 3.4 及更早 | TUN 偶发失败 | 完全不能用 |
| 3.5 | 稳定 | TUN 偶发重启 |
| 3.6 | 稳定 | 完整适配 + 利用新内存上限 |
Stash 3.6 是 iOS 19 必备,iOS 18 上也推荐升。升级路径:App Store → 自动检查更新,或开 TestFlight 跟进 beta。
验证 TUN 完整路由
修复完上述五层后,用下面四项验证 TUN 是否真的拦截了所有流量:
- 出口 IP:访问 ipleak.net,确认显示的是国外 IP 而非真实国内 IP。
- DNS 泄漏:访问 dnsleaktest.com 点 Standard Test,确认 DNS 服务器显示 Cloudflare/Google 或出口节点 ISP,而非中国运营商。
- 单 App 测试:在 Stash Dashboard 看实时连接列表,打开目标 App 确认连接经过代理节点。
- WebRTC 泄漏:访问 browserleaks.com/webrtc,确认 WebRTC IP 与出口 IP 一致。
四项都通过才算 TUN 完整路由。
常见 App 不走代理的特殊处理
Telegram
iOS 上 Telegram 走 MTProto + 多 IP 池,某些规则集里默认 Telegram 直连。修复:
proxy-groups:
- name: TelegramGroup
type: select
proxies: [Proxy, DIRECT]
rules:
- DOMAIN-KEYWORD,telegram,TelegramGroup
- DOMAIN-SUFFIX,t.me,TelegramGroup
- IP-CIDR,91.108.0.0/16,TelegramGroup
- IP-CIDR,149.154.160.0/20,TelegramGroup
微信 / QQ
国内 App 大多默认直连。如果跨境业务需要让微信走代理,显式加规则:
- DOMAIN-KEYWORD,wechat,Proxy
- DOMAIN-KEYWORD,weixin,Proxy
- DOMAIN-KEYWORD,qq,Proxy
但要注意:微信走代理可能触发风控。
Apple 服务
Apple 服务 (iCloud / FaceTime / Push) 走全球 CDN,一般直连快。规则集默认:
- DOMAIN-SUFFIX,apple.com,DIRECT
- DOMAIN-SUFFIX,icloud.com,DIRECT
- DOMAIN-SUFFIX,mzstatic.com,DIRECT
如果你跨境业务需要 Apple 服务走代理,改为 Proxy。但 iCloud 走代理可能导致同步失败。
规则集质量对 TUN 的影响
Stash 的 TUN 表现很大程度取决于订阅 yaml 的规则集质量。一份可用的订阅 yaml 至少应该明确标注 MATCH,Proxy 兜底,并包含完整的 fakeip 配置。如果你的订阅 yaml 里 dns-hijack 为空、兜底是 DIRECT、或者 rule-providers 缺失,换一份兼容 Clash / Singbox / V2Ray 的订阅做对照测试,能快速判断是配置还是客户端的问题。
修复后验证
五层排查走完后,用同一个失败 App 和同一个节点复测,不要换测试目标。确认四件事同时成立:系统 VPN 图标显示 Stash;ipleak.net 显示出口 IP 为国外;dnsleaktest.com 显示 DNS 服务器在国外;Stash Dashboard 里该 App 的连接走了预期策略组。
90% 的 TUN 不路由问题卡在 VPN 配置冲突和 dns-hijack 没开。这两项确认后再往下查规则集和 .mobileconfig。