windows下用ssh命令行实现端口转发的核心是ssh -l(本地)或ssh -r(远程),需确保openssh客户端已安装、远程ssh服务可达、端口未被占用,并正确指定本地/目标地址与端口。
在 windows 下用命令行配 ssh 端口转发,核心就是用 ssh 命令加 -l(本地)或 -r(远程)参数。不需要装图形工具,cmd 或 powershell 就能搞定,关键是参数写对、端口没被占、ssh 连得通。
先确认基础条件
动手前这几件事必须完成:
- 确保远程服务器已开启
sshd服务,且你能用ssh user@host正常登录(输密码或走密钥都行) - 本地 Windows 已安装 OpenSSH 客户端:Win10 1809+ 和 Win11 默认自带,打开 PowerShell 输入
ssh -V能看到版本即表示可用;若无,可去“设置 → 应用 → 可选功能”中添加“OpenSSH 客户端” - 记清楚要用的几个地址和端口:SSH 服务器 IP/域名、用户名、本地空闲端口(如 8080)、目标服务地址(如
localhost:3306或192.168.1.100:80) - 检查本地端口是否被占用:PowerShell 中运行
netstat -ano | findstr :8080,无输出说明可用
配置 SSH 本地端口转发(最常用)
适用场景:你在本地想安全访问远程服务器上“只限本机访问”的服务,比如数据库(127.0.0.1:3306)、开发 Web(localhost:5000)或内网后台。
命令格式:
ssh -N -f -L [本地地址:]本地端口:目标地址:目标端口 用户名@SSH服务器IP [-p 端口号]
-
-N:不执行远程命令,只建隧道 -
-f:连接成功后转入后台运行(避免占着窗口) -
-L后面是关键:本地端口:目标地址:目标端口,其中“目标地址”是从 SSH 服务器视角看的——比如填localhost,指的就是服务器自己;填192.168.1.100,就是服务器能访问的另一台内网机器 -
[-p 端口号]是可选的,当 SSH 服务不是默认 22 端口时才加,例如-p 50203
示例(访问远程服务器本机的 MySQL):
ssh -N -f -L 3306:localhost:3306 user@1.2.3.4
执行后输入密码,无报错即建立成功。接着你本地用 MySQL 客户端连 localhost:3306,实际就访问到了远程服务器的 3306 服务。
如果想让局域网其他设备也能通过你的 Windows 访问这个端口,把 -L 3306:... 改成 -L 0.0.0.0:3306:...,但需确保 Windows 防火墙放行该端口。
通过 handsfree-windows CLI控制 Windows 本机应用 (UIA) 和浏览器 (Playwright) 的引导技能,用于自动化或测试桌面应用。
配置 SSH 远程端口转发(外网访问内网服务)
适用场景:你有一台没有公网 IP 的 Windows 电脑(比如在家),想让外网用户通过一台有公网 IP 的云服务器,访问你本地跑的服务(如 Web 服务、NAS 管理页)。
命令格式:
ssh -N -f -R [远程绑定地址:]远程端口:本地地址:本地端口 用户名@公网服务器IP [-p 端口号]
-
-R表示远程端口转发,“远程”指公网服务器,“本地”指你当前这台 Windows - 默认情况下,远程服务器只监听
127.0.0.1,外网访问不了。要让别人能从公网访问,需两步配合:
① 在命令中写-R 0.0.0.0:8080:localhost:80(绑定到所有接口)
② 在公网服务器的/etc/ssh/sshd_config中设置GatewayPorts yes并重启sshd - Windows 上的“本地地址”一般写
localhost或127.0.0.1,对应你本机上正在运行的服务端口(如80、3000)
示例(将本机 80 端口服务暴露到公网服务器的 8080 端口):
ssh -N -f -R 0.0.0.0:8080:localhost:80 user@vps.example.com
成功后,别人访问 vps.example.com:8080,流量就会经 SSH 隧道到达你 Windows 的 localhost:80。
注意:若公网服务器没有固定 IP 或你无法改其 SSH 配置,建议搭配花生壳等内网穿透工具,它会自动分配动态域名并处理 NAT 映射,比纯 SSH -R 更省心。
验证与管理隧道
隧道建好不等于一直稳,日常要会查、会停、会重连:
-
查是否运行:PowerShell 中运行
Get-Process ssh,能看到后台的 ssh 进程 -
手动终止:找到进程 ID(PID),执行
Stop-Process -Id PID号;或更简单——直接关掉启动它的 PowerShell 窗口(前提是没加-f) -
测试连通性:本地转发后访问
http://localhost:端口号或用 telnet 测试;远程转发后,在公网服务器上执行curl http://localhost:8080看能否通到你本地 -
避免断连:可在命令末尾加
-o ServerAliveInterval=30,让客户端每 30 秒发一次保活包










