Clash 启动提示端口被占用?Windows 下用 netstat 查进程并改 mixed-port

先确认:这是「本机端口冲突」,不是「节点连不上」

很多用户在Clash 端口被占用时,的第一反应是怀疑订阅或规则坏了。实际上,这类报错出现在核心进程还没能成功监听本机入站口时:与境外节点、DNS 污染或 TUN 权限都无关。典型表现是:刚安装/覆盖升级某个基于 Mihomo 内核的客户端后,一点「系统代理」或「启动」就失败,日志里出现 bind: address already in uselisten tcp 127.0.0.1:7890 一类信息,或图形界面用中文提示某端口(常见如 789078919090)无法打开。

你的目标可以概括成两条:第一,在 Windows 上找出谁占用了与 Clash 配置一致的 TCP 端口,并记下进程 PID;第二,在「结束对方」与「让 Clash 改听别的口」之间做二选一,并保证系统代理、浏览器、其他依赖 127.0.0.1:端口的应用与新的 mixed-port 一致。下面按可复现顺序写,不展开防火墙策略作主线。若你尚未完成订阅与基础启停,可先对照 Clash 全平台订阅导入教程Clash Verge Rev 使用教程,再回来处理端口问题。

第一步:搞清你的配置要占用哪些口(mixed-port 不只是一行 YAML)

Clash 系配置里,与「本机代理入口」最相关的一般是 mixed-port:许多图形客户端在界面上会把它标成「混合端口」或「HTTP 与 SOCKS5 共用的端口」。若你单独配置了 port(HTTP)与 socks-port,它们会再各占一个 TCP 口;一些发行版还会为外部控制external-controller,常见 9090)、Redir/透明代理、或DNS 监听再申请端口。报错里提到哪一个数字,就以哪一个为准去查 netstat

在动手改数之前,建议先在客户端的「配置」或「关于」里确认:当前正在使用的是订阅合并后的哪一份 YAML。如果你刚切换过端口却在界面里点「重载」而不是「应用」或「以管理员重启服务」,可能仍在读旧口——这会让你误以为改 mixed-port 无效。确认无误后,把报错里的端口号(例如 7890)记下,供下一节在命令行里检索。

第二步:在 CMD 用 netstat 把「端口」映射到「进程 PID」

在 Windows 上,netstat资源监视器都能看端口,但最便于写入文档、也最容易截图求助的是命令行。以管理员或普通用户打开「命令提示符」均可(通常不必管理员就能查看监听)。想查 7890 端口的 TCP 占用,可执行:

netstat -ano | findstr :7890

输出里会列出协议、本机与外部地址、状态(LISTEN 表示在监听、ESTABLISHED 表示已建连),以及最右侧的进程 PID。若一行里本地地址写成 0.0.0.0:7890127.0.0.1:7890 且状态为 LISTENING,即说明该 PID 正占用你关心的口。对 IPv6 场景有时会出现 [::]:7890,含义类似,仍看同一列 PID 即可。

如果 findstr 没有结果,而 Clash 仍报该端口被占用,可能是你搜错了数字(被占用的是 7891/9090 而日志只写了一部分),或存在短暂 TIME_WAIT——此时可稍等数秒再试,或把日志里列出的所有端口都查一遍。反之,若 netstat 显示 LISTEN 的正是你本机已知的另一个 Clash 可执行文件,则说明已经有一个实例在跑,见下文「多开与残留」一节。

第三步:用 PowerShell 的 Get-NetTCPConnection(可选,输出更「干净」)

Windows PowerShell 或「终端」里,也可以用语义更直观的方式查监听在某端口上的进程。例如将 7890 换成你实际的端口:

Get-NetTCPConnection -LocalPort 7890 -ErrorAction SilentlyContinue |
  Select-Object LocalAddress,LocalPort,State,OwningProcess

其中 OwningProcess 与 netstat 最后一列的 PID 含义相同。若你安装了较新的系统,且希望直接看到映像名,可再结合 Get-Process -Id <PID> 查询进程路径与名称。这样在向他人描述问题时,可以一次说清「端口号、PID、可执行文件」三要素,避免来回调日志。

第四步:从 PID 反查具体程序,并决定是结束还是保留

得到 进程 PID 后,打开「任务管理器」→「详细信息」列,在「PID」上排序,找到对应行。若显示的是你期望保留的另一个代理客户端、企业安全软件、或你手动启动的旁路工具,那么不要粗暴结束,而应转向「改 Clash 的 mixed-port / 分端口」路线,并协调哪一款软件使用哪一个端口。若显示的是已退出但未释放的旧 Clash/内核子进程、或你确认不再需要的同类型软件,可右键「结束任务」,再重新启动 Clash。

