Hyper-V 或 Docker 占用端口导致 Jetbrain IDE 无法启动或 Clash 端口为 0

本文最后更新于:2023年5月26日 晚上

其实本文应该是:

  • IDEA Start Failed: Address already in use 的解决办法
  • Clash 端口为 0 的解决办法

问题描述

最近遇到了两次端口无法使用的问题,第一次是 Pycharm 无法启动。报错如下图,第二次是 Clash 无法使用默认端口 7890 从而变成端口 0 ,但实际上 0 并不是一个合法的端口,所以最终会导致代理无法使用。

pycharm

发现两个问题的根源都是同一个。就是 tcp 动态端口占用某个区间,而我们需要的端口比如 7890 刚好在这个区间范围内。

问题排查

先打开 powershell 或者 cmd

查看端口占用:

1
netstat -ano

查找某个端口是否被占用:

1
netstat -aon|findstr "8081"

发现我们需要的端口明明没被占用啊。

然后查看 Windows 操作系统中 TCP 协议的动态端口范围:

1
netsh int ipv4 show dynamicport tcp

使用命令查看被系统排除在可用范围外的端口:

1
netsh interface ipv4 show excludedportrange protocol=tcp

port

也就是说在第一条命令范围的端口且不在第二条命令的范围的端口,是不可以用的。

Clash 问题解决

有几种方法都可以解决

修改软件的端口

山不动我动。既然 7890 被占用,那就换一个,比如说换成 7980

解决方法参考:《Clash For Windows代理端口为0问题

修改 tcp 动态端口范围

看个人需求。你可以关掉,那就关。

先禁用 Hyper-V (需要重启)

1
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

重启完成后,增加被排除端口范围,其中 7890 就是希望被添加的排除在范围内的端口:

1
netsh int ipv4 add excludedportrange protocol=tcp startport=7890 numberofports=1

如果要保存的话,加上 store=persistant

也就是:

1
netsh int ipv4 add excludedportrange protocol=tcp startport=7890 numberofports=1 store=persistant

重新启用 Hyper-V

1
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

Jetbrains IDE 问题解决

其实我对于为什么会出问题还是有点迷思。

通过搜索我找到 JetBrains 论坛相关帖子

其中有一段:

To lock folders IDE is starting a server on localhost, it tries to bind on the first available port between 6942 and 6991

就是说 IDE 启动的时候会在本地起一个 server,并且绑定 6942 到 6991 之间第一个可用的端口。但明明这个段的端口是被排除了的。

我又查看了 tcp 实际占用的端口,在 Task Manager -> Performance -> Resource Monitor -> TCP connections

tcp

这个范围内确实没有使用端口。

但很多人都反映卸载 docker 和 Hyper-V 就可以重新启动 IDE 了。所以很明显这俩还是罪魁祸首

解决

以管理员身份运行 powershell

1
2
net stop winnat
net start winnat

Hyper-V 或 Docker 占用端口导致 Jetbrain IDE 无法启动或 Clash 端口为 0
https://pawswrite.xyz/posts/1326aa90.html
作者
Rainbow
发布于
2023年5月26日
许可协议