故障排查 预计阅读 9 分钟

7897 混合端口被占用:查找占用进程并修改监听端口

介绍在 Windows、macOS、Linux 上用命令查出占用端口的进程,并在客户端设置里修改混合端口、同步系统代理。

先确认 7897 是监听失败,还是连接失败

Clash Verge Rev 的混合端口对应 mihomo 配置中的 mixed-port,同一个监听入口可接受 HTTP 代理和 SOCKS5 代理连接。本文以 7897 为待排查端口,以 7898 为改端口示例。实际值以客户端设置和内核日志为准,不要把示例端口当作所有安装环境的固定值。

端口冲突发生在本机监听阶段。常见表现是客户端界面可以打开,但内核日志出现 bind、address already in use 或 Windows 的“通常每个套接字地址只允许使用一次”。此时订阅更新成功、节点延迟正常,都不能证明本地代理入口已经可用。

listen tcp 127.0.0.1:7897: bind: address already in use

上面是一种典型报错形式,具体前缀可能不同。先在「日志」页查找 7897 和 bind,再按下表区分问题,避免把所有网络错误都当作端口占用。

日志或现象优先检查
address already in use同地址、同端口的监听进程,以及通配地址监听
connection refused应用所连的地址和端口是否确有服务监听
access permissions / permission denied系统保留端口、权限限制或安全软件策略
连接已建立,随后 timeout节点、规则、DNS 与目标站点,不仅是本地端口

Windows:用 PowerShell 找到监听进程

第一步:只查本地监听端口

打开 PowerShell,执行下面的命令。若普通终端无法读取完整信息,可用管理员身份重新打开。这里筛选的是本地端口和 Listen 状态,不会把远端端口恰好为 7897 的连接误判为占用。

Get-NetTCPConnection -LocalPort 7897 -State Listen -ErrorAction SilentlyContinue |
  Select-Object LocalAddress, LocalPort, State, OwningProcess

OwningProcess 列是进程标识 PID。记录实际输出中的数字,再查询进程名称与路径。下面会直接收集监听者 PID;变量使用 $ownerPid,不要给 PowerShell 的内置变量 $PID 赋值。

$owners = Get-NetTCPConnection -LocalPort 7897 -State Listen -ErrorAction SilentlyContinue |
  Select-Object -ExpandProperty OwningProcess -Unique

foreach ($ownerPid in $owners) {
  Get-Process -Id $ownerPid |
    Select-Object Id, ProcessName, Path
}

第二步:判断是否属于另一个客户端实例

如果查到 mihomo 或另一个代理客户端,先检查任务栏托盘和任务管理器。关闭窗口不一定代表退出程序,客户端可能仍在后台运行;服务模式下,内核也可能由系统服务管理。应优先通过对应客户端的“退出”或服务管理入口停止它,而不是看到进程名就强行结束。

若进程退出后立即以新 PID 出现,通常有后台服务或启动器在重新拉起。反复结束进程不能消除冲突,需要停止对应服务,或者让两个程序使用不同端口。不要批量结束名称中含有 proxy、clash 或 mihomo 的所有进程。

没有监听结果,却仍然无法绑定

先确认报错中的地址与协议。IPv4 的 0.0.0.0:7897 表示监听所有 IPv4 接口,不只是局域网地址,也可能与回环地址的监听冲突。若日志明确提示访问权限错误,可继续查看 Windows 的 TCP 排除端口范围:

netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv6 show excludedportrange protocol=tcp

如果 7897 落在排除范围内,优先换用范围外且没有监听者的端口。不要为解决一个代理端口问题直接删除系统排除项。虚拟化、容器及网络组件可能依赖这些设置。

macOS 与 Linux:按 PID 核对程序来源

macOS:使用 lsof 查看 TCP 监听

打开「终端」,执行下面的命令。-nP 保留数字地址和端口,-sTCP:LISTEN 只列出监听套接字。使用 sudo 可以减少因权限不足而漏掉其他用户进程的情况。

