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

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

90 lines
12 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 原生 WireGuard 独立承载的本机验证
2026-11-02,Mac Studio,Surge 6.11.0 build 12670,FFSB 0.1.27 导出的既有设备身份。用户授权提取本机参数,并在退出 FFSB 后进行独立验证;用户明确选择暂不测试登录后的真实业务。
**已证实:本轮测试期间,本机可以由 Surge 原生 WireGuard 承载所测专线流量,无需运行 FFSB GUI 或 daemon。** 这不等于脱离 FFSB 服务商、取得服务端管理权限,或已经验证未来授权和节点更新。生产订阅、应用代码与数据库均未修改。
## 证据链
| 验证层 | 结果 |
|---|---|
| 身份来源 | 经 macOS 管理员授权,以标准 WireGuard UAPI `get=1` 只读导出运行时参数;从私钥派生的公钥与当前 FFSB 身份一致,未读取登录令牌 |
| 排除后台依赖 | 约 10:27(本机 UTC+8)临时 `launchctl bootout system/ffsb`;之后确认 GUI/daemon 进程均不存在、utun100 不存在;未永久禁用启动项或卸载软件 |
| 独立握手 | Surge 运行时显示策略类型 WireGuard、handshakeCompleted=true;物理 en0 定向元数据抓包记录 148 字节发起和 92 字节响应,以及后续双向加密数据 |
| 物理数据 | 第二段抓包共 208 包,125 上行、83 下行,其中 80 个下行包大于握手响应长度;抓包仅保存头部摘要,未解密用户内容 |
| 独立 DNS | 直接向资源节点的隧道地址 UDP/22054 查询 API,NOERROR/有 A 记录,约 96 ms;Surge 请求日志含 WireGuard-DNS Remote DNS completed |
| 系统/显式代理入口 | 两种 ipify 入口均走原生 WG,返回相同的原 FFSB 出口;未把 fake-IP 当成最终出口 |
| 多轮新连接 | 10:32:45—10:41:18,5 轮 × 7 请求,共 35/35 收到 HTTP 响应;最后一轮 API 根路径约 0.32 秒返回 404 |
| 规则范围 | 当前服务端 Selected 清单 27/27 项原生规则解释均进入 WG;通配项的解释样本不是实际业务穷举 |
| 实际域名样本 | 19 个精确根域+5 个真实通配样本,共 24 个;22 个完成 TLS/HTTP,两个 MCP 根域无 A 记录,未计为连通通过 |
| 反向对照 | 将测试配置端点改为错误 UDP 端口,API 和 ipify 均超时,GitHub 仍为 200;恢复正确端点后重新握手,7/7 请求恢复,无普通代理兜底假成功 |
| 较长响应 | claude.com 公开页面约 489 KB,以 12 KB/s 限速,39.03 秒完整收完、HTTP 200;这是较长 TCP 响应,不能称为模型 SSE 验收 |
| 其他分流 | GitHub 仍走日本 Proxy;downloads.claude.ai 仍经隐藏 Claude 组转美国 AI Nodes;其他手动组选择一致,仅 Claude 改选新 WG 策略 |
| 原配置完整性 | 原托管文件与备份 SHA-256 一致;Surge 引擎启动时间保持 09:50:52,未重启引擎;抓包与恢复 watchdog 已停止 |
## 测试期间的实际配置变化
测试期间活动配置为 **`Proxy Station WG Validation`**,由原托管文件的磁盘内容生成独立本地副本。原 `Proxy Station` 保留,未改托管 URL、未刷新或上传生产配置。这个本地副本**不自动跟随托管订阅更新**。用户随后要求回退组合方案,最新运行状态见文末的回退记录,不以测试快照推断当前活动配置。
- 使用独立名称 `FFSB Native WG Validation`,由原 Claude select 组选取;其他地区/AI/All Nodes 的选择不变。
- 原生 WG 使用导出的设备身份、资源节点公网 UDP 端点、MTU 1280、keepalive 25,DNS 指向资源节点隧道地址的 22054 端口。
- 删除旧 25 项指向本机 FFSB 虚拟 DNS `100.70.255.254` 的 Host 映射,不再依赖 utun100。
- 保留原有普通代理与 AI DNS 设置,未保留试验中指向远端 resolver 的额外全局 Host 覆盖;原生 WG 自己完成隧道内 DNS。
- 本地验证副本补入服务端新增的 hcaptcha.com/通配项,合计 27 项。仓库生成器源清单与生产 settings 仍是原方案,未修改。
- 验证副本包含资源节点隧道地址的精确 WG 规则,供普通 dig 独立查询;不放宽整个 CGNAT 网段。
- WG 内部 `allowed-ips=0.0.0.0/0` 只负责该策略内部选择 peer;业务仍按域名规则选 WG,不能据此扩大服务器许可范围。
**不要在此 WG 配置活动时连接 FFSB:两者复用相同私钥和隧道地址,可能触发端点漫游并抢占流量。** 恢复原方案时先切回原 `Proxy Station`,再恢复 FFSB 服务/连接。具体恢复命令与私有配置均在本机归档说明中。
## 失败记录与验收边界
初始三轮失败均保留。第一版使用 CLI dump 配置复制节点,其认证字段与磁盘原件不同,导致普通代理对照失败;随后从磁盘原件重建,保留认证字段。旧策略名下还出现旧本机 DNS 映射及状态复用现象;采用独立策略名、移除旧本机 DNS 映射并完成配置加载后恢复。没有严格分离这一阶段的缓存、配置切换及名称复用影响,不把初始失败归因为服务端,也不删掉失败数据。
原生配置及 FINAL 等静态检查通过。`scripts/check-surge.py --fetch-rulesets` 在远程规则集下载阶段仍失败,**全量在线规则集快照校验未通过**;这一问题在本轮改动前已存在,不以当前缓存匹配正常宣称所有上游当前可下载。
HTTP 403/404/426 仅证明传输和根路径响应,不等于登录、验证码完成、MCP 会话或模型对话成功。用户选择暂不测真实业务,因此未调用计费模型 API。未验证设备 DNS 泄露探测、睡眠/换网/重启、长时间运行、服务器迁移、设备重新认证或授权撤销后的行为。当前仅使用一个已验证资源节点,没有复制 NetBird 的动态节点发现、ICE、中继与故障切换机制。
本轮能够支持的结论是:**所测时间窗口内,本机客户端及后台可以由 Surge 原生 WG 替代。** 不能将其扩大为永久无需控制服务、可通用导入其他设备或所有业务已验收。
## 私有证据
完整归档位于本机 `~/Library/Application Support/ProxyStationFFSB/native-wireguard-validation-20261102-1042/`,含 239 个文件及 SHA-256 清单;目录 700,文件 600。包含原始失败/成功结果、原生请求和运行时状态、物理包元数据、原配置备份、实际活动配置、导出身份及复现脚本。真实凭据和节点地址不入仓库、不上传第三方。
其中 `independent-validation/evidence-summary.json` 为脱敏摘要;`surge-ffsb-candidate.conf` 为本机实际验证的集成副本;早期最小候选另存,不与验证完成的版本混淆。
## 管理连接没有被替代
当前实现没有 NetBird 控制客户端或同步脚本。它使用此前管理服务下发的设备身份、地址和节点参数快照,依赖服务端当时仍认可该设备及权限,直接建立 WireGuard 数据隧道。Surge 负责 WireGuard 握手、保活和会话密钥更新;没有接管邮箱登录、设备注册/重新认证、配置与权限同步、ICE、中继或节点故障切换。域名解析可以通过已知节点 DNS 完成,但域名清单与节点变更不会自动同步到此本地副本。
因此后续研究重点是**长期身份有效性和配置同步**,不是再次证明静态 WireGuard 能握手。不要把一次成功写成管理连接已被 Surge 实现,也不要把 WireGuard 自身的会话换钥误认为必须重新提取设备私钥。
## 下一次继续的步骤
1. 先读本文回退记录、`AGENTS.md` 的最新状态及原生产手动方案,检查实际活动配置和 FFSB 状态。历史归档只作复现材料,不直接覆盖新生产订阅。
2. 私有归档中 `SHA256SUMS.txt` 校验历史证据,`surge-ffsb-candidate.conf` 是当时验证过的完整集成副本;`reproduction-scripts/` 保留导出、候选生成、探测、抓包和反向对照脚本。这些脚本含当时路径/PID/节点参数,需审阅后适配,不能直接盲跑。
3. 从当前 FFSB 状态重读节点和 Selected 域名,必要时用经管理员授权的 WireGuard UAPI `get=1` 重新导出;派生公钥对比现有身份,避免把历史端点/路由误当最新。私钥只进本机受限权限文件。
4. 保留当前原始配置与完整组选择,准备自动恢复。先断开 FFSB,再停 daemon 并确认进程和 utun100 消失,最后才加载 WG 测试配置,禁止同身份并行连接。
5. 使用独立 WG 策略名、节点隧道内 DNS,移除旧本机虚拟 DNS 映射;保留其他分流。若基于最新订阅重建,必须从受限的磁盘原件保留认证字段,不能拿 CLI 脱敏输出直接激活。
6. 重做握手、隧道 DNS、新建 HTTP、出口与普通代理对照、错误端点失败/恢复测试。只有新增验收授权后再测真实业务、睡眠、换网、重启与长时间控制连接缺席,不把历史成功当作新环境验收。
未修改生产 FFSB 功能或增加自动同步机制;后续若要把原生 WG 正式纳入托管订阅,须另行设计设备独立身份、凭据保存、更新与撤销机制,不能把本机私钥写入共享订阅。
## 回退至 FFSB+Surge(2026-11-02,11:05 验收)
用户要求固化探索成果后回退日常组合方案。**当前已恢复正式托管 `Proxy Station`,Claude → `🦁 FFSB`,FFSB GUI 和 daemon 均运行。** 原生 WG 不再活动,验证配置已移出 Surge 配置列表,完整副本保存在私有归档中;不要把上面的试验状态或旧归档 README 当成当前状态。
回退顺序为:保存试验配置与组选择 → 切回原托管配置 → 确认试验策略不存在、活动请求为零 → 恢复 FFSB launchd 服务并连接 → 打开 FFSB GUI。没有同身份并行运行,未重启 Surge 引擎,未修改原托管文件、生产数据或其他手动组选择。
回退后验收:
- FFSB management/signal Connected,资源 peer P2P Connected;utun100 恢复,MTU 1280,disableDns=true、disableClientRoutes=false。
- 系统 DNS 仍由 Surge 接管,API 系统查询为 fake-IP;Surge DNS trace 经本机 FFSB DNS `100.70.255.254` 返回真实地址,约 95 ms。
- 11:05:29—11:05:43,3 轮 × 8 请求 **24/24** 收到 HTTP 响应。API 根路径 404,约 0.33—0.36 秒;系统与显式 Surge 的 ipify 均为原 FFSB 出口。claude.ai/join 测试均完成传输。
- 原生请求 #4220 API、#4221 Claude、#4218/#4219 ipify、#4222 join 均为 `🦁 FFSB / utun100` 且双向有数据。
- #4223 GitHub 保持日本 Proxy;#4224 downloads、#4225 Auth0 保持隐藏 Claude 组 → 美国 AI Nodes;FFSB 外层控制连接 #4140/#4142/#4144 为 DIRECT/en0,双向有字节。
- 原生产清单 25/25 项原生规则解释进入 FFSB;原托管文件字节未变,其他手动组选择不变。活动配置通过官方 CLI 与 FINAL 等静态检查;本次未宣称全量上游规则集在线快照通过。
这里恢复的是生产原有 25 项方案。FFSB 当前下发的 27 项中,hcaptcha.com/通配项尚未同步进生产 Surge 清单,本次未扩展生产规则;原生 WG 试验中补齐这两项的成功仍保留在历史证据中。没有测试登录、验证码完成或真实对话,不将根路径响应当成业务验收。客户端 fake-IP 警告的既有判断差异也未通过更改 DNS 来隐藏。
本轮回退证据另存本机 `~/Library/Application Support/ProxyStationFFSB/restore-combined-20261102-110255/`,目录 700、文件 600,包含回退前配置、组选择、24 次探测、DNS/请求日志与恢复后的状态。原探索归档保持不可变,238 项内容哈希复核通过;后续继续原生 WG 时使用前文步骤,不自动激活旧实验配置。