CClash 中文社区选择客户端 ↗
首页/博客
操作教程

启动 Clash 前怎样识别端口占用

启动 Clash 前怎样识别端口占用。了解适用条件、操作步骤与常见问题的排查方法。

编辑部 · 更新 2026-10-04

启动 Clash 前识别端口占用,应先根据全局配置列出即将绑定的地址,而不是先结束本机任意进程。适用条件是:准备启动 mihomo 内核,配置中已经出现代理端口、绑定地址或外部控制入口,需要在进程真正执行 bind 之前判断这些套接字是否空闲。

从全局配置列出监听目标

官方资料把代理端口当作其他设备访问互联网的入口。allow-lan 为 true 时,其他设备会经过这些代理端口访问;为 false 时,局域网不会使用它们,但本机仍要绑定代理端口,占用检查不能省略。bind-address 决定绑在何处:* 表示绑定所有 IP;写成具体 IPv4(资料示例为 192.168.31.31)或单个 IPv6(资料示例为 [aaaa::a8aa:ff:fe09:57d8])则只在该地址监听。识别占用时,必须把「地址 + 端口」看成一对,只看端口数字会漏掉不同网卡上的同号端口。

外部控制同样会创建监听。资料中的 API 示例如 external-controller: 127.0.0.1:9090。若启用 HTTPS API,还需 external-controller-tls(示例为 127.0.0.1:9443),并且使用 TLS 时必须同时填写 external-controller,一次启动可能占用两个控制端口。external-controller-unix 占用 Unix 套接字路径,external-controller-pipe 占用 Windows 管道名,二者都不是 TCP 端口。启动前应形成清单:配置键、地址或路径、端口或管道名。

按绑定范围判断占用是否成立

判断依据是:内核将在 bind-address 指定的地址上绑定代理端口,并在外部控制字段给出的地址或路径上建立 API。只要该元组已有其他进程处于监听状态,即可认定为会阻止本次启动的占用。allow-lan 为 true 时,还要阅读 lan-allowed-ips(默认包含 0.0.0.0/0 与 ::/0)和 lan-disallowed-ips(黑名单优先于白名单)。这两项不修改端口号,只限制谁能连上已经绑定成功的代理端口;不能把「某网段被禁止连接」理解成「该端口不会被占用」。

authentication 与 skip-auth-prefixes 只作用于 http(s) / socks / mixed 的用户验证,不改变监听端口。find-process-mode 控制是否为规则匹配进程名,路由器上推荐 off,它与端口是否空闲无关。mode、log-level、ipv6、出站接口和 GEO 相关项同样不决定 TCP 端口占用,不应列入启动前的占用清单。

启动前的核对步骤与失败时下一步

具体操作固定为三步。第一,只读配置,抄出上一节清单,并确认 bind-address 是 * 还是单一地址。第二,在操作系统中查询清单内每个地址与端口(或 Unix 路径、管道名)当前是否已有监听;此阶段只记录进程标识,不结束进程。第三,对照清单:只有将要绑定的「地址 + 端口或路径」与已有监听完全重合,才判定为启动前必须处理的占用。

若查询显示空闲仍怀疑冲突,下一步应核对是否另有实例使用了相同的 external-controller 或相同代理端口,并检查是否刚把 bind-address 从单一 IP 改成了 *——绑定范围扩大后,其他网卡上的同端口也会冲突。确认占用后,应修改配置中的监听端口或绑定地址,或在明确占用方身份后再处理该程序;不要改 mode 或日志级别来绕过占用。Unix socket 或 named pipe 冲突时,下一步是检查路径上的旧实例,而不是只扫描 TCP。需要观察绑定失败信息时,可将 log-level 设为 warning 或 error,但 silent 会不输出日志,不能替代启动前的清单核对。

资料来源:https://wiki.metacubex.one/config/general/