更改 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
最后 重启电脑就可以了
参考文章