记录一次以为"订阅死了"、实际是两段式故障(先 DNS 后机场)的完整排查过程,含可复用的净化内核隔离法。

一句话结论

节点端口全通、DNS 正常、订阅能拉到,但所有节点在 TLS 握手时被远端掐断(forcibly closed by remote host)——最终判定为机场入口/中间设备干扰,非本机问题,且当天先后叠加了 EasyConnect 掐 DNS 的内循环故障。

事件时间线 (2026-09-02)

时间现象判断
上午全代理失效,网页全挂先怀疑"订阅全死"
排查直连 ping/HTTP 正常,但 UDP/TCP 53 DNS 全超时,连直连公共 DNS 都不通EasyConnect 在后台掐 DNS
杀 ECAgent53 端口立即恢复确认元凶 = EasyConnect"DNS 防泄漏"
重启 Verge代理短暂恢复(204)内存在断网期启动,状态坏
用户更新订阅又 502不止 DNS,还有第二层问题
净化内核实测单节点最小配置同报 forcibly closed机场层故障独立于本机

两段式故障复盘:别把两件事混成一个

这次最易踩的坑是把"EasyConnect 掐 DNS"和"机场掐连接"当成一个故障。实际是先后叠的:

  1. 第一段(EasyConnect 掐 DNS):ECAgent 后台跑着,封锁 53 端口 UDP/TCP。症状是连 nslookup baidu.com 223.5.5.5 都超时(直连公共 DNS 死)——这是本地软件干扰。
  2. 第二段(机场掐连接):修好 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.net 6元 / 103.200.216.101)。

相关笔记


本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/Network