sudo lsof -nP -iTCP:7897 -sTCP:LISTEN

输出里的 COMMAND 是程序名,PID 是进程标识,NAME 是监听地址。需要查看完整启动命令时,先输入查到的 PID,再执行查询:

read -r owner_pid
ps -p "$owner_pid" -o pid=,user=,command=

确认属于旧客户端后,从菜单栏退出对应程序。若它由后台服务启动,应先确认服务归属再停用。系统进程或来源不明的程序不宜直接终止,可以先给 Clash Verge Rev 换一个空闲端口。

Linux:使用 ss 查看监听与进程

在终端运行下列命令。-l 查监听,-t 查 TCP,-n 使用数字形式,-p 显示关联进程。进程详情通常需要管理员权限。

sudo ss -ltnp 'sport = :7897'

如果结果指向由 systemd 管理的代理服务,应通过该服务自身的停止方式处理。只杀掉内核进程可能触发自动重启。若日志明确指出 UDP 绑定冲突,再单独检查 UDP,不要把不同协议的同号端口一概视为同一种冲突:

sudo ss -lunp 'sport = :7897'
  • 没有输出:表示当前查询未发现相应监听,不代表端口永远可用;重新启动时仍可能被其他程序抢先绑定。
  • 监听为 127.0.0.1:通常只供本机使用,不需要为了处理冲突改成对外监听。
  • 监听为 0.0.0.0 或 [::]:涉及通配地址;IPv6 双栈行为受系统和套接字选项影响,应结合实际日志判断。

修改混合端口:从 7897 调整到 7898

处理方式有两种:停止不再使用的占用程序,继续使用 7897;或者保留现有程序,将 Clash Verge Rev 改到其他空闲端口。若两个客户端确实需要同时运行,第二种方式更直接,但还要避免它们同时反复改写系统代理。

  1. 先用前面的系统命令查询 7898,确认没有相应监听者;Windows 还应检查它是否落在排除端口范围。
  2. 打开 Clash Verge Rev,进入「设置」,找到「Clash 设置」中的「混合端口」字段。不同版本可能将相关字段放在设置对话框或端口设置区域,以界面里的“混合端口”名称为准。
  3. 将原值 7897 改为 7898 并保存。若界面提示重启内核,按提示操作;随后在「日志」页确认新的监听地址。
  4. 重新查询 7898 的监听者,确认它属于当前客户端使用的内核,而不是另一个进程。

在 mihomo YAML 中,对应字段如下。它展示的是字段含义,不要求同时编辑订阅文件:

mixed-port: 7898

Clash Verge Rev 可能通过客户端设置覆盖订阅中的通用字段,因此直接修改下载来的 YAML 不一定决定最终监听值,订阅更新也可能覆盖手工修改。优先使用客户端提供的设置入口,并以启动日志和操作系统的监听结果核实生效值。需要管理覆盖配置时,可参考进阶配置。

同步系统代理、终端变量与应用设置

内核已经改为监听 7898,但应用仍连接 7897,是换端口后最常见的遗漏。端口迁移要同时检查“监听端”和“使用端”。客户端能够更新自己管理的系统代理,不代表浏览器扩展、终端环境变量和手动设置代理的开发工具都会随之改变。

系统代理重新应用一次

保存新端口后,在「设置」中关闭再开启「系统代理」,使客户端重新写入代理地址。再到系统设置核对:Windows 11 为「设置」→「网络和 Internet」→「代理」;macOS 为「系统设置」→「网络」→当前网络连接→「详细信息」→「代理」。Linux 的系统代理入口随桌面环境而异,部分应用不会读取桌面代理。

本机代理地址通常使用 127.0.0.1,端口应与新监听值一致。HTTP、HTTPS 目标流量可以通过同一个 HTTP 代理入口转发;这不意味着本地代理地址必须写成 https://。若其他客户端同时启用了系统代理,先关闭其他客户端的该项功能,避免设置被来回覆盖。

终端和开发工具需要单独核对

