SSH反向隧道是远程维护首选方案,因其零依赖、强加密、22端口穿透率高;需中间服务器启用GatewayPorts yes、放行映射端口,并用systemd+心跳保活确保稳定。

直接用 ssh -R 做反向隧道,不依赖第三方服务、不改防火墙、不买云主机,但必须有一台能被外网访问的中间服务器(比如阿里云ECS、腾讯云轻量应用服务器,甚至一台老树莓派挂公网IP也行)。
为什么不用frp/natapp而选SSH反向隧道
因为你的目标是「远程维护」,不是长期暴露Web服务。SSH反向隧道天然加密、免认证中继、自带心跳保活,且所有流量走22端口——几乎不会被企业防火墙或校园网拦截。frp这类工具要额外开7000、6000等端口,云厂商安全组一拦就全崩;natapp免费版端口随机,脚本无法固化连接。
常见错误现象:channel 1: open failed: connect failed: Connection refused —— 这通常不是SSH问题,而是你漏了中间服务器上的 GatewayPorts yes 配置,导致它拒绝把收到的反向端口请求转发给内网机器。
- 必须确保中间服务器(跳板机)的
/etc/ssh/sshd_config包含:GatewayPorts yes,然后sudo systemctl restart sshd - 中间服务器的防火墙(如
ufw或云平台安全组)需放行你打算映射的端口(例如60022),不是22端口 - 内网机器执行命令时,
ssh -R的目标地址必须写中间服务器的公网IP或域名,不能写localhost或内网IP
如何启动稳定可用的SSH反向隧道
在内网机器上运行这条命令即可把本地22端口“推”到中间服务器的60022端口:
ssh -fNTR 60022:localhost:22 user@jump-server-ip -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes
说明:-f 后台运行,-N 不执行远程命令,-T 禁用伪终端,-R 是反向端口绑定。关键参数:
-
60022:localhost:22表示:中间服务器的60022端口 → 内网机器的22端口 -
ServerAliveInterval=30每30秒发一次心跳,防运营商NAT超时断连 -
ExitOnForwardFailure=yes一旦端口绑定失败(比如60022已被占用),进程立即退出,方便systemd或supervisor重试 - 不要加
-o StrictHostKeyChecking=no—— 它会埋下中间人攻击隐患,首次连接应手动确认指纹
怎么让外网用户真正连上这台内网机器
外网用户只需执行普通SSH命令,目标是中间服务器的映射端口:
ssh -p 60022 user@jump-server-ip
注意:这里的 user 是内网机器上的用户名,不是中间服务器的。整个链路是:外网用户 → 中间服务器60022 → 反向隧道 → 内网机器22 → 内网用户shell。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
容易踩的坑:
- 如果中间服务器开了SELinux,可能需要执行:
sudo setsebool -P ssh_sysadm_login on,否则反向端口无法绑定 - 某些云厂商(如华为云)默认关闭了
net.ipv4.ip_forward,虽然SSH反向隧道不依赖IP转发,但若你后续想扩展HTTP服务,得提前打开 - 别把
remote_port设成1–1024范围(如22),非root用户无法监听,且多数云平台禁止低编号端口入站
如何保证反向隧道永不掉线
单纯后台运行不够。网络抖动、中间服务器重启、SSH守护进程崩溃都会中断连接。推荐用 systemd 托管:
新建 /etc/systemd/system/ssh-reverse-tunnel.service:
[Unit] Description=SSH Reverse Tunnel to Jump Server After=network.target [Service] Type=simple User=your-local-user ExecStart=/usr/bin/ssh -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes -o ConnectTimeout=10 -R 60022:localhost:22 user@jump-server-ip Restart=always RestartSec=10 StartLimitInterval=0 [Install] WantedBy=multi-user.target
启用并启动:
sudo systemctl daemon-reload sudo systemctl enable ssh-reverse-tunnel.service sudo systemctl start ssh-reverse-tunnel.service
验证是否存活:sudo systemctl status ssh-reverse-tunnel,看到 active (running) 即可。
真正麻烦的是密钥管理——别用密码登录跳板机。生成免密密钥对后,用 ssh-copy-id 推上去,并在 ExecStart 中加 -i /home/your-user/.ssh/id_rsa_tunnel 指定专用密钥文件。否则systemd拉起时无法交互输密码,隧道永远启不来。

