在自动化脚本中,以管理员或匹配权限使用 taskkill /PID <nnnn> /F 可以强制结束,但务必先确认 PID 不是系统关键服务。对不确定的项,先在网上核对映像名,比盲目杀进程更安全。

第五步:改 mixed-port 与「对外暴露」的其他端口(YAML 与界面一致)

若你决定让 Clash 改听新口,在配置中修改 mixed-port(或分别修改 port / socks-port,取决于你的拆分方式)后,必须同步这三处,否则会「核心起来了,但浏览器仍去旧口」:① 若客户端有「重载配置」与「重设系统代理」两个按钮,在改端口后通常需要重新应用系统代理;② 已手动在「设置 → 网络和 Internet → 代理」里写死 127.0.0.1:旧端口 的,要改成新数字;③ 使用环境变量 HTTP_PROXY 的终端会话要重新开或更新变量。若你同时开启了 Allow LAN 或把绑定地址设成 0.0.0.0 以便手机连电脑代理,改端口后,手机或脚本里的「代理主机:端口」也要一起改——细节可参考 Clash Allow LAN 与手机代理 一篇,本篇只强调端口数字链条一致。

把修改保存后,可再次用上一节的 netstat 观察:应看到新端口处于 LISTEN、而旧口不再被 Clash 占用。若 TUN/虚拟网卡类功能仍提示冲突,多属于网卡名或堆栈已被别的 VPN 占据,不完全是 TCP 口问题,那类场景更适合对照 Clash TUN 模式指南 分步排查,此处不重复展开。

和 WSL2、Docker 放一起时容易误会的点

在装有 WSL2 或 Docker Desktop 的机器上,你有时会看到「WSL 里能 curl 通、Windows 上 Clash 报端口问题」的错觉。要分清:端口占用查的是 Windows 主机的套接字表;WSL2 有独立的网络命名空间。若你只是在 Windows 侧启动 Clash 就报 7890 被占用,仍按本文 netstat宿主 CMD 里查即可。若你关心的是 WSL 里访问「宿主 Clash 代理」连不通,那属于路由与 localhost 互通问题,可另读 Windows 11 上 Clash 与 WSL2 路由与 MTU 排障。不要把「WSL2 全挂」与「本机 7890 被占用」混成一种修法。

常见根因速查:多开、残留、与其他代理抢同一口

很多「Clash 无法启动」其实是第二个实例在运行:可能托盘里还有一个旧图标,或「服务模式」与「用户模式」各起了一份。也有一部分是卸载旧版后驱动或 helper 没卸干净导致的二次监听,这类情况除了杀 PID,还应在「应用和功能」里核对是否只保留了一个发行版。另有公司统一安装的 HTTP 代理、抓包软件、Fiddler 系工具,默认也偏爱 8xxx 口,容易与混合端口撞车——要么协调端口分配,要么在不需要时彻底退出那款软件。把这些场景扫一遍,比反复重装 Clash 更省时间。

可打印的自检顺序(从快到慢)

  1. 从报错或配置中抄下精确端口号(可能不止一个)。
  2. 在 CMD 执行 netstat -ano | findstr :端口,记录 LISTEN 行的 进程 PID
  3. 在任务管理器「详细信息」中核对映像名是否可结束或需保留。
  4. 若需改 mixed-port,保存配置后重设系统代理并核对浏览器/环境变量中的端口。
  5. 再启动 Clash,确认新口 LISTEN、旧口不再被错误占用,日志无 bind 类错误。

安全与合规提示:请只在你有权限的电脑上操作;结束不认识的进程、或把代理端口长期暴露在不可信网络,都可能带来安全与政策风险。本文仅作技术排障说明,不鼓励违反本地法律与公司 IT 政策的使用方式。

小结

Windows 上遇到 Clash 端口被占用,本质是同一条本机入站口被别的进程先占用。用 netstat进程 PID 把「数字 → 具体程序」对齐后,你才能在「关程序」和「改 mixed-port 并重链系统代理」之间做出不绕弯子的选择。相比凭感觉重装,这套步骤更容易一次定位问题,也便于你在论坛或工单里用三句话描述清楚。若你打算换一款图形客户端、但仍沿用 Mihomo 系内核,可以优先从本站 下载页面 获取与当前系统匹配的版本,再按上表自测端口。相比来回折腾环境变量,把端口链条一次性对齐,日常上网的稳定性会好得多。→ 立即免费下载 Clash,开启流畅上网新体验