什么是 Windows 10 中的托管端口排除项?

What is Administered port exclusions in windows 10?

提问人:AnjK 提问时间:10/3/2019 最后编辑:AnjK 更新时间:4/22/2022 访问量:12345

问:

我在 Windows 10 中启用了 hyper-v。 当我检查排除的端口时,我得到:

C:\> netsh interface ipv4 show excludedportrange protocol=tcp

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
      5357        5357
      9800        9800
      9801        9801
     49671       49770
     49871       49970
     50000       50059     *
     61117       61216
     61220       61319
     61902       62001

* - Administered port exclusions.

为什么 Hyper-V 保留这些端口?

受管端口排除项(即范围 50000-50059)与其他端口排除项有何不同?

例如,当我尝试使用网络ping到所有这些端口时。golang 中的 listen(),除 50000-50059 之外的所有端口都返回错误:

listen tcp 127.0.0.1:9801: bind: An attempt was made to access a socket in a way forbidden by its access permissions. 
Windows-10 Hyper-V Docker-for-Windows

评论

1赞 Markus W Mahlberg 10/3/2019
删除了 Go 标志,因为这与 Go 只有切身关系。使用任何语言都会遇到同样的问题。这些端口很可能是 HyperV 系统通信所必需的。在任何情况下,您都不能使用它们。选择一个非预留端口,Bob 是你的叔叔。
0赞 icza 10/3/2019
由于已识别的病毒/恶意软件活动,Microsoft可能会阻止该范围。请参阅一些相关文章:dandini.wordpress.com/2019/07/15/...;blog.sixthimpulse.com/2019/01/......
0赞 AnjK 10/3/2019
好。但是,为什么我们能够使用带星号的“管理端口排除”范围的端口?我的意思是,我找不到什么是“管理端口排除”的确切答案?

答:

43赞 AnjK 12/10/2020 #1

在 Windows 10 中,有时我们会收到特定端口的错误:

Ports are not available: listen tcp 0.0.0.0:55555: bind: An attempt was made to access a socket in a way forbidden by its access permissions. 

当看到这个错误时,我们的第一反应是,我们需要的端口正在被另一个应用程序使用。因此,如果我们检查正在使用的端口:

netstat -aon | find "55555"

但结果可能表明该端口尚未被使用。

那么问题可能是Windows保留了一些端口,它们是我们不能用于其他目的的排除端口。我们可以使用以下命令列出这些端口:

C:\Users\Xyz> netsh interface ipv4 show excludedportrange protocol=tcp

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
      1031        1130
      1131        1230
      1231        1330
      1331        1430
      1431        1530
      1561        1660
      2363        2462
      2463        2562
      2563        2662
      2663        2762
      2763        2862
      2863        2962
      5357        5357
     50000       50099     *
     55500       55599
 
* - Administered port exclusions.

为什么 Windows 保留这些端口?

  • 由于已识别的病毒/恶意软件活动,这些端口可能会被 Microsoft 阻止。
  • 我们在 Windows 更新后遇到了这种情况。然后,我们安装了下一个更新并重新启动了计算机。这次范围发生了变化,我们的端口可用。
  • 有时是启用的 Hyper-V 功能(我们为 docker-for-windows 安装启用它)可以执行此操作。

可能还有其他原因。

但是,如果我们尝试使用以下命令删除端口范围排除项(即使以管理员身份),它将返回一个错误,指出它没有权限。

netsh int ipv4 delete excludedportrange protocol=tcp startport=55500 numberofports=100

Hyper-V 引入的端口排除


如果端口排除是由 Hyper-V 引入的,我们最终有两种可能的解决方案(可能还有其他解决方案):

  • 更改我们尝试使用的端口。新端口应该不属于排除项。

  • 禁用 Hyper-V,保留端口范围供我们使用,然后再次启用 Hyper-V。

遵循第二种解决方案的步骤如下:

1. 禁用 Hyper-V

方法 1 - Windows 功能工具:

在“控制面板”中 -> 选择“程序和功能” -> 选择“打开或关闭 Windows 功能” -> 取消选中选项 Hyper-V -> 应用

方法 2 - 通过 Powershell:

打开 Powershell(以管理员身份)并运行以下命令:

Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All

方法 3 - 通过命令提示符:

打开命令提示符(以管理员身份)并运行以下命令:

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

在此之后将需要重新启动系统。

2. 保留所需的端口(范围),以便 hyper-v 不会保留它。

