环境信息 (Environment)
Surge Mac 版本: 6.4.1(9550)
Surge iOS 版本: 5.16.2
网络环境: 家庭宽带,拥有动态公网 IP (Dynamic Public IP)
连接方式: Ponte (NAT Type: Full Cone A和静态端口转发)
### 问题描述 (Description)
在使用 Ponte 功能时,当家庭宽带的公网 IP 发生变化(例如路由器重启)后,Ponte 的连接恢复机制存在严重问题,且尝试手动重启服务会导致设备无法重新注册到 CloudKit。
复现步骤 (Steps to Reproduce)
初始状态: 在 Mac 端开启 Ponte,并成功建立连接,iOS 端可以通过 Ponte 正常访问。
触发场景: 重启路由器,导致 ISP 分配的公网 IP 发生改变。
现象 A(自动更新失效): 等待一段时间后,iOS 端仍无法连接 Mac。经测试,iOS 端一直在 Ping 旧的 IP 地址。Mac 端似乎未能及时通过 STUN 检测到 IP 变更并更新 CloudKit 记录,或 iOS 端未能及时拉取新记录。
尝试修复: 为了强制刷新 IP 状态,我在 Mac 端 Dashboard 手动关闭并重新开启了 Ponte 开关。
现象 B(注册状态异常): 重启 Ponte 后,Mac 端显示 可访问,但在“已注册设备 (Registered Devices)”列表中看不到当前 Mac 设备。此时 iOS 端彻底无法发现该 Mac,Ponte 功能完全瘫痪,如下图所示:
预期行为 (Expected Behavior)
自动恢复: 当 STUN 检测到公网 IP 变更时,Surge Mac 应立即触发更新 CloudKit 记录,客户端应能感知并连接新 IP,无需人工干预。
手动重置可靠性: 当用户手动重启 Ponte 开关时,应能立即清除旧的 CloudKit 状态并成功写入新记录,不应出现“显示开启但实际未注册”的中间态。
观察与分析 (Observation & Analysis)
关于现象 A: 怀疑 STUN 探测机制在网络环境变动时的触发频率或灵敏度不足,导致 CloudKit 中保留了过期的 IP 信息。
关于现象 B: 极有可能是 CloudKit 中残留了旧的设备记录(Zombie Record),导致新记录写入冲突或被静默拒绝。只有通过修改 Device Name 强制生成新记录才能暂时解决。
但我在修改新的 device name 后,依然无法解决