没想到我自己都能被代理协议问题带坑里。
最近发现用的一家机场的线路全部连不上了,奇怪的是 Mac 上一切正常,只有 iPhone 连不上,而且所有节点都连不上。
具体表现为收到了 TCP RST,很难判断是哪个环节产生了问题。尝试控制变量,切换网络也无效,甚至我担心是我自己 debug 环境代码问题,结果换到商店版 Surge 也一样。最后以为是机场自己有异常,结果隔了几天也没好。
终于今天花时间刨根问题找原因,确认 RST 是服务端返回的,iOS 和 Mac 连接的地址和端口也都完全一致,那么原因只可能是握手鉴权失败,服务器主动拒绝。
继续深挖,发现是机场切换了 SS2022 协议,这协议的设计,依赖客户端时钟,如果客户端时钟与服务端相差大于 30 秒,那么认为该消息是无效的。
而我最近由于出去玩,手动改了时区,导致自动对时也关闭了,回家后忘了重新打开,几周后积累误差超过了 30s,所以握手持续失败。
自制协议设计者特别喜欢搞这些「花花绿绿」的设计,没有哪个正经协议会有如此之高的时钟精确度要求,不是因为我对着源码找可能根本找不到原因。