SSH 反向隧道(Remote Port Forwarding)技术笔记

SSH 反向隧道(Remote Port Forwarding)技术笔记

本文为开发调试技术笔记,仅用于合法的本地开发、联调测试场景。 ⚠️重要提示:请勿使用第三方公开中转服务,中转服务器必须为本人合法拥有的云服务器;严禁利用该技术绕过网络访问限制,不得用于任何违规用途。

一、什么是 SSH 反向隧道

SSH 端口转发分为两类:

  1. -L 本地端口转发:访问本机端口,流量转发到远程服务器;
  2. -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

二、完整数据流流程

  1. 内网本机主动发起 SSH 连接,连接到自有云服务器 22 端口(出站连接,防火墙一般允许);
  2. 建立加密 SSH 长连接,云服务器监听 8080 端口;
  3. 外网客户端访问云服务器的 8080 端口;
  4. 流量经由已经建立好的 SSH 隧道回传给内网本机;
  5. 本机把请求交给本地 127.0.0.1:2023 的业务服务;
  6. 服务返回响应数据,沿同一条 SSH 隧道传回云服务器,再返回给外网客户端。

全部流量经过 SSH 加密传输,外网不会直接访问内网主机。

三、典型使用场景

  1. 本地项目对外演示:本地运行 Web 项目,无需部署到测试环境,给外部同事临时查看效果;
  2. Webhook 回调调试:第三方平台需要回调接口,本地环境没有公网地址,临时把本地接口暴露出去调试;
  3. 内网设备临时访问:内网的工控机、NAS 等设备,无公网 IP,临时对外提供 Web 管理页面;
  4. 跨网络联调:在外部网络访问内网业务系统,仅限合法临时调试。

限制:原生 SSH 反向隧道基于 TCP 协议,HTTP/HTTPS 需要服务端程序自行处理。

四、关键坑点:GatewayPorts

使用自建云服务器做中转时,默认情况下,-R 映射的端口只允许云服务器本机访问,外网无法访问

原因:SSH 服务端配置默认:

复制代码
GatewayPorts no

修改云服务器的 sshd 配置文件 /etc/ssh/sshd_config

复制代码
GatewayPorts yes

修改完成后重启 ssh 服务生效:

复制代码
sudo systemctl restart sshd

额外:云服务器防火墙需要放行转发使用的端口(本例 8080),否则外网依旧无法访问。

五、原生 SSH 的固有缺陷

  1. 终端关闭、电脑休眠、网络抖动,SSH 连接断开,隧道立刻失效;
  2. 长时间空闲,可能被服务端断开连接;
  3. 仅适合临时调试,严禁用于正式生产业务
  4. 一旦把本地服务暴露到公网,如果服务没有鉴权,会面临扫描、爆破风险,禁止裸暴露数据库、后台管理系统。

六、持久化方案: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:

  1. 可以使用 WSL 环境,在 WSL 内运行 autossh;
  2. 备选方案:frp,原生支持 TCP、HTTP,稳定性更好。

八、方案对比选型

表格

方案 优点 缺点 适用场景
ssh‑R + 自建云服务器 SSH 原生、无需额外安装软件、流量加密 连接容易断开,需要自有云服务器 临时开发调试、接口联调
autossh + 自建云服务器 可自动重连,支持 TCP,完全可控 需要云服务器,配置步骤较多 需要长期运行的内网调试
frp 支持 TCP/HTTP,功能丰富,支持后台运行 需要部署服务端与客户端 自建内网穿透方案

九、常见问题排查

  1. 公网访问打不开:确认本机 127.0.0.1:2023 服务正常运行;
  2. 外网访问被拒绝:确认云服务器开启GatewayPorts yes,防火墙放行对应端口;
  3. 隧道频繁断开:调整 SSH 心跳参数,使用 autossh 实现自动重连。

十、安全注意事项

  1. 本技术只用于合法开发调试,不可用于正式线上业务;
  2. 对外暴露的服务必须配置账号密码鉴权,禁止裸奔;
  3. 数据库、管理后台等敏感服务,不建议通过隧道直接暴露公网