---
url: /blog/xt5b69jd/index.md
---
## `netstat -ano | findstr ":<port>"`没找到指定端口占用的进程

stackoverflow 对此类似问题的讨论：

* http://stackoverflow.com/questions/56705440/listen-eacces-permission-denied-0-0-0-08080
* https://stackoverflow.com/questions/54010365/how-to-see-what-is-reserving-ephemeral-port-ranges-on-windows

关于这个问题的描述和解决方案：

### 调查并释放端口

看起来 Hyper-V 会随机保留某些端口（或至少与 Hyper-V 相关）。使用命令`netsh int ip show excludedportrange protocol=tcp`确认无法使用的端口是否出现在输出列表中。

以下方法成功帮我释放了端口，操作并不复杂（25 人点赞）：\
这个问题通常由 Windows NAT 驱动（winnat）引起，停止并重启该服务可能解决问题：

```bash
net stop winnat
docker start ...
net start winnat
```

> \[!TIP]
> 这里使用管理员权限运行，我使用`net stop winnat && net start winnat`解决了问题

完成后端口不再被占用，但我的 WSL2 终端失去了网络连接，因此需要重启以恢复所有功能。

### 永久保留指定端口

若不采取进一步措施，问题可能重现。例如，为未来使用保留端口 9012 和 9013（防止 winnat 占用）：

```bash
netsh int ipv4 add excludedportrange protocol=tcp startport=9012 numberofports=2
```

```
netsh int ipv4 add excludedportrange protocol=tcp startport=8080 numberofports=1 store=persistent
```

（感谢@Venryx 提醒）

### 其他解决方案

在一个关于 Docker 无法开放端口的问题中（24 人点赞），此方法同样有效：

```bash
netcfg -d  # 此命令会清理所有网络设备，需重启系统
```

但有用户警告（4 人点赞），效果可能因人而异。我未注意到以下警告就执行成功了：

> `netcfg -d`是危险命令，它损坏了我的 Docker 且无法启动，甚至重装 HyperV 和重启机器也无济于事。该命令似乎删除了多个网络适配器，重置容器和镜像后还引发了新问题。

另一个高赞回答（129 人点赞）提供了更复杂的方案，我未尝试：

@veqryn 的临时解决方案步骤如下：

1. 禁用 Hyper-V（需多次重启）：

```bash
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
```

2. 完成重启后，永久保留目标端口（防止 Hyper-V 回收）：

```bash
netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1 store=persistent
```

3. 重新启用 Hyper-V（需多次重启）：

```bash
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
```

系统恢复后即可成功绑定端口。
