2026-06 修到的腿
PR #137 / #136 / #139 / #140 修的是安装包下载字节。这条腿现在会直连。
两个都是我们自己的 bug,不是用户设置问题;其中一个我们一个月前"修过",但修错了地方。
proxyAllAppleTraffic 关闭时,本应让 Apple 流量直连。实际实现只覆盖 apple-cn 的 163 个精确域名,再加 5 个硬编码的 App Store 下载域名。其余 *.apple.com 全部落入带有 domain_suffix: apple.com 的 geolocation-!cn,最终走代理。
buy.itunes.apple.com 等控制面域名
apple.com 后缀,走代理
用 sing-box 直接测试客户端内置的 .srs 规则集,结果如下。
| 主机 | 作用 | apple-cn | geosite-cn | geolocation-!cn | 实际走向 |
|---|---|---|---|---|---|
| buy.itunes.apple.com | 购买·授权 = 点"更新"那一步 | ✗ | ✗ | ✓ | 代理 |
| su. / se. / sf-api. / client-api. / play. / init.itunes.apple.com | 商店控制面 | ✗ | ✗ | ✓ | 代理 |
| amp-api.apps.apple.com | 商店内容 API | ✗ | ✗ | ✓ | 代理 |
| iosapps. / aod. / osxapps.itunes.apple.com | 安装包字节 | ✗ | ✗ | ✓ | 直连(硬编码) |
| is1-ssl.mzstatic.com | 图片 | ✓ | ✓ | ✓ | 直连 |
PR #137 / #136 / #139 / #140 修的是安装包下载字节。这条腿现在会直连。
点"更新"时先走购买与授权。这条腿依然被代理,从未真正修好。
"应用商店可以打开但无法更新"
客户的描述一个月没变。这不是"复发",而是从来没修好。
| proxyAllAppleTraffic | 主机 | 实际走向 |
|---|---|---|
| 关 | buy.itunes.apple.com | 代理 |
| 开 | buy.itunes.apple.com | 代理 |
开或关,两种情况都走代理。这个开关对该域名完全无效。
苹果官方企业网络文档要求放行整个 *.itunes.apple.com、*.apps.apple.com、*.mzstatic.com 通配符。我们只挖了其中 5 个叶子。
Windows 的 TUN 地址是写死的双栈,完全不看域名策略。"仅 IPv4"名不副实:DNS 不再返回 AAAA,但 TUN 仍然接管 ::/0。
::/0HTTPDNS 本来是国产 App 用来躲运营商 DNS 劫持的。它绕开我们的 DNS 过滤,照样拿到 IPv6,然后被 TUN 收进来,丢给没有 IPv6 出口的香港节点,最后一直等待超时。
同一份代码注释其实已经写了"微信 HTTPDNS IPv6 + 节点没 IPv6",但只在苹果平台修过,Windows 一直没管。
| 平台 | 是否接管 ::/0 | 快速拒绝 | 用户看到的结果 |
|---|---|---|---|
| iOS / macOS-TUN | 接管 ✓ | 有 ✓ | 立刻失败并回落 IPv4 |
| Android / Linux | 不接管 ✓ | 无需拒绝 | 立刻"网络不可达" |
| Windows | 接管 ✓ | 没有任何拒绝 ✗ | 卡死等超时 |
分歧不是噪声。分歧暴露了最容易凭直觉判断错的安全边界。
负责写跨平台契约
主张保留双栈,再加一条拒绝规则。它担心拿掉 IPv6 地址会让 Windows 绕过 VPN 直接走 IPv6,造成漏流量。
把握:75%负责落地实现
主张直接把 Windows TUN 改成只有 IPv4,减少依赖层与拒绝语义的不确定性。
::/0 路由。strict_route 开启时,会安装 Windows WFP 防火墙规则,直接拦截 App 的 IPv6 连接。因此立刻失败,既不漏也不静默。改成只有 IPv4 更简单、更稳,而且不依赖 gvisor 是否正确实现拒绝语义。
这些不是措辞微调。每一处都会改变根因判断、修复方案或客户建议。
*.itunes.apple.com。不带 *. 就变成精确匹配,等于什么都没做,还会让我们误判"理论被推翻"。问题数逐轮收敛,全部接受,没有一条被驳回。其中两条抓出我自己改错的地方。
| 检查项 | 命令 | 结果 |
|---|---|---|
| 静态分析 | flutter analyze | No issues found(退出码 0) |
| 服务层全量测试 | flutter test test/services/ | 1098 通过,1 跳过(退出码 0) |
| 本次相关测试 | flutter test .../config_adapter_service_test.dart | 52 通过 |
| 回归有效性 | 把代码改回修复前再跑 | 3 个测试失败,报错正是本次 bug 的特征(说明测试不是摆设) |
| 改动范围 | git diff --stat | 6 个文件,全部可解释,无多余文件 |
两个方案都要求完全断开再重连。Windows 方案必须同时说明保护能力下降。
设置 → 打开域名规则 → 添加以下域名为直连 → 完全断开重连。
*.itunes.apple.com
*.apps.apple.com
*.mzstatic.com
必须带 *.。不带就是精确匹配,等于没有覆盖子域名。
关闭 TUN 模式,保留"自动配置系统代理" → 保存 → 断开重连。
必须如实告诉客户:这会降低保护。只有认系统代理的软件才走 VPN,其余软件会直接绕过。