问题

有时候,在本机运行前后端调试,或者预览博客界面时,会提示某些端口被占用。此时需要手动指定端口,十分麻烦。

1
2
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

解决方案

运行 netsh int ip show excludedportrange protocol=tcp 可以看到被占用的端口范围。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
C:\Users\summe>netsh int ip show excludedportrange protocol=tcp

协议 tcp 端口排除范围

开始端口 结束端口
---------- --------
1136 1235
1243 1342
1643 1742
2068 2167
3872 3971
3972 4071
4072 4171
5357 5357
5822 5921
9738 9837
50000 50059 *

* - 管理的端口排除。

可以看到,hexo 博客默认的 4000 端口在此范围内。

这通常是由 Windows NAT Driver (winnat) 导致,重启这一服务一般会解决问题。

管理员模式运行以下代码:

1
2
3
4
5
6
7
8
9
10
11
C:\Windows\System32>net stop winnat

Windows NAT Driver 服务已成功停止。


C:\Windows\System32>net start winnat

Windows NAT Driver 服务已经启动成功。


C:\Windows\System32>

否则会提示没有权限。

1
2
3
4
C:\Users\summe>net stop winnat
发生系统错误 5

拒绝访问。

再次查看被占用的端口,发现这样可以临时解决问题。

1
2
3
4
5
6
7
8
9
10
C:\Users\summe>netsh int ip show excludedportrange protocol=tcp

协议 tcp 端口排除范围

开始端口 结束端口
---------- --------
5357 5357
50000 50059 *

* - 管理的端口排除。

不过可能未来仍然会出现端口被占用的状况。为了某个端口永远不被占用,需要设置排除项。如下面的指令限制了 9012 和 9013 这两个端口的使用,它们未来就不会被 winnat 占用。

1
netsh int ipv4 add excludedportrange protocol=tcp startport=9012 numberofports=2

参考