出现条件

Windows 机器上 Clash Verge 处于"双内核"状态:

  • Windows 服务 clash_verge_service 处于 Stopped,但它先前拉起的内核进程没退出,以 SYSTEM 身份继续活着(clash-verge.service 的遗留物)。
  • 界面 clash-verge.exe 又自己拉了一个内核(sidecar 模式)。

两个 verge-mihomo.exe 同时存在,其中 SYSTEM 那个持有的是一份已经坏掉/过时的运行状态。

症状

  • Clash Verge 界面一切正常,显示"运行中",节点列表可点。
  • netstat 看 7890 端口有人在监听(PID 指向 SYSTEM 的那个内核)。
  • 国内直连正常(curl https://www.baidu.com 返回 200)。
  • 国外全断:本地代理接受 CONNECT(返回 HTTP/1.1 200 Connection established),但之后 TLS 握手收不到任何回应 —— curl 报 schannel: failed to receive handshake / 退出码 35 / %{http_code} 为 000。
  • 换任意国外目标(google / cloudflare / gstatic)结果一样,看起来像"整个机场挂了"。

排查步骤(对照组法,十分钟内出结论)

核心思路:用一个独立的新内核 + 同一个节点去对照,把"节点/账号/线路的问题"和"本地客户端状态的问题"一刀切开。

  1. 先证明线路本身没问题:直接对节点服务器做 TCP 连接测试。

    python -c "import socket; s=socket.create_connection(('h2.moeshark.app',40031),timeout=6); print('通')"

    TCP 通 → 节点服务器和本机网络都活着。

  2. 起一个独立内核做对照(不动用户的 Clash Verge):

    mkdir -p /c/Users/18086/AppData/Local/Temp/mihtest
    cp "<Clash Verge 配置目录>/geoip.dat" "<...>/geosite.dat" "<...>/Country.mmdb" /c/Users/18086/AppData/Local/Temp/mihtest/
    # 写一份最小配置:独立目录、换端口(7899)、dns.enable: false、只有 proxies + MATCH 规则
    powershell -NoProfile -Command "Start-Process -FilePath 'C:\Program Files\Clash Verge\verge-mihomo.exe' -ArgumentList '-d','C:/Users/18086/AppData/Local/Temp/mihtest','-f','C:/Users/18086/AppData/Local/Temp/mihtest/config.yaml' -WindowStyle Hidden"
    curl -s -m 15 -x http://127.0.0.1:7899 -o /dev/null -w "%{http_code}\n" https://www.google.com

    参考:内核路径 C:\Program Files\Clash Verge\verge-mihomo.exe,目录里自带该二进制,不需要额外安装。

  3. 读结论:

  4. 交叉验证"是不是配置写坏了":把 Clash Verge 生成的那份完整配置 clash-verge.yaml 复制一份,只改 mixed-port、把 tun 和 dns 换成 enable: false,用同一个二进制在别的端口跑。能通 → 配置没问题(注意:改这份 YAML 千万别用带 DOTALL 的正则整段替换,.* 会跨行把后面几千行一起吃掉,本机就踩过一次)。

根因

clash_verge_service 被停掉后,它拉起的 SYSTEM 权限内核没有被回收,变成孤儿进程继续霸占 7890/53。

Windows 允许 SO_REUSEADDR 的重复绑定,netstat 只会列出其中一个 PID。观察到的现象(推断,非实锤):端口归属显示的是那个 SYSTEM 孤儿,但实际承接流量的是界面后来拉起的那个新内核;把新内核杀掉,流量就落到坏掉的老内核上,于是"突然全网断"。这解释了为什么 Clash Verge 一路显示正常,却在某个时间点集体失灵。

解决步骤

  1. 先让界面重新拉起一个健康内核:结束 clash-verge.exe,再重新启动它。新内核起来后代理立即恢复(本机实测:curl -x http://127.0.0.1:7890 https://www.google.com 从 000 变 200)。
  2. 根治:重启电脑。开机时 clash_verge_service(Automatic)会重新拉起一个干净的内核,孤儿进程随之消失。
  3. 想不重启也行:clash_verge_service 拉起的进程是 SYSTEM 权限,普通权限 taskkill 返回 拒绝访问。必须以管理员身份开终端执行 taskkill /F /PID <那个 SYSTEM 内核的 PID>,再重开 Clash Verge。判断哪个是孤儿:Get-CimInstance Win32_Process -Filter "Name='verge-mihomo.exe'",SessionId 为 0 的那个就是。

下次如何识别

  • 关键词:界面正常 + 国内通 + CONNECT 能建立但 TLS 无响应 + 订阅未过期。
  • 第一步就数内核个数:Get-CimInstance Win32_Process -Filter "Name='verge-mihomo.exe'" | Select ProcessId,SessionId。多于一个、且有 SessionId=0 的,先怀疑孤儿内核。
  • 别被流量统计误导:"剩余流量只剩 12 GB"不等于账号挂了;判断订阅死活要看拉取返回,返回 404 或空正文才是真死。
  • 机场会往订阅里塞伪节点条目当公告用(名字形如"剩余流量:12.02 GB""距离下次重置剩余:7 天""套餐到期:2026-12-01"),它们不是节点。

相关概念与笔记


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