Hyper-V 端口占用问题

最近在Windows11上捣鼓WSL2,跑了一个ubuntu的26.04系统。在Windows上启动WSL服务后,发现我blog在本地跑不起来了,即构建后出现以下错误:

1
2
3
4
5
INFO  === Checking package dependencies ===
INFO === Checking theme configurations ===
INFO === Registering Hexo extensions ===
FATAL Permission denied. You can't use port 4000.
FATAL Something's wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.html

根据FATAL日志可知我们的 localhost:4000 貌似在引入WSL之后被占用了。

进一步了解发现:我们的Windows作为宿主机,在启用Hyper-V服务后,系统的部分端口会被Hyper-V占用。终端使用以下命令查看被保留的端口:

1
netsh int ipv4 show excludedportrange protocol=tcp

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
协议 tcp 端口排除范围

开始端口 结束端口
---------- --------
80 80
3421 3520
3583 3682
3683 3782
3783 3882
3883 3982
3983 4082
4083 4182
4183 4282
4283 4382
4383 4482
4483 4582
4583 4682
4683 4782
5357 5357
50000 50059 *

* - 管理的端口排除。

可以发现我们的4000端口处于 3983~4082 之间被保留了。这也是为什么我们的程序跑不起来的原因。

这里要说明一点:保留区是动态划分的,也就是说每次重启都会随机划分,所以我们程序端口越高,越不容易和保留区撞车。

解决方法:

  • 将我们程序端口开在保留区之外的区域,例如4800以上(4783 以上大片空闲,不容易撞上保留区)。
  • 修改动态端口范围
1
2
netsh int ipv4 set dynamicport tcp start=55000 num=10536
netsh int ipv6 set dynamicport tcp start=55000 num=10536

以上两行命令可以将动态端口保留区强制限制在 55000 ~ 65536 这个区间,这样就不容易和我们的程序冲突。

  • 对于我们一些常用端口,可以强制进行保留。
1
netsh int ipv4 add excludedportrange protocol=tcp startport=4000 numberofports=1

以上命令执行后,port4000将不会被划入保留端口。


不止是blog,端口随机保留会导致例如代理等服务不可访问,出现一些“有时可用,有时又不可用”的灵异问题。后续若再出现此类类似问题,应先从这方面考虑。

作者

R6bandito

发布于

2026-09-19

更新于

2026-10-08

许可协议

评论

音乐
0:000:00