Windows 中的 excludedportrange 和 dynamicport

你在使用 Windows 时是否会遇到这样的问题:某个端口在 netstat -ano 中并没有显示被占用,但是即使使用管理员权限仍然无权绑定该端口?这是因为 Windows 有一些端口是被保留的,即 excludedportrange,而该问题可以通过调整 dynamicport 解决。

excludedportrange

在 PowerShell 中运行命令 netsh int ipv4 show excludedportrange protocol=tcp,你会得到类似这样的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
协议 tcp 端口排除范围

开始端口 结束端口
---------- --------
50000 50059 *
54364 54463
54664 54763
54764 54863
58922 59021
59022 59121
60791 60890

* - 管理的端口排除。

ipv4 可以替换为 ipv6tcp 可以替换为 udp

这列出了 Windows 中被保留的端口,这些端口是不能被用户绑定的,如果尝试绑定这些端口,会得到类似这样的错误:

1
listen tcp 127.0.0.1:50001: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

被保留的端口可能来自不同的来源,最常见的是 Hyper-V。

dynamicport

使用命令 netsh int ipv4 show dynamicport tcp 可以查看当前的 dynamicport 设置:

1
2
3
4
协议 tcp 动态端口范围
---------------------------------
启动端口 : 49152
端口数 : 16384

ipv4 可以替换为 ipv6tcp 可以替换为 udp

Hyper-V 在保留端口时只会选择 dynamicport 范围内的端口,所以我们可以通过调整 dynamicport 来解决端口被保留的问题。你可以在管理员权限下运行命令 netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range 来调整 dynamicport,例如 netsh int ipv4 set dynamic tcp start=50000 num=10000

需要注意的是:

  • 如果出现问题的程序可以通过配置来修改端口,那么你应该优先使用配置来修改端口,而不是调整 dynamicport
  • Hyper-V 不保留不代表其他程序不保留,其他程序可能并不尊重 dynamicport,大多数情况下问题能够被解决。
  • dynamicport 的范围不能太小。该端口范围用于在程序需要对外发起连接时分配临时端口,如果范围太小,可能会导致程序无法发起连接(即端口耗尽问题),且该问题通常很难被意识到。

参考资料

  1. StackOverflow - What is Administered port exclusions in windows 10?
  2. Microsoft Documentation - The default dynamic port range for TCP/IP has changed since Windows Vista and in Windows Server 2008
  3. Microsoft Documentation - Troubleshoot port exhaustion issues
  4. Microsoft Blog Archive - Port Exhaustion and You (or, why the Netstat tool is your friend)
作者

Cao Mingjun

发布于

2023-12-21

更新于

2023-12-21

许可协议

评论