问题情况

最近发现 VirtualBox 以前可以工作的端口映射连不上了,查看 netstat 输出并没有看到端口占用,不知道是不是某次系统更新后造成的,还是我之前因为解决某个问题引入的新问题。
image.png
查看 VirtualBox 日志发现映射的端口报错,尝试更改监听端口到其他范围后可以工作,说明 VirtualBox 本身没有问题。
网上查了下发现又跟系统配置有关,Windows 自己保留了一部分端口,关键我没配置过之前也跑得好好的,突然就不能用了,搞得问题莫名其妙。
image.png
通过命令 netsh int ipv4 show excludedportrange tcp 查看被系统保留的部分端口,20022 刚好就在其中。

解决问题

方法1:添加端口排除项

本来想直接添加端口排除项,执行后提示“另一个程序正在使用此文件,进程无法访问。”,即使停止 Windows NAT Driver 服务也不行,看来还需要把占用的进程先结束,所以在不重启系统的情况下,想要添加端口排除项还不是那么方便(没提示是哪个进程占用,猜测是 Hyper-V)。
下面是个临时方法,停止 Windows NAT Driver 服务后直接重新监听需要的端口即可。

  1. # 停止 Windows NAT Driver 服务
  2. net stop winnat
  3. # 监听自己需要的端口
  4. # 重新启动 Windows NAT Driver 服务
  5. net start winnat

如果可以找到并停止占用端口的进程,在结束掉进程后可以添加端口排除项:

  1. # 排除 20000-39999 端口范围
  2. netsh int ipv4 add excludedportrange tcp startport=20000 numberofports=20000

方法2:更改动态端口范围

image.png
通过命令 netsh int ipv4 show dynamicport tcp 查看动态端口范围,更改此设置让动态端口范围不包含自己需要使用的监听端口范围即可,此方法需要重启系统。

  1. # 将动态端口范围更改为 40000-65535
  2. netsh int ipv4 set dynamicport tcp start=40000 num=25536

参考