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 :<端口>

怎么读结果:

  1. Windows 的输出里,找状态为 LISTENING 的那一行,最后一列是进程号。findstr 可能匹配到更长的端口号,看清本地地址一列。
  2. macOS 的输出里,直接看 COMMAND 和 PID 两列。
  3. Linux 要用管理员权限,才能看到其他用户的进程名。
  4. 拿到进程号后,到任务管理器或活动监视器里确认进程是什么。
查到的占用者 说明什么 做法
另一个代理客户端或内核 两个代理程序同时运行 只保留一个,完全退出另一个
上一次遗留的代理内核 客户端关闭后,内核没有退出 确认后结束这个残留进程
与代理无关的软件 恰好用了同一个端口 改代理的端口,或改那个软件的端口
什么都查不到 端口在系统保留范围内,或命令权限不够 用管理员权限重试,查保留范围

最常见的来源:两个代理程序同时运行,或内核没退干净

这类端口占用最容易发生在切换客户端的时候。你关掉了窗口,以为已经退出,其实程序还在系统托盘或菜单栏里,端口依然被它占着。还有一种情况:客户端崩溃或被强行关闭,内核进程留在了后台。

有的客户端还有服务模式,内核由后台服务托管。这种情况下,关闭界面不等于内核退出,要用客户端自己的退出或停止服务功能,以客户端实际提供的为准。

处理的步骤:

  1. 在托盘或菜单栏里,对每个代理客户端选择退出,而不是关窗口。
  2. 在任务管理器或活动监视器里,按 mihomo、clash 等关键词搜索,确认没有残留。
  3. 确认是代理内核之后,再结束它。Windows 用 taskkill /PID <进程号> /F,macOS 和 Linux 用 kill <进程号>。不认识的进程先不要动。
  4. 重新启动要用的那一个客户端。

同一时间只运行一个代理客户端,是最省事的习惯。

其他软件与系统保留端口:端口冲突的另一些来源

排除了代理程序本身,还有两类来源。

其他软件。 本地开发服务、同步或下载工具、另一个代理工具,都可能恰好用了同一个端口。这时最简单的办法是改代理的端口,而不是去改别人的软件。

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:<新端口>

系统代理开了却没有网络:怎么核对

这是端口问题的另一半症状。常见的错位有两种:系统代理指向的端口没有任何程序在监听,网页自然打不开;或者那个端口被别的程序占着,流量被送去了错误的地方。按下面的步骤核对:

  1. 在系统网络设置里,看代理的地址和端口是多少。
  2. 用前面的命令查这个端口,监听者应该是你的代理内核。
  3. 不是的话,要么客户端没有启动成功,请看日志;要么端口被别的程序占着,请改端口,再把系统代理重新开关一次。
  4. 客户端已经退出,系统代理却仍然开着,也会导致没有网络,修复见关掉梯子后上不了网。
  5. 端口监听正常,但 TUN 模式起不来,那是另一类问题,见TUN 模式开不了怎么办。

系统代理本身的原理和设置,见系统代理。

下一步:把端口管理变成习惯

Clash 端口被占用的问题,往往和操作习惯有关,养成下面几个习惯就能少遇到:

  • 同一时间只运行一个代理客户端,切换之前先在托盘或菜单栏里完全退出。
  • 把你用的端口写在一个地方,终端、浏览器扩展、应用内代理都使用同一个数字。
  • 改端口之后,按上面的清单把每一处都核对一遍。
  • 遇到不认识的占用者,先查清它是什么,再决定改谁的端口。

如果你同时尝试多个客户端,是因为订阅格式不兼容,先弄清订阅用哪种格式,再选客户端,见Clash 机场怎么选。还没有合适的订阅时,到机场推荐里筛选;不确定自己需要什么,用选梯子向导先定下来。

底部的机场数据块只是资料整理,订阅能否兼容你的客户端要看格式;端口冲突与订阅无关,只发生在你的本机。

这篇没有覆盖的

  • 命令输出和报错措辞随系统、语言与客户端版本略有不同,文中示例只用于说明思路,端口以你的客户端显示为准。
  • 结束进程前请先确认它是什么,本文不建议强行结束你不认识的系统进程。
  • 本文只讲端口层面的冲突,TUN 模式本身启动失败的原因,请看专门的排查文章。

资料里明确写了支持 Clash 的机场

把 Clash 写进“客户端支持”的品牌目前很少。没写不等于不能用,多数机场都提供 Clash 格式订阅,只是资料里没有可核对的说明。

推荐名次机场推荐档资料里的价格线路
1无忧链接首推合¥6/月 · 40GB/月(按年付费)IPLC
7隐形人优先考虑年付¥109(约¥9.08/月) · 80GB(按年付费)纯专线

查看梯子下载与客户端对照

接着读

文中出现的术语

还没定下来买哪家?

机场推荐榜把 28 家机场的价格、流量、线路和资料来源放在了一起;想省事可以用选梯子向导按用途筛一遍,或者直接看便宜机场、性价比机场和专线机场。