Files
proxy-station/docs/FFSB-SURGE-IMPLEMENTATION-2026-10-19.md
YANG JIANKUAN a5d980a5e9 feat: 添加 WireGuard 设备管理并完善客户端分流
实现独立加密设备身份、网关 agent、持久生命周期任务和 Surge/FlClash 专属订阅凭证。

完善 Shadowrocket 规则转换与 Clash AI DNS,增加 Surge FFSB 适配、规则快照、运维工具及验收文档。
2026-11-02 22:44:23 +08:00

100 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FFSB / Surge 实施及验收(2026-10-19)
> 历史方案:本机自动协调层已退役,当前状态以 [FFSB 手动订阅方案](FFSB-MANUAL-SUBSCRIPTION-2026-10-19.md) 为准。
## 当前结论
本机已启用 `Proxy Station Claude` 配置及用户级自动协调任务。核心分流、FFSB 关闭回退、重新连接恢复、浏览器与命令行入口、DNS 和外层 DIRECT 已通过实际连接验证。**尚未达到全部场景验收**:用户明确选择暂不重启 Surge,故两种完整启动顺序未测;真实 Claude 登录/模型流、长期运行、睡眠唤醒及换网也未验收。
此前设计文档的“不允许回退”要求已被用户最新要求替代。当前职责是:
- `Claude`:本机 25 项自动入口,FFSB 就绪时优先 FFSB;FFSB 关闭后使用 `🦀 Claude`。
- `🦀 Claude`:独立的 Surge 出口选择组,当前保留美国选择。旧 Claude 规则中超出 FFSB 25 项的地址始终走这里。
- `🤖 AI`:其余 AI 服务,原有选择未改。本次真实 ChatGPT 请求仍是 AI → AI Nodes → 美国 Direct。
用户明确确认“25 项 FFSB,其余 Claude Surge”,随后指定回退组名称为 `🦀 Claude`。
## 清单来源与生产变更
25 项确实来自本机 `/usr/local/bin/ffsb-service networks list` 的 Selected 网络,FFSB GUI 同时显示 25/25。原始输出保存在私有证据目录,可公开复查的域名快照为 [ffsb-domains.json](../rules/ffsb-domains.json):18 个精确项、7 个通配项。
合并来源包括上述清单、生产显式 Claude 补充规则以及当时 Sukka AI 列表中的 `anthropic.com`、`clau.de`、`claude.ai`、`claude.com` 后缀。按集合覆盖去重得到 **21 条业务规则**,另加 **1 条 Claude DNS 传输规则**。生产最终为 14 组、277 条规则,唯一启用 FINAL 位于末尾。远端混合 AI 列表仍服务其他 AI;Claude 在其之前被独立规则接住,不修改第三方列表。
21 条业务规则:
- 9 个后缀:anthropic.com、clau.de、claude.ai、claude.com、claudemcpclient.com、claudemcpcontent.com、claudeusercontent.com、ffsb.sg、ip.net.coffee。
- 10 个精确域:api.ipify.org、icanhazip.com、ifconfig.me、join.fufeishangban.com、servd-anthropic-website.b-cdn.net、anthropic.com.cdn.cloudflare.net、anthropic.auth0.com、anthropic-com.ghost.io、browser-intake-us5-datadoghq.com、http-intake.logs.us5.datadoghq.com。
- 2 个原有官方 inbound 范围:160.79.104.0/23、2607:6bc0::/48(no-resolve)。
本机 FFSB 覆盖仍严格使用原 25 项,不把合并后的宽泛后缀全部交给 FFSB。因此 `downloads.claude.ai` 使用 `🦀 Claude`,已经真实请求确认。
移除旧的三个服务器 IP /32 DIRECT 补丁、整个 FFSB App 路径 DIRECT,以及已被靠前 Anthropic 后缀覆盖的 statsig 冗余规则。保留真实服务进程 `/Applications/FFSB.app/Contents/MacOS/ffsb-service` DIRECT、独立 bootstrap 域名直连和真实解析。其他应用的 STUN 防护、Tailscale 规则、AI/普通代理选择保留。
生产 DNS:Claude 合并域名显式使用 `https://1.0.0.1/dns-query`,1.0.0.1/32 走 `🦀 Claude`;其余 AI 保持原 1.1.1.1 路径。FFSB 开启时,本机 25 项更靠前的 Host 覆盖使用 FFSB DNS;关闭时撤除覆盖。没有将所有公共 DNS 改送 FFSB。
生产在线备份:`before-claude-independent-ffsb-20261019-115104.db`,已核对 root 属主、600 权限、6,692,864 字节。所有写入经管理 API,未部署应用代码。
## 实现与依据
源码为 [scripts/ffsb](../scripts/ffsb/README.md)。协调任务每 10 秒检查 FFSB 管理/信令连接及 DNS 是否可回答;生成并校验完整本机配置后,原子替换并 reload/flush DNS。生产配置每小时经原 HTTPS 地址拉取、校验,缓存和凭据仅落本机私有目录;不手改原托管文件。
FFSB 策略为 direct,显式 `interface=utun100`、`allow-other-interface=false`、`dns-follow-interface=true`,探测 URL 属于 FFSB 25 项。Surge 增强模式的普通 DIRECT 绑定物理接口,不能用来代替业务的 utun100 绑定;这恰好用于 FFSB 外层服务避免套远端代理。[Surge 原理](https://manual.nssurge.com/book/understanding-surge/en/)、[策略参数](https://manual.nssurge.com/policies/parameters.html)。
DNS 与连接出口是两个独立环节;本次同步切换 Host 与策略组成员,不把“FFSB DNS + 公共 DNS 并列”误当顺序备用。Host 首条匹配,多个 DNS 并列会竞争回答。[Host 官方说明](https://manual.nssurge.com/dns/local-dns-mapping.html)。
使用原生 fallback 探测选择优先成员,关闭 FFSB 后本地配置只保留 `🦀 Claude` 成员;探测、协调和连接缓存都有延迟,不承诺瞬时切换或迁移旧连接。[fallback 官方说明](https://manual.nssurge.com/policy-groups/fallback.html)。
曾考虑使用模块加入策略,但官方模块不能调整 Proxy/Proxy Group,因此最终使用本机完整生成层,保留生产源及回滚入口。[模块限制](https://manual.nssurge.com/profile/module.html)。
## 测试记录
| Case | 结果 | 证据/范围 |
|---|---|---|
| FFSB 清单提取与去重 | 通过 | CLI Selected 25 项;GUI 25/25;21 条合并业务规则 |
| 生产 HTTPS 与规则集 | 通过 | 官方 Surge CLI OK;49/49 远程规则集下载与快照校验成功,静态遮蔽提示 0 |
| 本机开启/关闭配置 | 通过 | 两种候选官方 CLI OK;4 个离线测试覆盖精确范围、旧规则回退、改名、清单漂移拒绝 |
| Surge DNS | 通过 | api.anthropic.com → 160.79.104.10;dns trace 上游 100.70.255.254 |
| Node 系统与 c-ares 解析 | 通过 | lookup 与 resolve4 均为真实 160.79.104.10,无 198.18 fake-IP |
| IPv6/HTTPS RR | 限定通过 | 已测样本 AAAA 无结果;TYPE65 返回 NOERROR 空回答并注明 netbird 不支持该查询类型,不代表支持 HTTPS RR 或所有 IPv6 场景 |
| 18 个精确域 HTTPS | 16 个完成传输 | 另外两个 MCP 根域无可用 A;403/404 等仅算 TLS/HTTP 传输完成,不算业务认证成功 |
| 通配域样本 | 4 个有效样本完成 | www.anthropic.com、platform.claude.com、bridge.claudeusercontent.com、c.ffsb.sg;www.clau.de 无可用地址;两个 MCP 通配域缺真实业务子域 |
| 显式 Surge 代理 | 通过 | #53773 / #53780:Claude → FFSB,DNS 100.70.255.254,socket 明确绑定 utun100 |
| FFSB 域名与控制 IP 重合 | 当前样本通过 | #53782 c.ffsb.sg 绑定 utun100 完成 HTTP 200;其后管理/信令均 Connected,不据 route get 单独判定环路 |
| FFSB 外层 | 通过 | #53827 控制连接 DIRECT,socket 绑定 en0;外层 WireGuard UDP 双向有流量;#53752 STUN DIRECT 上行20/下行32字节 |
| 关闭回退(手动触发协调) | 通过 | 两种 curl 入口均 HTTP 200、出口104.28.195.192;DNS 切到1.0.0.1 DoH |
| 自动关闭/恢复(LaunchAgent) | 通过 | 不手动运行协调脚本:本次关闭约1秒回退;重连后约12.05秒恢复;前后真实请求成功,出口切回138.75.58.11 |
| 浏览器 | 出口测试通过 | Chrome api.ipify.org:关闭时104.28.195.192,恢复刷新后138.75.58.11 |
| 集合外 Claude | 通过 | #53785 downloads.claude.ai → 🦀 Claude → 美国 Warp,HTTP403仅为根路径响应 |
| 其他 Surge 流量 | 通过 | #53786 GitHub → Proxy HTTP200;#53787 ChatGPT → AI,保持原选择 |
| Tailscale | 部分回归通过 | Running、Quad100 MagicDNS 返回答案;本轮未测 tailnet HTTP/SSH 和蜂窝入站 |
| 订阅刷新 | 通过 | --refresh 拉取改名后的生产配置,保留本机覆盖与组选择,经 CLI 校验 |
| 两种完整启动顺序 | 未验证 | 用户选择“暂不重启,记录该项未验证”;没有重启 Surge 引擎 |
| Claude Code / Desktop 登录、模型流 | 未验证 | 按用户要求未调整现有 Base URL;未发送计费模型请求。Node DNS 与 curl 不能代替该验收 |
| 短时连续新连接 | 通过 | 约123秒、两种入口交替共24次,全部成功且出口均138.75.58.11;不代表长流测试 |
| 长期、睡眠、换网 | 未验证 | 短时新连接测试不能替代这些场景 |
私有原始证据包括 `automatic-test.json`、`fresh-request-evidence.json`、`outer-active-evidence.json`、`domains-on-test.json`、生产 API 前后快照及配置校验日志,已归档到本机 `~/Library/Application Support/ProxyStationFFSB/evidence-2026-10-19/acceptance/`,原 `/private/tmp/claude-policy-implementation/` 副本保留。其中可能含节点和本机网络信息,不提交仓库、不公开上传。
## 失败、修正与限制
第一轮原生 DNS 测试超时;随后发现 FFSB 当时管理/信令断线、其 DNS 直接返回 SERVFAIL。恢复 FFSB 后,同样的原生 DNS 配置成功,不能据第一轮超时断言 Surge 不支持 FFSB DNS。曾观察控制 IP 的全局路由指向 utun100,但实际 socket 记录证明外层控制连接绑定 en0;因此“必然回路”没有得到证实。
自动审批曾拒绝没有同流程恢复保证的关闭测试。随后改成 try/finally 保证恢复的单一流程,通过审批并完成测试;没有绕过拒绝执行原命令。
FFSB 自身设置未改变,仍会安装系统分域 DNS 和真实地址路由。因此当前实现验证的是**正常就绪分流及显式关闭回退**。接口仍存在但 FFSB 内部故障时,残留的系统 resolver/路由可能影响普通客户端,不能将此方案描述为覆盖所有半故障状态的无损恢复。当前网络没有实际 IPv6 出口场景,不能宣称所有 IPv6 客户端路径已验收。
外部加密代理、应用私有 DoH、硬编码共享 IP 等可能隐藏目标域名;无法从外层 IP 无条件还原“任意进程的任意请求”。客户端升级、接口/DNS/范围改变后需复测。本次不承诺“万无一失”。
## 收尾完成(2026-10-19)
先前归档和安装曾因自动审批服务返回“Selected model is at capacity”而未执行。用户切换 full access 并明确要求继续后,已完成以下操作,没有重启 Surge 或切换 FFSB:
- 将 116 个原始证据文件复制到 `~/Library/Application Support/ProxyStationFFSB/evidence-2026-10-19/acceptance/`,逐文件核对 SHA-256,并保存 `sha256-manifest.json`。原临时文件保留;归档目录权限 700、文件权限 600,已检查。
- 先用官方 CLI 确认活动配置为 `Proxy Station Claude`,再将 `FFSB-Core-Probe.conf` 移到归档的 `retired-profiles/`,校验内容哈希一致,Surge Profiles 中不再保留该测试文件。
- 将旧协调脚本备份为归档中的 `reconcile-before-logging.py`,原子安装新脚本,并确认与仓库源码逐字节一致。
- 真机执行 `--refresh` 返回退出码 0,输出 `Refresh succeeded; configuration unchanged; mode=FFSB; no reload`。执行前后生成配置 SHA-256 一致,活动配置仍为 `Proxy Station Claude`。结果保存在归档的 `closeout-verification.json`。
8 项离线测试通过(原覆盖层 4 项、刷新日志 4 项);新增测试覆盖手动成功、后台静默、下载失败、原生校验失败,并确认无变化不 reload、不输出订阅 URL。刷新失败且已有有效缓存时明确提示沿用缓存,不能只看退出码认定远端刷新成功。此次收尾未扩大上文网络验收范围,未验证项继续保留。
其他客户端范围:本次生产分组/规则也会影响共享订阅的其他格式;未完成 Clash 原生解析器或 iOS 真机复验,不能将 Surge 验收推广到其他客户端。