如何查看在Windows上保留临时端口范围的内容?

Lia*_*iam 7 windows port networking tcp netsh

我有一个Windows应用程序,需要使用端口5000550006但是被阻止了。

运行时,我看到以下内容netsh int ip show excludedportrange protocol=tcp

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
5357        5357
49709       49808
49809       49908
49909       50008
50009       50108
50109       50208
50280       50379

* - Administered port exclusions.
Run Code Online (Sandbox Code Playgroud)

所以,我的机器上的东西是预留的端口4990950008,这大概是什么原因造成我的应用程序失败。我尝试excludedportrange使用以下命令删除它:

netsh int ip delete excludedportrange protocol=tcp numberofports=100 startport=49909
Run Code Online (Sandbox Code Playgroud)

但是我看到一个错误Access is denied.,这使我认为保留该端口的任何内容都在积极运行,但是我不知道这可能是什么。

同样奇怪的是,即使我看到一个错误,在运行该命令后,如果重新启动,情况excludedportrange也会有所不同。

作为健全性检查,我还运行resmon.exe并确认端口50005和上没有任何运行50006

我如何知道添加了excludedportrange什么?

编辑:我已经缩小到Hyper-V。如果禁用Hyper-V,则不会排除这些端口。

Pet*_*rch 36

调查并释放端口

Hyper-V 似乎保留了随机端口(或至少与 Hyper-V 相关的端口)。使用netsh int ip show excludedportrange protocol=tcp以确认未工作端口输出。

对我有用,可以释放端口。对我来说似乎并不打扰(25 次竖起大拇指):

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

net stop winnat
docker start ...
net start winnat
Run Code Online (Sandbox Code Playgroud)

在此之后,端口不再保留,但我的 WSL2 终端不再连接到互联网,因此我需要在此之后重新启动以让一切重新工作。

从现在开始保留端口

如果您再不做任何事情,您很可能会再次遇到这个问题。因此,例如保留端口 9012 和 9013 以备将来使用(所以winnat永远不要尝试使用它们):

netsh int ipv4 add excludedportrange protocol=tcp startport=9012 numberofports=2
Run Code Online (Sandbox Code Playgroud)

(感谢@Venryx 提醒我)

其他方法

在回答有关为什么docker 无法打开端口(24 次竖起大拇指)的类似问题时,这也对我有用:

netcfg -d --这将清理所有网络设备,并需要重新启动

不过确实有人警告过它(4 竖起大拇指)。您的邮件可能会有所不同。它对我有用,主要是因为直到我成功运行它之后我才看到以下警告......

那 ( netcfg -d) 是危险的命令,它损坏了我的 docker 并且不再启动。即使在重新安装 HyperV 之后。并重新启动机器。这个命令似乎删除了几个网络适配器。也重新启动什么也不做。我不得不重置(松散的)容器和图像,但这让我遇到了另一个问题

对类似 docker 问题(129 次竖起大拇指)的另一个答案有这个,但对我来说似乎更重要,所以我没有尝试:

@veqryn 解决方法对我有用,步骤是:

  1. 禁用 hyper-v(这将需要重新启动几次)

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

  2. 完成所有必需的重新启动后,保留所需的端口,以便 hyper-v 不会保留它

    netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1 store=persistent

  3. 重新启用 hyper-V(这将需要重新启动几次)

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

当您的系统恢复时,您将能够成功绑定到该端口。

  • 我尝试重新启动 winnat 服务以成功释放端口,因为这似乎是最简单的选择。希望它将来继续为我工作并且不会损坏任何东西 (3认同)
  • 原始问题是否有答案 - 哪个进程确切地保留了范围?(不是停止某些希望端口范围未被保留的解决方法。) (3认同)
  • 谢谢@zentrunix,我已经澄清了我的答案。我需要在停止/启动 winnat 后重新启动的原因是它破坏了我的 WSL2 网络。 (2认同)
  • 至少对于我的设置来说,上述修复只是解决根本问题的方法,即我的电脑上的动态端口范围设置不正确。我在这里找到了解决方案:/sf/answers/4365168881/ (2认同)

Tru*_*ems 19

在不冲突的地方设置Windows“动态端口范围”

我们设法解决了这个问题,因为您无法将端口的需求更改为其他位置(例如不可配置的应用程序)。

当您发出命令时:

netsh int ip show excludedportrange protocol=tcp
Run Code Online (Sandbox Code Playgroud)

您将得到一个包含保留端口范围列表的输出:

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.
Run Code Online (Sandbox Code Playgroud)

最可能的原因是 Windows Hyper-V(微软的硬件虚拟化产品)保留了随机端口范围(通常是 100 个端口的块)。这变得很痛苦,因为如果您正在开发使用多个端口的应用程序或更大的解决方案,有时您会遇到冲突,有时在重新启动系统后不会发生冲突。

要查找“动态端口范围”,您可以发出以下命令:

netsh int ipv4 show dynamicport tcp
Run Code Online (Sandbox Code Playgroud)

答案:

Protocol tcp Dynamic Port Range
---------------------------------
Start Port      : 1024
Number of Ports : 64511
Run Code Online (Sandbox Code Playgroud)

您可以指示 Windows 将此范围修改为冲突区域之外。

假设您的开发在端口 60000 以下,您可以发出以下命令来限制动态端口范围(您必须具有管理员权限)

netsh int ipv4 set dynamic tcp start=60001 num=5534
Run Code Online (Sandbox Code Playgroud)

要使 Hyper-V(以及一般的 Windows)使用这个新的动态范围,您必须重新启动系统。

现在,如果我们请求排除的端口范围:

netsh int ip show excludedportrange protocol=tcp
Run Code Online (Sandbox Code Playgroud)

响应已更改:

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.
Run Code Online (Sandbox Code Playgroud)

仅“受管理的端口排除”保留在端口 60001 以下