自 Windows 2004 更新以来,我一直在与许多无法绑定到某些端口的程序和工具作斗争。我偶然发现了一些研究:
netsh interface ipv4 show excludedportrange protocol=tcp
就我而言,结果是(禁用 hyper-v 后,我切换到基于 WSL2 的 Docker):
Startport Endport
---------- --------
1131 1230
1231 1330
1331 1430
1431 1530
1735 1834
1835 1934
1943 2042
2043 2142
2143 2242
2243 2342
2343 2442
2443 2542
2543 2642
2643 2742
2743 2842
2843 2942
2943 3042
3129 3228
3229 3328
3329 3428
3429 3528
3831 3930
3931 4030
4031 4130
4131 4230
4231 4330
4531 4630
4631 4730
5241 5340
5357 5357
5458 5557
5558 5657
5658 5757
6040 6139
6140 6239
6933 7032
7033 7132
7133 7232
7233 7332
7333 7432
7633 7732
7733 7832
8001 8100
8101 8200
8201 8300
8301 8400
8401 8500
8501 8600
27972 28071
28072 28171
28172 28271
28272 28371
28572 28671
28672 28771
50000 50059 *
目前,范围 1431 到 1530 阻止我运行 Oracle 数据库。但每次重启后保留范围都会发生变化。
我尝试删除一些范围
netsh int ipv4 delete excludedportrange protocol=tcp startport=1431 numberofports=100
但是失败了access denied
(在管理员命令中)。
什么保留了这些范围以及如何控制它们?
答案1
我找到了答案此 GitHub 评论:你可以尝试
net stop winnat
释放端口。这对您在 Windows 10 2004 中有效,对我在 Windows 10 20H2 中有效。
(在早期版本的 Windows 中,我成功使用了以下方法之一,比较我如何知道是什么阻止我的套接字绑定到 localhost:50060-50959)。
net stop LanmanWorkstation
net stop WlanSvc
net stop WwanSvc
虽然这可能会断开您的网络,但不要绝望。因为,如果上述方法之一对您有用,您可以尝试以下方法一次来永久修复此问题:
netsh int ipv4 add excludedportrange protocol=tcp startport=50323 numberofports=1
(根据您的需要调整startport
和numberofports
-如果需要的话,还要考虑ipv6
)。
这应该会net start
在相应服务关闭以及重启后继续存在,你可以使用以下方法检查
netsh interface ipv4 show excludedportrange protocol=tcp
如果输出
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
[...]
50145 50244
50323 50323 *
50324 50423
[...]
* - Administered port exclusions.
你应该好一会儿。
答案2
这@yoshpe 的回答(与 Hyper-V 相关)是导致该问题的一个潜在原因。
但是,对我来说,问题有所不同。就我而言,这是因为 Windows 启动时将其“动态端口”配置为从端口 1025 开始,到端口 5000 结束。因此,当 Docker Desktop 启动时,它会在 1025-5000 端口范围内保留其端口,这(有时!)与我自己的程序配置为保留/使用的端口冲突。(用于从我的本地 Kubernetes 集群到本地主机的端口转发)
要查看动态端口是否设置不正确,您可以运行:
netsh int ipv4 show dynamicport tcp
如果您看到Start Port: 1025
,则说明动态端口范围配置错误。要修复此问题,您需要将其设置为更合理的范围 - 避免使用 <10k 端口。(这通常是开发人员放置自己的应用程序的地方)
将其设置为推荐范围:(如果您的问题与 ipv6 有关,请ipv4
用ipv6
iirc 替换)
netsh int ipv4 set dynamic tcp start=49152 num=16384
欲了解更多信息,请参见:https://stackoverflow.com/a/62359555/2441655
答案3
这似乎与此处描述的 Hyper-V 问题有关:
- https://stackoverflow.com/a/63723105/3234715
- https://github.com/docker/for-win/issues/3171
- https://gist.github.com/strayge/481a77d31a94e133a76662877b1a90ca#another-workaround
我已添加注册表项:
reg add HKLM\SYSTEM\CurrentControlSet\Services\hns\State /v EnableExcludedPortRange /d 0 /f
清除了大多数保留端口(有许多保留范围,例如 1612-2111、2180-2779 等)