我有一个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,则不会排除这些端口。
调查并释放端口
Hyper-V似乎保留了随机端口(或者至少与Hyper-V相关的端口)。使用netsh int ip show excludedportrange protocol=tcp
确认不工作的端口在输出中。
这对我来说起到了解放港口的作用。这对我来说似乎没有什么侵扰性(竖起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为什么不能打开端口的类似问题时(竖起24个大拇指),这也对我有效:
netcfg -d
--这将清理所有网络设备,并需要重新启动
不过确实有人对此发出了警告(竖起4个大拇指)。您的邮件地址可能有所不同。它对我有效,主要是因为我直到成功运行后才看到以下警告。。。。
(
netcfg -d
)是一个危险的命令,它损坏了我的docker,不再启动。即使在重新安装HyperV。以及重新启动机器。此命令似乎删除了几个网络适配器。此外,重新启动也没有任何作用。我不得不重置(松散的)容器和图像,但这导致我遇到了另一个问题
类似docker问题的另一个答案(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
当您的系统恢复时,您将能够成功绑定到该端口。
设置窗口"动态端口范围";在一个没有冲突的地方
我们设法解决了这个问题,因为您无法将端口的需求更改为其他位置(如不可配置的应用程序)。
当您发出命令时:
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(微软的硬件虚拟化产品)保留了随机端口范围(通常为100个端口的块)。这是一种痛苦,因为如果您正在开发使用多个端口的应用程序或更大的解决方案,在重新启动系统后,有时会发生冲突,有时则不会。
为了查找";"动态端口范围">您可以发出命令:
netsh int ipv4 show dynamicport tcp
答案:
Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 1024
Number of Ports : 64511
您可以指示Windows在冲突区域之外修改此范围
假设您的开发是在60000端口以下,您可以发出以下命令来限制它之外的动态端口范围(您必须具有管理员权限):
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.
只有";管理端口排除";保持在端口60001 以下
我遇到了同样的问题,并卸载了Hyper-V,但保留端口仍然存在。经过几次尝试,我确定Windows沙盒是取消安装的罪魁祸首