大约是自 Windows 10 1709 更新之后(或许是 1809?2004?),莫名其妙的存在类似“端口被占用”这样的问题,比如像下面这样的报错信息:

Error: listen EACCES: permission denied 0.0.0.0:3000

或者启动 SS 时提示:

Shadowsocks Error: Port already in use

又或者启动 Docker 时提示:

Error starting userland proxy: Bind for 0.0.0.0:50051: unexpected error Permission denied.

电脑重启几次之后,以上报错可能会消失,一切又恢复正常。

这表面上像是端口 3000 被占用,实则不然,因为当你在 PowerShell 中输入 netstat -ano | findstr "3000" 查看端口占用信息时,它却无任何输出。实际上这个错误对应的 Windows 错误码是 10013(WSAEACCES) :权限被拒绝。

出现这个错误的原因是 Windows 10 的补丁 KB4074588 中存在一个已知问题:

安装此更新后,应用程序可能无法保留或绑定到以前工作的端口。

这些端口会被 Hyper-V 拿来保留备用,处于备用的端口无法被其他程序使用,用户登录后,系统会随机保留一些端口。使用 netsh interface ipv4 show excludedportrange protocol=tcp 可以查看被保留的端口段,每次重启都有可能是不同的端口。

因此,当你的系统启用 Hyper-V 或安装 Docker(安装 Docker Desktop 会启用 Hyper-V)之后,这个问题可能就会出现。

这个问题的解决方法(workaround)有两种,最粗暴的方法就是如上所述多重启几次,让它的随机端口改变,但以后仍有可能会遇到同样的问题。另一种方法是排除掉需要使用的端口,具体来说:

禁用 Hyper-V
添加需要排除的端口范围,如:netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1
重新启用 Hyper-V

最后修改:2023 年 11 月 26 日
如果觉得我的文章对你有用,请随意赞赏