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 VPNStash SystemExtension 授权失效

iOS VPN 配置优先级

最常见原因:同时装了多个代理客户端,iOS 只让一个 VPN 激活,但你不知道激活的是哪个。

检查激活的 VPN 配置

  1. 设置 → 通用 → VPN 与设备管理 → VPN
  2. 看列表里所有 VPN 配置 (可能有 Shadowrocket、Loon、Stash 各一个)
  3. 激活态的旁边有 √ 或灰色”未连接”标记
  4. 同时只能有一个绿色”已连接”

修复

  • 删除不用的 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 直连。

检查与删除

  1. 设置 → 通用 → VPN 与设备管理 → 配置文件
  2. 看列表里所有 .mobileconfig
  3. 删除不用的 (点进入 → “删除配置文件”)

重置网络设置 (硬路线)

如果实在排查不出,重置网络设置:

  1. 设置 → 通用 → 转移或还原 iPhone → 还原 → 还原网络设置
  2. 输入密码确认
  3. iPhone 重启后所有 VPN 配置 + Wi-Fi 密码 + 蜂窝数据设置都被清空
  4. 重新装 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 是否真的拦截了所有流量:

  1. 出口 IP:访问 ipleak.net,确认显示的是国外 IP 而非真实国内 IP。
  2. DNS 泄漏:访问 dnsleaktest.com 点 Standard Test,确认 DNS 服务器显示 Cloudflare/Google 或出口节点 ISP,而非中国运营商。
  3. 单 App 测试:在 Stash Dashboard 看实时连接列表,打开目标 App 确认连接经过代理节点。
  4. 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。

相关阅读