重新启动后,如果我们尝试列出端口排除项,我们可以看到某些范围现在不存在(尤其是我们想要的范围)。现在保留我们需要的端口范围:

netsh int ipv4 add excludedportrange protocol=tcp startport=55500 numberofports=100

3. 重新启用 Hyper-V

您也可以使用上述所有三种方法来启用该功能。 例如,显示一个带有 dism 的:

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

这也需要重新启动系统。

当系统恢复时,请尝试再次列出端口排除项。

此处发生的情况是,指定的端口范围已添加到“管理端口排除项”中。这意味着我们保留了它用于我们的目的。

执行此操作后,Hyper-V 足够智能,可以在我们预先保留的范围周围启动自己的保留范围(请注意,在下面的结果中,从 55500–55599 的范围受到保护):

C:\Users\Xyz> netsh interface ipv4 show excludedportrange protocol=tcp

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
      1031        1130
      1131        1230
      1231        1330
      1331        1430
      1431        1530
      1561        1660
      2363        2462
      2463        2562
      2563        2662
      2663        2762
      2763        2862
      2863        2962
      5357        5357
     50000       50099     *
     55500       55599     *

* - Administered port exclusions.

现在,您将能够成功绑定到该范围内的端口。

Windows 更新后引入的端口排除项


有时,在 Windows 更新后,突然无法使用特定端口,并且在使用命令检查端口使用情况时未列出任何内容。netstat

最重要的是,您也没有启用 Hyper-V!

在这种情况下,您可以尝试以下 2 个解决方法选项:

(不确定它是否适合所有人,但您可以尝试一下!

选项 1 :

  • 检查排除的端口范围

    netsh interface ipv4 show excludedportrange protocol=tcp

    例如,考虑一个端口范围(包括我们需要的端口:)在 Windows 更新后被列为排除。55485-5558455555

  • 启用 Hyper-V

  • 再次检查排除的端口范围:

    netsh interface ipv4 show excludedportrange protocol=tcp

    您可能仍会看到我们必需的端口被排除在外。但是这一次,排除的范围可能会有所不同,这可能是 Hyper-V 引入的覆盖(不确定这是否是实际原因)。55506-555605

  • 禁用 Hyper-V

  • 再次检查排除的端口范围:

    netsh interface ipv4 show excludedportrange protocol=tcp

    这一次,如果您发现所需的端口未包含在排除的范围内,请继续执行保留端口的下一步。

  • 保留我们需要的端口范围:

    netsh int ipv4 add excludedportrange protocol=tcp startport=55500 numberofports=100

    此范围将列为管理端口排除项。

现在尝试使用您需要的端口。

选项 2 :

由于该问题通常是由 Windows NAT 驱动程序 (winnat) 引起的,因此停止并重新启动该服务可能会解决该问题。

谨慎!:停止 winnat 服务可能会断开您的网络连接。

  • 检查排除的端口范围

    netsh interface ipv4 show excludedportrange protocol=tcp

  • 停止 winnat 服务:

    net stop winnat

  • 检查排除的端口范围会发生什么情况:

    netsh interface ipv4 show excludedportrange protocol=tcp

  • 保留端口范围以禁止对所需端口进行动态预留:

    netsh int ipv4 add excludedportrange protocol=tcp startport=55500 numberofports=100

  • 启动 winnat 服务:

    net start winnat

  • 检查排除的端口范围

    netsh interface ipv4 show excludedportrange protocol=tcp

    您可以看到存在端口排除项,但您的端口被列为“管理端口排除项”。

现在尝试使用您需要的端口。

什么是托管端口排除项?


因此,基本上,托管端口排除项是我们可以在 Windows 10 中添加的那些排除项,以保留一些端口供我们使用。

评论

0赞 k3davis 8/13/2021
使用 Ketrel 端口从 Win10 上的 Visual Studio 进行本地调试时,我经常遇到此问题。这是我找到的最详细的解决方案;不幸的是,我的系统上没有启用Hyper-V,所以我仍然无法解释为什么我的系统保留了这么多端口,以及为什么它们经常更改。
1赞 AnjK 2/14/2022
@k3davis我编辑了答案以包含另外 2 个选项,如果您没有启用 Hyper-V,这会有所帮助。这个选项实际上对我有用,尽管我无法确切解释为什么会发生这种情况。您也可以尝试一下!
0赞 szx 9/9/2022
我已禁用 Hyper-V,但它仍然不允许我添加或删除排除的端口(访问被拒绝)