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

11 KiB
Raw Permalink Blame History

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 验收推广到其他客户端。