Clash Verge 残留内核霸占端口致国外全断 (Stale Core Squatting the Mixed Port)
出现条件
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)结果一样,看起来像"整个机场挂了"。
排查步骤(对照组法,十分钟内出结论)
核心思路:用一个独立的新内核 + 同一个节点去对照,把"节点/账号/线路的问题"和"本地客户端状态的问题"一刀切开。
先证明线路本身没问题:直接对节点服务器做 TCP 连接测试。
python -c "import socket; s=socket.create_connection(('h2.moeshark.app',40031),timeout=6); print('通')"TCP 通 → 节点服务器和本机网络都活着。
起一个独立内核做对照(不动用户的 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,目录里自带该二进制,不需要额外安装。读结论:
- 对照内核 200 → 节点、账号、订阅、本机网络全部正常,问题只在那两个僵尸内核的进程状态。
- 对照内核也挂 → 再去查账号流量/到期、节点 IP 是否被墙、DNS 是否被掐(见 EasyConnect 掐死 53 端口 DNS 导致 Clash 节点全挂 (EasyConnect Port 53 Hijack Kills DNS and Clash Nodes))。
- 交叉验证"是不是配置写坏了":把 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 一路显示正常,却在某个时间点集体失灵。
解决步骤
- 先让界面重新拉起一个健康内核:结束
clash-verge.exe,再重新启动它。新内核起来后代理立即恢复(本机实测:curl -x http://127.0.0.1:7890 https://www.google.com从 000 变 200)。 - 根治:重启电脑。开机时
clash_verge_service(Automatic)会重新拉起一个干净的内核,孤儿进程随之消失。 - 想不重启也行:
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"),它们不是节点。
相关概念与笔记
- EasyConnect 掐死 53 端口 DNS 导致 Clash 节点全挂 (EasyConnect Port 53 Hijack Kills DNS and Clash Nodes) — 同样表现为"节点全挂",但元凶是 DNS 被掐
- Clash 380GB 日志文件问题 (Clash 380GB Log File Issue)
- Clash Verge Rev、mihomo、
SO_REUSEADDR重复绑定、孤儿进程 (orphan process)、对照组排查法
本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/Network