如何查看在 Windows 上保留临时端口范围的内容?
Posted
技术标签:
【中文标题】如何查看在 Windows 上保留临时端口范围的内容?【英文标题】:How to see what is reserving ephemeral port ranges on Windows? 【发布时间】:2019-05-29 08:07:49 【问题描述】:我有一个 Windows 应用程序需要使用端口 50005
和 50006
,但它被阻止了。
我在运行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
并确认端口50005
和50006
上没有运行任何内容。
我如何知道添加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 上保留临时端口范围的内容?的主要内容,如果未能解决你的问题,请参考以下文章