文章

更改 Hyper-V 保留占用端口

起因

我自己的习惯是用 WSL2 装 Docker 来管理和使用 Myslq,Redis 等服务。

今天写一个项目需要启动本地 Redis,端口是默认的 6379,host 填 localhost 。但怎么都连不上,报错是 Failed to connect to any host resolved for DNS name. 但是 host 填 WSL 的 ip 地址就可以正常使用

似乎 locahost 不能正确的解析到 WSL 的 ip 地址。但是 Mysql 的 3306 和 Nginx 的 80 端口却没有这个问题。

折腾了一下午,在仔细排查之后最终确定了问题所在——Hyper-V 保留端口占用

问题定位

Windows 中有一个 TCP 动态端口范围,处在这个范围内的端口,有时候会被一些服务占用。在 Windows Vista(或 Windows Server 2008)之前,动态端口范围是 1025 到 5000;在 Windows Vista(或 Windows Server 2008)之后,新的默认起始端口为 49152,新的默认结束端口为 65535。

如果安装了 Hyper-V,那么 Hyper-V 会为容器宿主网络服务(Windows Container Host Networking Service)随机保留一些端口号使用。

正常情况下,Hyper-V 虽然会在 TCP 动态端口范围 中随机挑一些端口号保留(占用),不过保留的端口号普遍比较大,就算保留几百、几千个也影响不大。但是,Windows 自动更新有时会出错,导致这个范围的起始端口被重置为 1024……这可就麻烦了,一些常用端口动不动就因为被保留而无法使用了。

使用命令 netsh int ipv4 show dynamicport tcp 可以查看目前 TCP 动态端口 的范围
将命令结尾的 tcp 换为 udp 可以查询 UDP 端口

PS C:\Users\airbo> netsh int ipv4 show dynamicport tcp

Protocol tcp Dynamic Port Range
---------------------------------
Start Port      : 1024
Number of Ports : 13977

这些端口只是可能会使用到的,可能今天没用到但明天就用到了
我们可以使用 netsh int ipv4 show excludedportrange protocol=tcp 命令查看当前端口占用情况

PS C:\Users\airbo> netsh int ipv4 show excludedportrange protocol=tcp

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
      1093        1192
      1438        1537
      1552        1651
      2212        2311
      5357        5357
      5426        5426
      6069        6168
      6369        6468
      6523        6622
      6623        6722
     11979       12078
     12079       12178
     12318       12417
     12418       12517
     12725       12824
     12825       12924
     50000       50059
     54235       54235
     54236       54236

* - Administered port exclusions.

可以看到刚好 6379 端口就在其中

解决方法

使用 netsh 可以命令调整这个端口预留范围

netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

起始端口为数字,端口总数为范围。可以将其调整到 30000 开始,个数还是 13977 歌。

PS C:\Users\airbo>  netsh int ipv4 set dynamic tcp start=30000 num=13977
Ok.

PS C:\Users\airbo>  netsh int ipv6 set dynamic tcp start=30000 num=13977
Ok.

PS C:\Users\airbo> netsh int ipv4 show dynamicport tcp

Protocol tcp Dynamic Port Range
---------------------------------
Start Port      : 30000
Number of Ports : 13977

最后 重启电脑就可以了


参考文章

License:  CC BY 4.0