Clash 端口被占用怎么办?端口冲突的查找与修改
Clash 端口被占用,先从日志里的 bind 或 address already in use 字样确认,再用命令查出占用端口的进程:重复运行的客户端或残留内核就退出,其他软件占用就改端口。改完要同步系统代理和终端环境变量。
你遇到的现象
客户端启动时报端口被占用,或系统代理开了但没有网络。
Clash 端口被占用,意思是客户端想监听的那个端口,已经被另一个程序占着。常见的原因有三个:同时开了两个代理客户端、上一次的内核进程没有退干净,或者别的软件恰好用了同一个端口。判断方法是先从日志确认报错,再用系统命令查出到底是谁占着,最后改端口并同步所有指向它的设置。
先读报错:Clash 端口被占用有哪几种写法
先别急着改端口,看清报错写的是什么。措辞随系统、语言和客户端版本略有差异。
| 日志或弹窗里的字样 | 说明什么 | 下一步 |
|---|---|---|
| address already in use,或 bind 失败(Linux、macOS 常见) | 这个端口已经被另一个程序监听 | 查占用者的进程 |
| Only one usage of each socket address(Windows 常见) | 同上 | 查占用者的进程 |
| forbidden by its access permissions(Windows 常见) | 端口落在系统保留范围,或权限不足 | 查保留范围,换端口 |
| 客户端看似正常,但系统代理开了没有网络 | 系统代理指向的端口没人监听,或被别的程序占用 | 查这个端口的监听者 |
| 只在开机后,或切换客户端之后才出现 | 两个客户端同时运行,或内核残留 | 看后面的“重复运行”一节 |
要留意的是,一个代理客户端通常要同时监听好几个端口:混合端口、HTTP 端口、SOCKS 端口,还有外部控制端口。其中任何一个被占用,都会报错,它们之间也不能相同。
查出是谁占了端口:命令与步骤
先在客户端设置里记下你的混合端口,下面记作 <端口>。混合端口是同时支持 HTTP 和 SOCKS5 的那个端口,具体数字以你的客户端显示为准。
Windows 在命令提示符里执行:
netstat -ano | findstr :<端口>
tasklist /FI "PID eq <进程号>"
macOS 在终端里执行:
lsof -nP -iTCP:<端口> -sTCP:LISTEN
Linux 在终端里执行:
ss -ltnp | grep :<端口>
怎么读结果:
- Windows 的输出里,找状态为 LISTENING 的那一行,最后一列是进程号。findstr 可能匹配到更长的端口号,看清本地地址一列。
- macOS 的输出里,直接看 COMMAND 和 PID 两列。
- Linux 要用管理员权限,才能看到其他用户的进程名。
- 拿到进程号后,到任务管理器或活动监视器里确认进程是什么。
| 查到的占用者 | 说明什么 | 做法 |
|---|---|---|
| 另一个代理客户端或内核 | 两个代理程序同时运行 | 只保留一个,完全退出另一个 |
| 上一次遗留的代理内核 | 客户端关闭后,内核没有退出 | 确认后结束这个残留进程 |
| 与代理无关的软件 | 恰好用了同一个端口 | 改代理的端口,或改那个软件的端口 |
| 什么都查不到 | 端口在系统保留范围内,或命令权限不够 | 用管理员权限重试,查保留范围 |
最常见的来源:两个代理程序同时运行,或内核没退干净
这类端口占用最容易发生在切换客户端的时候。你关掉了窗口,以为已经退出,其实程序还在系统托盘或菜单栏里,端口依然被它占着。还有一种情况:客户端崩溃或被强行关闭,内核进程留在了后台。
有的客户端还有服务模式,内核由后台服务托管。这种情况下,关闭界面不等于内核退出,要用客户端自己的退出或停止服务功能,以客户端实际提供的为准。
处理的步骤:
- 在托盘或菜单栏里,对每个代理客户端选择退出,而不是关窗口。
- 在任务管理器或活动监视器里,按 mihomo、clash 等关键词搜索,确认没有残留。
- 确认是代理内核之后,再结束它。Windows 用
taskkill /PID <进程号> /F,macOS 和 Linux 用kill <进程号>。不认识的进程先不要动。 - 重新启动要用的那一个客户端。
同一时间只运行一个代理客户端,是最省事的习惯。
其他软件与系统保留端口:端口冲突的另一些来源
排除了代理程序本身,还有两类来源。
其他软件。 本地开发服务、同步或下载工具、另一个代理工具,都可能恰好用了同一个端口。这时最简单的办法是改代理的端口,而不是去改别人的软件。
Windows 的系统保留端口。 启用了虚拟化相关功能后,系统可能保留一段端口范围,不允许普通程序监听。你的端口一旦落在其中,就会报权限类错误。查看当前保留范围:
netsh interface ipv4 show excludedportrange protocol=tcp
输出是若干个起止端口区间。你的端口落在任意一个区间里,就换到区间之外。这些区间在重启之后可能变化,所以与其反复尝试,不如挑一个离这些区间远一点的端口。
选新端口的原则:避开常用端口和系统保留区间,选一个当前没有被占用的;混合端口、HTTP 端口、SOCKS 端口和外部控制端口互不相同。
改端口:改完后哪些地方要同步
在客户端设置里修改混合端口,保存后让内核重启生效。要留意,客户端界面里的设置有时会覆盖订阅配置里的端口,两者不一致时,以客户端实际监听的为准。
改完之后,凡是引用旧端口的地方都要同步,漏一处就会出现“有网但某个程序没有网”。
| 位置 | 要改什么 | 怎么确认 |
|---|---|---|
| 系统代理 | 关闭再重新开启,让它写入新端口 | 在系统网络设置里看代理端口是否已更新 |
| 终端环境变量 | 把 http_proxy、https_proxy 里的端口改成新端口 | 用命令打印出来核对,见终端代理 |
| 浏览器的代理扩展 | 扩展里手填的端口 | 打开一个网页测试 |
| 应用内的代理设置 | 比如 Telegram 里填的本地代理 | 见Telegram 一直连接中 |
| 局域网里的其他设备 | 它们指向你电脑地址和端口,也要改 | 见局域网共享代理 |
| git 等工具的代理配置 | 配置里写死的端口 | 逐个检查配置文件 |
终端里的写法示例:
export https_proxy=http://127.0.0.1:<新端口>
export http_proxy=http://127.0.0.1:<新端口>
系统代理开了却没有网络:怎么核对
这是端口问题的另一半症状。常见的错位有两种:系统代理指向的端口没有任何程序在监听,网页自然打不开;或者那个端口被别的程序占着,流量被送去了错误的地方。按下面的步骤核对:
- 在系统网络设置里,看代理的地址和端口是多少。
- 用前面的命令查这个端口,监听者应该是你的代理内核。
- 不是的话,要么客户端没有启动成功,请看日志;要么端口被别的程序占着,请改端口,再把系统代理重新开关一次。
- 客户端已经退出,系统代理却仍然开着,也会导致没有网络,修复见关掉梯子后上不了网。
- 端口监听正常,但 TUN 模式起不来,那是另一类问题,见TUN 模式开不了怎么办。
系统代理本身的原理和设置,见系统代理。
下一步:把端口管理变成习惯
Clash 端口被占用的问题,往往和操作习惯有关,养成下面几个习惯就能少遇到:
- 同一时间只运行一个代理客户端,切换之前先在托盘或菜单栏里完全退出。
- 把你用的端口写在一个地方,终端、浏览器扩展、应用内代理都使用同一个数字。
- 改端口之后,按上面的清单把每一处都核对一遍。
- 遇到不认识的占用者,先查清它是什么,再决定改谁的端口。
如果你同时尝试多个客户端,是因为订阅格式不兼容,先弄清订阅用哪种格式,再选客户端,见Clash 机场怎么选。还没有合适的订阅时,到机场推荐里筛选;不确定自己需要什么,用选梯子向导先定下来。
底部的机场数据块只是资料整理,订阅能否兼容你的客户端要看格式;端口冲突与订阅无关,只发生在你的本机。
这篇没有覆盖的
- 命令输出和报错措辞随系统、语言与客户端版本略有不同,文中示例只用于说明思路,端口以你的客户端显示为准。
- 结束进程前请先确认它是什么,本文不建议强行结束你不认识的系统进程。
- 本文只讲端口层面的冲突,TUN 模式本身启动失败的原因,请看专门的排查文章。
资料里明确写了支持 Clash 的机场
把 Clash 写进“客户端支持”的品牌目前很少。没写不等于不能用,多数机场都提供 Clash 格式订阅,只是资料里没有可核对的说明。
接着读
- 使用教程 · 系统代理怎么设置?和 TUN 模式的区别与适用场景
- 故障排查 · 关掉梯子后上不了网?系统代理残留的修复方法
- 使用教程 · 局域网共享代理:让电视、游戏机用上电脑的梯子
- 故障排查 · TUN 模式开不了怎么办?权限、驱动与冲突排查
- 故障排查 · Telegram 一直连接中怎么办?代理设置逐项排查
- 故障排查 · 某个 App 不走代理怎么办?系统代理管不到的流量