SSH 远程端口转发
将远程服务器端口的流量转发到本地网络,常用于将本地开发服务暴露到公网
语法
ssh -R [bind_address:]remote_port:target_host:target_port [user@]ssh_server
参数
| 参数 | 说明 | 示例 | 级别 |
|---|---|---|---|
-R |
远程端口转发 | ssh -R 8080:localhost:3000 user@host |
常用 |
-N |
不执行远程命令 | ssh -NR 8080:localhost:3000 user@host |
常用 |
-f |
后台运行 | ssh -fNR 8080:localhost:3000 user@host |
常用 |
GatewayPorts |
服务端配置,允许绑定非 localhost | GatewayPorts yes # 在 sshd_config 中 |
进阶 |
bind_address |
远程绑定地址 | ssh -R 0.0.0.0:8080:localhost:3000 user@host |
进阶 |
示例
暴露本地 Web 服务到公网
ssh -NR 8080:localhost:3000 user@public-server
外网访问 public-server:8080 即可看到本地 3000 端口的服务
让同事访问你的本地开发环境
ssh -NR 9000:localhost:5173 user@shared-server
同事访问 shared-server:9000 看到你本地的 Vite 开发服务器
远程调试本地服务
ssh -fNR 5005:localhost:5005 user@test-server
测试服务器可以连接你本地的调试端口
配合 GatewayPorts 绑定所有接口
# 服务端 /etc/ssh/sshd_config 添加: # GatewayPorts yes ssh -NR 0.0.0.0:80:localhost:3000 user@server
默认只绑定 127.0.0.1,需要 GatewayPorts 才能绑定公网 IP
常见错误
Warning: remote port forwarding failed for listen port
远程端口被占用或没有权限(<1024 需要 root),换端口或用 sudo
远程转发不可从外网访问
默认只绑定 localhost,需要在 sshd_config 设置 GatewayPorts yes 并重启 sshd
技巧
- 远程转发记忆:-R 远程端口:本地地址:本地端口,数据从「远程」流向「本地」
- 需要服务端开启 GatewayPorts yes 才能让外部访问转发端口
- 生产环境建议用 ngrok/frp 等专业工具代替 SSH 远程转发