已有终端可能保留旧的 HTTP_PROXY、HTTPS_PROXY 或 ALL_PROXY。以下命令只调整当前终端会话,不会永久修改系统设置:

# macOS / Linux:当前 shell 会话
export HTTP_PROXY=http://127.0.0.1:7898
export HTTPS_PROXY=http://127.0.0.1:7898
export ALL_PROXY=socks5h://127.0.0.1:7898
# Windows PowerShell:当前会话
$env:HTTP_PROXY = "http://127.0.0.1:7898"
$env:HTTPS_PROXY = "http://127.0.0.1:7898"
$env:ALL_PROXY = "socks5h://127.0.0.1:7898"

应用是否读取这些变量,取决于应用自身实现。浏览器代理扩展、Git 的代理配置、编辑器网络设置、容器内部环境都可能保存独立值。应逐一检查仍使用 7897 的项目,而不是只重开浏览器。

TUN 模式不等于混合端口

TUN 模式通过虚拟网络接口接管流量,混合端口则是应用主动连接的本地代理入口。修改 mixed-port 不会自动修改 TUN 路由或 DNS 配置。如果应用明确指定了旧代理端口,即使 TUN 已开启,也可能继续报连接失败。不要把开启 TUN 当作端口冲突的修复步骤。

验证新端口:先看监听,再测请求

验证应分层进行。先确认端口属于正确的内核,再发起一次显式指定代理的请求。不要仅凭网页能打开判断修复完成,因为页面可能来自缓存,也可能经由直连或其他网络路径访问。

  1. 重新执行对应系统的监听查询,将端口改为 7898,核对进程与监听地址。
  2. 查看「日志」页,确认重载后没有新的 bind 错误。
  3. 执行下面的 HTTP 代理测试,然后在「连接」页核对请求的目标与规则匹配结果。
# macOS / Linux
curl --noproxy "" --proxy http://127.0.0.1:7898 --connect-timeout 5 --max-time 15 -I https://example.com

# Windows PowerShell
curl.exe --noproxy "" --proxy http://127.0.0.1:7898 --connect-timeout 5 --max-time 15 -I https://example.com

这里的连接超时为 5 秒,总超时为 15 秒,属于测试参数,不是实测延迟。--noproxy "" 用于排除现有绕过代理列表的影响。能收到 HTTP 响应说明请求经过本地代理入口完成了处理,但响应码不保证一定为 200;规则也可能将目标分流到直连,因此仍需查看连接详情。

如果立刻提示无法连接 127.0.0.1:7898,回到监听检查。如果已经连接本地代理后才出现 TLS、DNS 或上游超时,则应转查节点、域名解析与规则。此时不断更换本地端口通常没有帮助。

常见补充:端口改了仍报错怎么查

7897 出现多行记录,是否代表多个程序冲突?

不一定。同一 PID 可能分别监听 IPv4 与 IPv6,也可能存在多条已建立连接。应重点看监听状态、地址、协议和 PID,而不是只数输出行数。TCP 的 TIME_WAIT 记录也不能直接当作仍在运行的监听进程处理。

能否只退出界面,再重新打开?

可以作为操作步骤,但不能代替核对结果。托盘驻留、服务模式和第二个客户端都可能让内核继续运行。退出后再次查询端口,才能确认监听是否真正释放;重新打开后还要核对新监听者。

开启“允许局域网连接”能解决占用吗?

不能将它作为通用修复。该设置涉及监听范围,可能从回环地址扩展到更多接口,反而与已有监听产生冲突。只供本机使用时,保持本机访问范围即可;局域网共享还需要额外考虑防火墙和访问控制。

需要重装客户端或删除订阅吗?

通常不需要。订阅提供节点与规则,端口冲突发生在本机套接字绑定阶段。先查监听进程、选择空闲端口、同步所有代理使用端,再验证请求。只有确认安装或服务本身存在问题时,才继续处理对应组件,不要先清空全部配置。

Clash 客户端下载