SharkCloud 订阅全死事件复盘 (SharkCloud Subscription Outage Postmortem)
记录一次以为"订阅死了"、实际是两段式故障(先 DNS 后机场)的完整排查过程,含可复用的净化内核隔离法。
一句话结论
节点端口全通、DNS 正常、订阅能拉到,但所有节点在 TLS 握手时被远端掐断(forcibly closed by remote host)——最终判定为机场入口/中间设备干扰,非本机问题,且当天先后叠加了 EasyConnect 掐 DNS 的内循环故障。
事件时间线 (2026-09-02)
| 时间 | 现象 | 判断 |
|---|---|---|
| 上午 | 全代理失效,网页全挂 | 先怀疑"订阅全死" |
| 排查 | 直连 ping/HTTP 正常,但 UDP/TCP 53 DNS 全超时,连直连公共 DNS 都不通 | EasyConnect 在后台掐 DNS |
| 杀 ECAgent | 53 端口立即恢复 | 确认元凶 = EasyConnect"DNS 防泄漏" |
| 重启 Verge | 代理短暂恢复(204) | 内存在断网期启动,状态坏 |
| 用户更新订阅 | 又 502 | 不止 DNS,还有第二层问题 |
| 净化内核实测 | 单节点最小配置同报 forcibly closed | 机场层故障独立于本机 |
两段式故障复盘:别把两件事混成一个
这次最易踩的坑是把"EasyConnect 掐 DNS"和"机场掐连接"当成一个故障。实际是先后叠的:
- 第一段(EasyConnect 掐 DNS):ECAgent 后台跑着,封锁 53 端口 UDP/TCP。症状是连
nslookup baidu.com 223.5.5.5都超时(直连公共 DNS 死)——这是本地软件干扰。 - 第二段(机场掐连接):修好 DNS 后,经代理仍 502。净化内核复现出
forcibly closed by remote host——这是远端/中间设备主动重置。
两段各自独立。关键:第二段不是第一段引起的,即使 EasyConnect 不掐 DNS,机场入口(SNI 伪装 osxapps.itunes.apple.com)被识别/干扰这个事实仍然存在。
核心方法:净化内核最小配置隔离法
这是本次研究最可复用的产出。当 mihomo 全节点失败、想把"本机/配置"从"远端/机场"里抖出来时:
# 1. 从真实配置里 dump 出单节点(注意隐藏 password),写成最小 YAML
cat > /tmp/mini.yaml << 'EOF'
mixed-port: 17890
log-level: debug
external-controller: 127.0.0.1:19097
dns:
enable: true
listen: 127.0.0.1:1053
enhanced-mode: fake-ip
default-nameserver: [223.5.5.5]
nameserver: [https://223.5.5.5/dns-query] # 用国内 DoH,避免境外 DNS 干扰
proxies:
- name: sg3
type: anytls
server: h1.moeshark.app
port: 5033
password: <密码>
client-fingerprint: chrome
udp: true
alpn: [h2, http/1.1]
sni: osxapps.itunes.apple.com
skip-cert-verify: true
rules:
- MATCH,sg3
EOF
# 2. 用独立端口的纯净内核跑,日志直接给真错误
"C:\Program Files\Clash Verge\verge-mihomo.exe" -d /tmp -f /tmp/mini.yaml > mini.log 2>&1 &
curl -x http://127.0.0.1:17890 https://www.google.com/generate_204
grep -iE "error|forcibly|reset" mini.log报错原文(本案例):
[tcp] dial sg3 ... error: failed to create session: read tcp <本机ip>:<port>->18.142.186.145:5033: wsarecv: An existing connection was forcibly closed by the remote host.- 换成日本节点(:5013)同样报错 → 不是单节点,是这一批入口/协议的问题。
forcibly closed by remote host= 我的连接被对面掐了,TCP 通但 TLS 层死。
为什么这个判断有效:它绕开了 Verge 的一切——自定义分组、DNS 覆写、内核版本选择、订阅脚本。用同样的二进制、同样单节点、最简单配置还失败,就只剩"远端",与任何本地配置无关。
关键判别表(本次实战验证)
| 验证项 | 通过/失败 | 说明 |
|---|---|---|
ping 223.5.5.5 / curl http://<ip> | 通 | 网络链路本质正常 |
nslookup <域名> 223.5.5.5 | 通 | 节点域名解析本身 OK |
节点 TCP 端口 echo > /dev/tcp/h1/5033 | 通 | 端口未关闭 |
订阅 URL curl 直连 | 200 | 订阅源活着,流量 67GB,未过期 |
curl -x 127.0.0.1:7890 https://... | 000→TLS 失败;HTTP 502 | 代理层挂 |
| 净化内核单节点实测 | forcibly closed | 机场远端掐,结案 |
附:本次顺手确认的 Other Facts
- 订阅 URL 加
&nodeua=-win能拉到app anytls额外节点(笔记有记载)实测成立:返回 base64 分享链接,含 20 个普通anytls+ 20 个app anytls(新加坡/日本/台湾/美国/香港),服务器是h2.moeshark.app:40001这批新端口。但这批 app 节点走同一入口,一样被掐。 nodeua=-win返回的是 base64 分享格式不是 Clash YAML——要交给 Verge 的订阅系统解析成 YAML,别直接当配置用。- mihomo 通过命名管道
\\.\pipe\verge-mihomo暴露 API,不必走external-controller的 TCP 端口。脚本:用NamedPipeClientStream发原始 HTTP 请求到/proxies/<组>。
用户侧结论与后续建议
- 不能修:机场入口被干扰/服务商故障,只能等或换订阅。
- 本机顺带已将 EasyConnect 全家桶清除(见
[EasyConnect 掐死 53 端口 DNS 导致 Clash 节点全挂 (EasyConnect Port 53 Hijack Kills DNS and Clash Nodes)](/index.php/archives/869/)),以后不会再压这场雪上加霜。 - 若急用可切其他两个订阅(
sy1xz6688.de5.net6元 /103.200.216.101)。
相关笔记
- mihomo 节点拨不通排查 (Mihomo Node Connection Failure Diagnosis) —— 通用方法论,本次已把"nameserver 用国外 DoH 被封"实例补进
- EasyConnect 掐死 53 端口 DNS 导致 Clash 节点全挂 (EasyConnect Port 53 Hijack Kills DNS and Clash Nodes) —— 事件第一段
- 双 mihomo 内核切节点不生效 (Dual Mihomo Cores Silent No-Op) —— 港口冲突/双内核另一形态
- Clash 380GB 日志文件问题 (Clash 380GB Log File Issue)
本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/Network