1. 经典死循环:代理回环死锁(Proxy Loopback Deadlock)
理解回环死锁的发生时序,是成为排障高手的必修课:
```text
1. 某天早上,当前正在使用的代理节点发生故障离线
│
▼
2. 用户点击「刷新订阅」希望获取能用的新节点
│
▼
3. 操作系统将发往「sub.airport.com」的请求送入本地 Clash
│
▼
4. Clash 匹配规则,由于规则末尾是 MATCH,PROXY,请求被送入当前代理
│
▼
5. 但当前代理正是那个已经死掉的节点!数据包在海外黑洞中石沉大海
│
▼
6. 客户端在等待 30 秒后抛出红色「Connection Timeout 超时」错误!
```
**结果**:只要开着代理就永远更新不了订阅,形成死循环死锁!
💡 最简单的临时自救:关闭电脑上的系统代理与 TUN 模式,裸连直接点击更新订阅。
2. 彻底根治:在配置中声明订阅域名直连白名单
为了从架构层面彻底杜绝回环死锁,必须在规则引擎头部将机场相关域名显式绑定为 `DIRECT`:
yaml
# 在主规则 rules 的最前列添加机场直连规则
rules:
# 强制机场订阅 API 与官网永远直连,永不走代理
- DOMAIN-SUFFIX,airport-domain.com,DIRECT
- DOMAIN-SUFFIX,sub-api-gateway.com,DIRECT
- DOMAIN-KEYWORD,subscribe,DIRECT
# 后续其他规则
- GEOIP,CN,DIRECT
- MATCH,PROXY 3. 本地运营商 DNS 解析阻断排障
如果即使关闭了代理,更新订阅依然提示连接超时:
- 说明你所在的本地电信/联通/移动运营商对该订阅域名实施了 **SNI 握手阻断** 或 **DNS 污染**;
- **排查方法**:
1. 手机断开家里的 Wi-Fi,切换为 5G 移动流量;
2. 手机开启便携式热点,电脑连接手机热点;
3. 再次在电脑上点击更新订阅,若秒级成功,证明是家庭宽带固网遭到了定向阻断。
❓ 常见疑问与排查步骤
为什么开着全局模式(Global)绝对更新不了订阅?
因为 Global 模式会无条件将整台电脑的所有请求全部强行送入当前选中的节点。一旦该节点损坏,向任何网址发包都会超时,自然无法拉取新配置。
可以在 Hosts 文件中直接绑定订阅域名的 IP 吗?
可以。通过海外 DNS 查出订阅服务器的真实海外 IP,在 Windows `C:\Windows\System32\drivers\etc\hosts` 中写入 `104.21.x.x sub.airport.com` 可以绕过本地 DNS 污染。
客户端设置中的「更新超时时间(Timeout)」可以调大吗?
可以从默认的 5000ms 调大至 15000ms(15秒)。但在遭遇死循环时调大超时只会让转圈等待时间更长,配置直连才是根本之道。