实现独立加密设备身份、网关 agent、持久生命周期任务和 Surge/FlClash 专属订阅凭证。 完善 Shadowrocket 规则转换与 Clash AI DNS,增加 Surge FFSB 适配、规则快照、运维工具及验收文档。
11 KiB
FFSB / Surge 实施及验收(2026-10-19)
历史方案:本机自动协调层已退役,当前状态以 FFSB 手动订阅方案 为准。
当前结论
本机已启用 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: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。协调任务每 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 原理、策略参数。
DNS 与连接出口是两个独立环节;本次同步切换 Host 与策略组成员,不把“FFSB DNS + 公共 DNS 并列”误当顺序备用。Host 首条匹配,多个 DNS 并列会竞争回答。Host 官方说明。
使用原生 fallback 探测选择优先成员,关闭 FFSB 后本地配置只保留 🦀 Claude 成员;探测、协调和连接缓存都有延迟,不承诺瞬时切换或迁移旧连接。fallback 官方说明。
曾考虑使用模块加入策略,但官方模块不能调整 Proxy/Proxy Group,因此最终使用本机完整生成层,保留生产源及回滚入口。模块限制。
测试记录
| 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 验收推广到其他客户端。