TL;DR
Stash iOS TUN 不路由的五层排查:(1) 确认只有 Stash 一个 VPN 配置激活;(2) 启用 dns-hijack 拦截所有 DNS;(3) 检查规则集 MATCH 兜底为 Proxy;(4) 删除多余的 .mobileconfig 配置文件;(5) Stash 升级到 3.6+ 适配 iOS 19。本文 2026-05-20 实测核对。
Stash 是 iOS 上规则集容量最大的代理客户端,但 TUN 模式偶发”开了但部分 App 不走代理”是高频问题。本文按”症状 → 根因 → 修复”梳理。
症状分类
| 症状 | 最可能根因 |
|---|---|
| 浏览器走代理,某 App 不走 | App 在规则集里被分到 DIRECT |
| 国外网站能上,国内某些 App 失败 | fakeip 与 App 内部 DNS 冲突 |
| TUN 显示已开但全无连接 | iOS VPN 配置冲突 |
| 部分时段正常部分时段不通 | iOS 后台保活被杀 |
| 切节点后偶发不通 | DNS 缓存未清空 |
| 系统设置里看不到 Stash VPN | Stash SystemExtension 授权失效 |
排查 1:iOS VPN 配置优先级
最常见原因:同时装了多个代理客户端,iOS 只让一个 VPN 激活,但你不知道激活的是哪个。
检查激活的 VPN 配置
- 设置 → 通用 → VPN 与设备管理 → VPN
- 看列表里所有 VPN 配置 (可能有 Shadowrocket、Loon、Stash 各一个)
- 激活态的旁边有 √ 或灰色”未连接”标记
- 同时只能有一个绿色”已连接”
修复
- 删除不用的 VPN 配置:点旁边的 ⓘ → “删除 VPN”
- 只保留 Stash 的配置
- 在 Stash App 内 → 设置 → VPN 配置 → 强制重新生成
Apple 的 NetworkExtension 框架设计:同时只能有一个 packet tunnel 激活。多家客户端如果都装,只有最后启用 VPN 的那家有效。
排查 2: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。
排查 3:规则集兜底是 Proxy 还是 DIRECT
在 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 失效,规则不生效。
排查 4:删除多余的 .mobileconfig
iOS 16+ 允许装 .mobileconfig 配置文件 (企业 VPN 一般这样部署)。如果你之前装过某个企业证书或 always-on VPN,可能强制让特定 App 直连。
检查与删除
- 设置 → 通用 → VPN 与设备管理 → 配置文件
- 看列表里所有 .mobileconfig
- 删除不用的 (点进入 → “删除配置文件”)
重置网络设置 (硬路线)
如果实在排查不出,重置网络设置:
- 设置 → 通用 → 转移或还原 iPhone → 还原 → 还原网络设置
- 输入密码确认
- iPhone 重启后所有 VPN 配置 + Wi-Fi 密码 + 蜂窝数据设置都被清空
- 重新装 Stash + 导入配置
注意:这会清掉所有 Wi-Fi 密码,需要重新输入。
排查 5: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 真的拦截了所有流量:
检测 1: 出口 IP
访问 ipleak.net (iOS Safari)
- ✅ IP 显示为国外 (如美国/日本/新加坡)
- ❌ IP 显示真实国内 IP
检测 2: DNS 不漏
访问 dnsleaktest.com,点 Standard Test
- ✅ DNS 显示 Cloudflare / Google 或出口节点 ISP
- ❌ DNS 显示中国电信/联通/移动
检测 3: 单 App 测试
在 Stash → Dashboard 看实时连接列表。打开测试 App,看连接是否经过 Stash 的代理节点。
检测 4: WebRTC 不漏
- ✅ WebRTC IP 与出口 IP 一致
- ❌ 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 走代理可能导致同步失败。
配套订阅的规则集质量
Stash 的 TUN 表现很大程度取决于订阅 yaml 的规则集质量。冲浪笔记长期跟踪的兼容 Clash / Singbox / V2Ray 的订阅在 yaml 模板上明确标注 MATCH,Proxy 兜底 + 完整的 fakeip 配置,Stash 用户开箱即用,不必手动调 yaml。
总结
Stash iOS TUN 不路由的五层修复:
- iOS VPN 配置只留 Stash (设置 → VPN 与设备管理)
- 启用 dns-hijack (yaml 里 tun 块加)
- 规则集兜底 Proxy (
MATCH,Proxy) - 删除多余 .mobileconfig (企业证书可能影响)
- Stash 升级到 3.6+ (iOS 19 必备)
90% 问题在 (1) 与 (2)。本文 2026-05-20 实测核对。