Lia*_*iam 7 windows port networking tcp netsh
我有一个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.
Run Code Online (Sandbox Code Playgroud)
所以,我的机器上的东西是预留的端口49909来50008,这大概是什么原因造成我的应用程序失败。我尝试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) 引起的,停止并重新启动该服务可能会解决该问题。
Run Code Online (Sandbox Code Playgroud)net stop winnat docker start ... net start winnat
在此之后,端口不再保留,但我的 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 解决方法对我有用,步骤是:
禁用 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当您的系统恢复时,您将能够成功绑定到该端口。
Tru*_*ems 19
我们设法解决了这个问题,因为您无法将端口的需求更改为其他位置(例如不可配置的应用程序)。
当您发出命令时:
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)
假设您的开发在端口 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 以下