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.

要解决我的问题,我可以:

  1. 禁用Hyper-V
  2. netsh int ipv4 add excludedportrange protocol=tcp startport=53000 numberofports=1(作为管理员)
  3. 启用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 以下