netstat 中未显示要使用的端口,但尝试使用该端口被 Windows 拒绝
Port not shown to be used in netstat, but trying to use the port is denied by Windows
我已经找到了这个问题的答案,只是想记录下我的发现。
在我最近的一个项目中,我发现一个端口不会在 netstat 中显示为正在使用,但是当我的项目试图使用该端口时,会抛出一个错误。
例如,假设我想使用端口 53000:
netstat -ano | findstr :53000
不会显示任何内容,但如果我尝试使用 Node.js 中的端口,则会抛出权限错误。
原来Hyper-V、Docker等东西会保留一定范围的端口。要找出保留端口的范围,请执行以下操作:
netsh interface ipv4 show excludedportrange protocol=tcp
在我的例子中,我会看到这样的东西:
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
49805 49904
50000 50059 *
50060 50159
50160 50259
50360 50459
50870 50969
50970 51069
51070 51169
51270 51369
52353 52452
52453 52552
52553 52652
52653 52752
52853 52952
52953 53052
53053 53152
53324 53423
56247 56346
56347 56446
56547 56646
56647 56746
* - Administered port exclusions.
要解决我的问题,我可以:
- 禁用Hyper-V
netsh int ipv4 add excludedportrange protocol=tcp startport=53000 numberofports=1
(作为管理员)
- 启用Hyper-V
在不冲突的地方设置Windows“动态端口范围”
我们设法解决了这个问题,因为您无法将端口的需求更改到其他位置(例如不可配置的应用程序)并且还需要 Hyper-V。
当您发出命令时:
netsh int ip show excludedportrange protocol=tcp
您会得到一个包含保留端口范围列表的输出:
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
33474 33573
50000 50059 *
58159 58258
58259 58358
58359 58458
58459 58558
58559 58658
58659 58758
58759 58858
* - Administered port exclusions.
Windows Hyper-V(Microsoft 的硬件虚拟化产品)保留随机端口范围(通常为 100 个端口块)。
这变得很痛苦,因为如果您正在开发使用多个端口的应用程序或更大的解决方案,有时会发生冲突,有时不会重新启动系统后。
要查找 “动态端口范围”,您可以发出命令:
netsh int ipv4 show dynamicport tcp
答案:
Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 1024
Number of Ports : 64511
您可以指示Windows将此范围修改出冲突区域。假设您的开发在 6000 端口以下,您可以发出以下命令来限制动态端口范围超出它 (您必须具有管理员权限):
netsh int ipv4 set dynamic tcp start=60001 num=5534
要使 Hyper-V(通常 Windows)使用这个新的动态范围,您必须重新启动您的系统。
现在如果我们请求排除的端口范围:
netsh int ip show excludedportrange protocol=tcp
响应已更改:
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
50000 50059 *
63904 64003
64004 64103
64105 64204
64205 64304
64305 64404
64405 64504
64505 64604
64605 64704
* - Administered port exclusions.
只有“管理端口排除项”保留在端口 6001 以下
我已经找到了这个问题的答案,只是想记录下我的发现。
在我最近的一个项目中,我发现一个端口不会在 netstat 中显示为正在使用,但是当我的项目试图使用该端口时,会抛出一个错误。
例如,假设我想使用端口 53000:
netstat -ano | findstr :53000
不会显示任何内容,但如果我尝试使用 Node.js 中的端口,则会抛出权限错误。
原来Hyper-V、Docker等东西会保留一定范围的端口。要找出保留端口的范围,请执行以下操作:
netsh interface ipv4 show excludedportrange protocol=tcp
在我的例子中,我会看到这样的东西:
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
49805 49904
50000 50059 *
50060 50159
50160 50259
50360 50459
50870 50969
50970 51069
51070 51169
51270 51369
52353 52452
52453 52552
52553 52652
52653 52752
52853 52952
52953 53052
53053 53152
53324 53423
56247 56346
56347 56446
56547 56646
56647 56746
* - Administered port exclusions.
要解决我的问题,我可以:
- 禁用Hyper-V
netsh int ipv4 add excludedportrange protocol=tcp startport=53000 numberofports=1
(作为管理员)- 启用Hyper-V
在不冲突的地方设置Windows“动态端口范围”
我们设法解决了这个问题,因为您无法将端口的需求更改到其他位置(例如不可配置的应用程序)并且还需要 Hyper-V。
当您发出命令时:
netsh int ip show excludedportrange protocol=tcp
您会得到一个包含保留端口范围列表的输出:
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
33474 33573
50000 50059 *
58159 58258
58259 58358
58359 58458
58459 58558
58559 58658
58659 58758
58759 58858
* - Administered port exclusions.
Windows Hyper-V(Microsoft 的硬件虚拟化产品)保留随机端口范围(通常为 100 个端口块)。 这变得很痛苦,因为如果您正在开发使用多个端口的应用程序或更大的解决方案,有时会发生冲突,有时不会重新启动系统后。
要查找 “动态端口范围”,您可以发出命令:
netsh int ipv4 show dynamicport tcp
答案:
Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 1024
Number of Ports : 64511
您可以指示Windows将此范围修改出冲突区域。假设您的开发在 6000 端口以下,您可以发出以下命令来限制动态端口范围超出它 (您必须具有管理员权限):
netsh int ipv4 set dynamic tcp start=60001 num=5534
要使 Hyper-V(通常 Windows)使用这个新的动态范围,您必须重新启动您的系统。
现在如果我们请求排除的端口范围:
netsh int ip show excludedportrange protocol=tcp
响应已更改:
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
50000 50059 *
63904 64003
64004 64103
64105 64204
64205 64304
64305 64404
64405 64504
64505 64604
64605 64704
* - Administered port exclusions.
只有“管理端口排除项”保留在端口 6001 以下