SSH 反向隧道(Remote Port Forwarding)技术笔记
本文为开发调试技术笔记,仅用于合法的本地开发、联调测试场景。 ⚠️重要提示:请勿使用第三方公开中转服务,中转服务器必须为本人合法拥有的云服务器;严禁利用该技术绕过网络访问限制,不得用于任何违规用途。
一、什么是 SSH 反向隧道
SSH 端口转发分为两类:
-L本地端口转发:访问本机端口,流量转发到远程服务器;-R远程端口转发(反向隧道):访问远程服务器端口,流量回传到本机。
核心原理
内网机器主动向外建立 SSH 出站连接,外网不会主动发起连接到内网机器,以此解决内网环境没有公网 IP、无法做路由器端口映射的开发调试问题。
注意:该技术仅适合临时调试,不建议作为生产环境方案。
基础示例(自建云服务器作为中转)
ssh -R 8080:localhost:2023 root@你的云服务器公网IP
参数说明:
-R:远程端口转发,开启反向隧道;8080:中转云服务器上对外监听的端口;localhost:2023:流量最终转发到本机的 2023 端口;root@你的云服务器公网IP:自己的云服务器地址。
执行成功后,外网访问 云服务器IP:8080,流量会通过 SSH 加密隧道转发到本机 127.0.0.1:2023。
二、完整数据流流程
- 内网本机主动发起 SSH 连接,连接到自有云服务器 22 端口(出站连接,防火墙一般允许);
- 建立加密 SSH 长连接,云服务器监听
8080端口; - 外网客户端访问云服务器的
8080端口; - 流量经由已经建立好的 SSH 隧道回传给内网本机;
- 本机把请求交给本地
127.0.0.1:2023的业务服务; - 服务返回响应数据,沿同一条 SSH 隧道传回云服务器,再返回给外网客户端。
全部流量经过 SSH 加密传输,外网不会直接访问内网主机。
三、典型使用场景
- 本地项目对外演示:本地运行 Web 项目,无需部署到测试环境,给外部同事临时查看效果;
- Webhook 回调调试:第三方平台需要回调接口,本地环境没有公网地址,临时把本地接口暴露出去调试;
- 内网设备临时访问:内网的工控机、NAS 等设备,无公网 IP,临时对外提供 Web 管理页面;
- 跨网络联调:在外部网络访问内网业务系统,仅限合法临时调试。
限制:原生 SSH 反向隧道基于 TCP 协议,HTTP/HTTPS 需要服务端程序自行处理。
四、关键坑点:GatewayPorts
使用自建云服务器做中转时,默认情况下,
-R映射的端口只允许云服务器本机访问,外网无法访问。
原因:SSH 服务端配置默认:
GatewayPorts no
修改云服务器的 sshd 配置文件 /etc/ssh/sshd_config
GatewayPorts yes
修改完成后重启 ssh 服务生效:
sudo systemctl restart sshd
额外:云服务器防火墙需要放行转发使用的端口(本例 8080),否则外网依旧无法访问。
五、原生 SSH 的固有缺陷
- 终端关闭、电脑休眠、网络抖动,SSH 连接断开,隧道立刻失效;
- 长时间空闲,可能被服务端断开连接;
- 仅适合临时调试,严禁用于正式生产业务;
- 一旦把本地服务暴露到公网,如果服务没有鉴权,会面临扫描、爆破风险,禁止裸暴露数据库、后台管理系统。
六、持久化方案:autossh(Linux /macOS)
原生 ssh 断开就失效,可以使用autossh监控连接,断开后自动重连,实现隧道后台常驻。
1、安装 autossh
apt install autossh
2、配置 SSH 免密登录(必须,重连时不需要输入密码)
# 生成密钥
ssh-keygen -t rsa
# 将公钥推送至中转云服务器
ssh-copy-id root@你的云服务器公网IP
3、启动持久反向隧道
autossh -M 0 -N -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -R 8080:localhost:2023 root@你的云服务器公网IP
参数说明:
-M 0:关闭 autossh 自带监控端口,使用 SSH 内置保活机制;-N:只做端口转发,不打开远程 shell;ServerAliveInterval=15:每 15 秒发送心跳包保活;ServerAliveCountMax=3:连续 3 次心跳无响应,则断开并重连。
4、systemd 配置开机自启(可选)
新建服务文件 /etc/systemd/system/reverse-tunnel.service
[Unit]
Description=Reverse SSH Tunnel
After=network.target
[Service]
User=root
ExecStart=/usr/bin/autossh -M 0 -N -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -R 8080:localhost:2023 root@你的云服务器公网IP
Restart=always
[Install]
WantedBy=multi-user.target
加载配置并启用开机自启:
systemctl daemon-reload
systemctl enable --now reverse-tunnel
七、Windows 环境适配
Windows 原生没有 autossh:
- 可以使用 WSL 环境,在 WSL 内运行 autossh;
- 备选方案:frp,原生支持 TCP、HTTP,稳定性更好。
八、方案对比选型
表格
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| ssh‑R + 自建云服务器 | SSH 原生、无需额外安装软件、流量加密 | 连接容易断开,需要自有云服务器 | 临时开发调试、接口联调 |
| autossh + 自建云服务器 | 可自动重连,支持 TCP,完全可控 | 需要云服务器,配置步骤较多 | 需要长期运行的内网调试 |
| frp | 支持 TCP/HTTP,功能丰富,支持后台运行 | 需要部署服务端与客户端 | 自建内网穿透方案 |
九、常见问题排查
- 公网访问打不开:确认本机
127.0.0.1:2023服务正常运行; - 外网访问被拒绝:确认云服务器开启
GatewayPorts yes,防火墙放行对应端口; - 隧道频繁断开:调整 SSH 心跳参数,使用 autossh 实现自动重连。
十、安全注意事项
- 本技术只用于合法开发调试,不可用于正式线上业务;
- 对外暴露的服务必须配置账号密码鉴权,禁止裸奔;
- 数据库、管理后台等敏感服务,不建议通过隧道直接暴露公网