排查 SSH 客户端无法绑定转发端口的问题(Windows)

问题现象

在 Windows 10 中,使用 Bitvise SSH Client 配置本地代理转发端口(127.0.0.1:10800)时失败,报错:

Could not enable SOCKS/HTTP proxy forwarding on 127.0.0.1:10800: Address is already in use; bind() failed: Windows error 10013

排查步骤与命令记录

1. 检查是否有进程监听 10800(无结果)
# PowerShell 方式
Get-NetTCPConnection -LocalPort 10800 | Select-Object OwningProcess

# 或使用 netstat(CMD/PowerShell 均可)
netstat -ano | findstr :10800

→ 无输出,说明没有常规 TCP 监听。

2. 检查是否有隐藏的端口转发规则
netsh interface portproxy show all

→ 无输出,排除 portproxy 占用。

3. 使用 Process Explorer 深度扫描(GUI 工具)
  • 下载 Process Explorer
  • 以管理员身份运行 → Ctrl+F → 搜索 10800
    → 未发现任何句柄或线程绑定。
4. 关键一步:检查 Windows “排除端口范围”
netsh int ipv4 show excludedportrange protocol=tcp

输出示例(问题存在时):

开始端口    结束端口
----------    --------
     10745       10844   ← 10800 被包含在此区间!
     10845       10944
     ...

结论:端口 10800 被 Windows NAT 服务动态保留,普通程序无法绑定。


解决方案:重启 winnat 服务重置端口预留

适用于个人开发机,不影响日常使用。若使用 WSL2/Docker,操作后可能需重启相关服务。

# 以管理员身份运行 PowerShell

# 停止 Windows NAT Driver
net stop winnat

# 启动 Windows NAT Driver(会重建排除范围,通常大幅缩小)
net start winnat
验证是否生效:
netsh int ipv4 show excludedportrange protocol=tcp

正常输出(问题解决后):

开始端口    结束端口
----------    --------
        80          80
      5357        5357
     50000       50059     *

10745–11144 的“端口块” 范围已消失,这样所需的 10800 就可用了!


验证
  1. 重新连接 SSH,并启用本地代理转发到 127.0.0.1:10800
  2. 成功启动,无报错!

总结

问题根源Windows 自动将一些 端口段 加入“排除端口范围”
表象报“Address already in use”,但 netstat 查不到
核心命令netsh int ipv4 show excludedportrange protocol=tcp
快速修复net stop winnat && net start winnat

(Qwen3-Max 帮助整理文档与格式)