Clash 端口被占用报错怎么办:定位冲突进程与修改混合端口

启动提示 bind 失败多半是 7890 等端口被其他程序占着。本文给出 Windows、macOS、Linux 三平台查占用进程的命令,以及在配置文件与客户端里改端口的完整步骤。

为什么会报"端口被占用"

Clash 内核启动时需要在本机监听几个端口:混合端口(mixed-port,常见默认值 7890)同时处理 HTTP 与 SOCKS5 请求,外部控制端口(external-controller,常见 9090)供面板读取状态,部分客户端还会额外开一个仅 HTTP 的端口。这些端口一旦被系统上的其他程序占用,内核就没法完成 bind 这个系统调用,日志里通常会看到类似 address already in usebind: 拒绝访问 的字样,客户端界面则表现为核心启动失败、代理开关打不开、或者启动几秒后自动回落成"未运行"状态。

这类冲突常见的诱因有三种:一是电脑上同时装了两款代理工具(比如 Clash 和另一个 V2Ray 客户端),二是上一次 Clash 进程没有正常退出,残留的旧进程还占着端口,三是极少数系统服务或路由器软件恰好用到了相近的端口段。定位思路很直接——先确认端口到底被谁占了,再决定杀进程还是改端口。

第一步:确认冲突的具体端口

客户端日志或后台窗口一般会把出问题的端口号打印出来,常见的默认值可以先对照一遍:

用途常见默认端口说明
混合端口 mixed-port7890HTTP + SOCKS5 共用,浏览器与系统代理常指向它
外部控制 external-controller9090面板与 API 读取运行状态用
仅 SOCKS 端口 socks-port7891部分老配置单独分开写
仅 HTTP 端口 port7892部分老配置单独分开写

如果日志没有直接写出端口号,就按上表逐一排查,重点先看 7890——这是大多数客户端默认使用的混合端口,也是最容易撞车的一个。

Windows:定位占用进程并结束它

打开命令提示符或 PowerShell,用 netstat 配合端口号查监听状态:

netstat -ano | findstr "7890"

输出最后一列是 PID(进程号),再用它反查进程名:

tasklist | findstr "PID号"

确认是无关程序占用后,可以直接结束该进程:

taskkill /PID PID号 /F

如果反查出来的进程名本身就是 Clash 相关(比如 clash-verge.exe、mihomo.exe),说明是上一次没退干净的残留进程,结束掉之后重新启动客户端即可,不需要改端口。

macOS:用 lsof 一条命令锁定进程

macOS 下最常用的是 lsof,可以直接按端口过滤:

lsof -i :7890

输出里的 COMMAND 列就是占用端口的程序名,PID 列是进程号。如果确认要结束它:

kill -9 PID号

如果占用端口的是系统级服务或不方便关闭的程序(比如某些抓包工具、开发环境的本地代理),优先选择改 Clash 自己的端口,而不是去动别的软件。

Linux:ss、lsof、fuser 三选一

Linux 环境推荐用 ss(比老式 netstat 更快),命令如下:

ss -tulnp | grep 7890

没装 ss 也可以用 lsof,用法与 macOS 一致:

lsof -i :7890

或者用 fuser 直接定位并结束:

fuser -k 7890/tcp

用 systemd 常驻部署 mihomo 内核的场景下,还要留意是不是自己起了两个 mihomo 服务实例——一个开机自启,一个手动又跑了一遍,两者互相抢端口是很典型的自坑现场。

改端口方案一:直接编辑配置文件

如果不想动别的程序,更省事的做法是把 Clash 自己的端口挪开。在配置文件(通常是 config.yaml)里找到端口相关字段,改成没被占用的数值即可:

mixed-port: 7891
external-controller: 127.0.0.1:9091
allow-lan: false

数值可以选任意 1024~65535 之间、当前未被占用的端口,常见做法是在原值基础上加 1 或加 100,方便记忆。改完保存后重新加载配置或重启客户端即可生效。

改端口方案二:在客户端界面里改

主流图形客户端(Clash Verge Rev、Clash for Windows 系列衍生版本、ClashX Meta 等)都提供了端口设置界面,一般在"设置"或"常规"分区里能找到混合端口、控制端口的输入框,填入新数值并保存,客户端会自动重写底层配置并重启内核,不需要手动碰 yaml 文件。改完之后记得同步检查系统代理设置和浏览器插件里填写的端口号,三处对不上是切换后"看起来没生效"最常见的原因。

改完之后怎么验证

重新用查询命令确认新端口已经被 Clash 自己占上,而不是又撞到别的程序:

lsof -i :7891

命令返回的进程名应该是 clash 或 mihomo 相关,再打开浏览器访问几个网站测试连通性,或者用面板查看流量曲线是否正常跳动,确认代理链路是通的。如果外部控制端口也改过,记得面板地址栏里的端口号要跟着一起更新,否则面板会显示连接失败。

避免下次再撞车的两个习惯

  • 只保留一款正在使用的代理客户端在开机自启列表里,卸载或关闭闲置的旧客户端,减少后台残留进程抢端口的概率。
  • 如果长期需要同时跑两套代理工具做对比测试,提前把其中一套的端口错开固定下来,写进笔记里,不要每次靠猜。

端口冲突本质上是资源抢占问题,和配置写错、订阅失效是两类不同的故障,排查时不要混在一起想。先看日志报错字样,再查是谁占的端口,最后决定杀进程还是改端口,三步走完基本都能解决。

下载客户端 ->