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

启动报错 bind: address already in use 的完整处理流程:用 netstat 与 lsof 找出占用 7890 端口的进程,判断该结束进程还是改端口,并给出改端口后同步系统代理设置的步骤。

U1

报错信息在说什么:bind: address already in use

端口 · 混合端口 · 监听失败

Clash 客户端(以及基于 Clash Meta / mihomo 内核的各类衍生客户端)启动时会在本机监听一个或多个端口,用来接收系统或浏览器转发过来的代理流量。最常见的是mixed-port(混合端口),默认值通常是7890,它同时接受 HTTP 与 SOCKS5 协议的连接,取代了早期需要分别配置port(HTTP)和socks-port(SOCKS5)两个端口的写法。除此之外,还有用于管理面板通信的external-controller端口,常见值是9090

当客户端在启动阶段尝试绑定这些端口时,如果操作系统告知该端口已经被另一个进程占用,就会抛出bind: address already in use这一类报错,程序随即中止启动或界面提示连接失败。这是操作系统层面的资源互斥机制:同一个 TCP 端口在同一时刻只能被一个进程独占监听,谁先抢到,后来者就会被拒绝。

提示

端口冲突和订阅失效、节点不可用是两类完全不同的问题。前者是客户端本身无法完成初始化,后者是客户端已经正常运行但代理节点连不通。看到bind相关的报错文字,基本可以确定是端口层面的问题,不必先去排查订阅或节点。

U2

三步定位占用端口的进程

WINDOWS / MACOS / LINUX

不同操作系统查询端口占用的命令不同,但思路一致:先按端口号找到对应的进程 ID(PID),再按 PID 反查进程名称,确认它到底是谁。

Windows

打开命令提示符或 PowerShell,执行:

netstat -ano | findstr :7890

输出中最后一列数字就是 PID,例如看到12480,再执行:

tasklist /FI "PID eq 12480"

即可看到占用端口的进程名称,常见的是残留的clash.execlash-verge.exe、其他代理软件的可执行文件,或者是某些安全软件的转发组件。

macOS / Linux

macOS 与大多数 Linux 发行版都自带lsof,执行:

lsof -i :7890

输出的COMMAND列即为进程名,PID列为进程编号。如果系统没有lsof,Linux 下也可以用:

netstat -anp | grep 7890
# 或使用较新的 ss 命令
ss -ltnp | grep 7890

需要注意的是netstat -anp在部分发行版上需要sudo权限才能看到进程名,否则 PID 列会显示为空。

命令系统关键输出列
netstat -anoWindows本地地址、PID
tasklist /FIWindows进程名、PID
lsof -i :端口macOS / LinuxCOMMAND、PID
ss -ltnpLinux本地地址、进程信息
U3

该结束进程还是改端口:三种典型场景

判断依据

查到占用端口的进程之后,不要急着一律强制结束。先判断它是谁、为什么在跑,再决定处理方式。

  1. 是 Clash 自身的残留进程。常见于上次退出客户端时窗口关闭了但后台进程没有完全退出,或者系统崩溃后遗留了僵尸进程。这种情况直接结束该进程,再重新启动客户端即可,不需要改动任何配置。
  2. 是另一套常驻运行的代理或 VPN 工具。比如同时装了两款代理客户端,或者公司强制安装的 VPN 组件长期占着相同端口。这类进程通常是有意保留的,强行结束可能影响其他功能,更稳妥的做法是修改 Clash 这一侧的端口,避免以后每次开机都要手动处理冲突。
  3. 是系统级服务或容器映射端口。某些路由软件、Docker 容器或本机开发服务恰好用到了同一端口段。这种端口通常不方便随意结束,同样建议修改 Clash 的端口来让路。
注意

如果多次重启电脑后端口冲突依然反复出现,基本可以排除“临时残留进程”的可能,说明有另一个程序把该端口设成了固定监听,应该优先考虑改端口而不是每次都去结束进程。

U4

修改 Clash 混合端口的操作步骤

YAML 配置 / 客户端界面

大多数图形化客户端都提供了端口设置入口,通常在“设置”或“基础”页面里能直接修改混合端口数值,保存后客户端会自动重启监听。如果客户端没有对应入口,或者你在直接编辑配置文件,可以在 YAML 中找到并修改这一行:

mixed-port: 7891
external-controller: 127.0.0.1:9091

把默认的7890改为一个当前未被占用的端口号即可,常见的替代选择是789117890等不容易与其他常见软件冲突的数字。如果配置文件里用的是旧式写法,分别声明了port(HTTP)与socks-port(SOCKS5)而不是mixed-port,记得两个端口都要一起改,并确认二者不相同,否则同样会绑定失败。

修改完成后必须完全重启客户端(不是仅仅重新加载配置),因为端口监听是在进程启动阶段完成的,热重载配置往往不会重新绑定端口。

U5

改端口后同步系统代理设置

系统代理 / PAC / 环境变量

把 Clash 的端口改掉之后,如果之前是通过“系统代理”模式接入(而不是 TUN 模式接管全局流量),系统里记录的代理端口也必须同步修改,否则浏览器和其他应用依然会往旧端口发请求,连接会直接被拒绝。

export all_proxy=http://127.0.0.1:7891
export http_proxy=$all_proxy
export https_proxy=$all_proxy

如果使用的是 PAC 自动配置脚本或系统级“自动检测设置”,通常无需手动改端口,但仍建议在改完后打开浏览器访问一个网站验证代理确实生效,避免端口改动后代理悄悄失效却没有察觉。

U6

两个容易被忽略的细节

常见误区

第一,只改了mixed-port却没有同步external-controller的端口时,如果 9090/9091 也恰好被占用,客户端的管理面板(Dashboard)会打不开,但代理转发功能其实是正常的,不要把这个现象误判为“配置又坏了”。第二,部分客户端会把端口号写入本地缓存或历史配置快照,直接改 YAML 文件后如果客户端仍从缓存读取旧值,建议先在客户端里手动清除或重新导入一次配置,确保新端口真正生效。

危险

结束进程前务必确认进程名称,不要按 PID 盲目taskkillkill -9系统关键进程。如果不确定某个陌生进程是否安全,先搜索其可执行文件名称,再决定是否终止。

下载 Clash 客户端

端口冲突处理完成后,建议直接使用官方渠道的最新客户端版本,减少因老版本已知问题带来的重复排查。

下载客户端