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

Posted

技术标签:

【中文标题】如何查看在 Windows 上保留临时端口范围的内容?【英文标题】:How to see what is reserving ephemeral port ranges on Windows? 【发布时间】:2019-05-29 08:07:49 【问题描述】:

我有一个 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.

所以我机器上的某些东西将端口49909 保留到50008,这可能是导致我的应用程序失败的原因。我尝试使用以下命令删除此excludedportrange

netsh int ip delete excludedportrange protocol=tcp numberofports=100 startport=49909

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

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

作为健全性检查,我还运行了resmon.exe 并确认端口5000550006 上没有运行任何内容。

我如何知道添加excludedportrange 的内容是什么?

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

【问题讨论】:

@AnkurGoel 似乎没有使用这些端口范围内的任何东西。 关闭 Hyper-V 对我有用。去打开或关闭 Windows 功能并取消选择 Hyper-V (Windows 10)。我认为问题在于 Hyper-V 随机保留了包含我需要运行的端口的端口范围 解决方案是在运行任何 hyper-v 相关资产之前在启动时保留端口。见***.com/questions/48478869/…。我相信您无法释放这些端口,因为它们是由 SYSTEM 主体保留的。 这太疯狂了。保留端口范围?无法查看保留它们的内容,并且无法使用管理员权限取消保留它们?这是什么搞砸的功能?这突然停止了“使用中的端口”错误的开发,并且没有使用该端口。在我没有授权的另一个拙劣的 Windows 更新之后(Windows 现在只是强制它,尽管禁用了该服务)。 @Liam 有人解决过这个问题吗?我的 Sonos 正在尝试绑定到端口 3410,但那在排除范围内(这真的很长),我无法弄清楚这是怎么回事 - 就像你 Liam 一样,实际上没有任何东西使用端口 3410,但绑定被禁止无论如何通过 Windows 【参考方案1】:

调查并释放端口

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

This 帮助我释放了端口。这对我来说似乎并不打扰(25 个赞):

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

net stop winnat
docker start ...
net start winnat

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

从现在开始保留端口

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

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

(感谢@Venryx 提醒我)

其他方法

在回答关于为什么docker couldn't open ports(24 点赞)的类似问题时,这也对我有用:

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

尽管有人这样做了warn about it(4 个竖起大拇指)。您的邮件可能会有所不同。它对我有用,主要是因为我在成功运行它之后才看到以下警告....

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

another answer to a similar docker question(129 点赞)有这个,但它似乎对我来说更重要,所以我没有尝试:

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

    禁用 hyper-v(需要重启几次)

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

    当你完成所有必需的重启后,保留你想要的端口,这样 hyper-v 就不会保留它

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

    重新启用 hyper-V(需要重启几次)

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

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

【讨论】:

我尝试了 winnat 服务重启以成功释放端口,因为这似乎是最简单的选择。希望它在未来继续为我工作并且不会破坏任何东西 停止并重新启动“winnat”(无论是什么)对我有用。它立即工作,甚至不需要重新启动。 Windows 10 Pro 20H2 19042.804 Windows 功能体验包 120.2212.551.0 谢谢@zentrunix,我已经澄清了我的答案。我需要在停止/启动 winnat 后重新启动的原因是它破坏了我的 WSL2 网络。 是否有原始问题的答案 - 究竟是哪个进程保留了范围? (不是停止希望端口范围未被保留的解决方法。) 至少对于我的设置,上述修复只是解决根本问题的方法,即我的电脑上的动态端口范围设置不正确。我在这里找到了解决方案:***.com/a/62359555/2441655【参考方案2】:

我遇到了同样的问题并卸载了 Hyper-V,但保留端口仍然存在。 经过几次尝试,我确定 Windows Sandbox 是要卸载的罪魁祸首

【讨论】:

以上是关于如何查看在 Windows 上保留临时端口范围的内容?的主要内容,如果未能解决你的问题,请参考以下文章

Windows 临时端口端口保留及封锁端口

Linux 查看 && 修改端口范围限制

为啥我的内网IP端口不通,请各位帮助我

如何隐藏开启的TCP端口号

win7架设mud 端口怎么设置

关于端口映射的问题(如何将端口转发给域名)?