反向 SSH 隧道远程方案

方案概述

通过反向 SSH 隧道,实现从外网笔记本远程 SSH 到公司内网主机。

复制代码
笔记本 ──→ 云服务器 (cloud.example.com:12222) ←── 反向隧道 ←── 公司主机 (Zeus)

公司主机主动向外连接云服务器,建立反向通道,绕过公司防火墙/内网限制。

环境信息

角色 地址 用户 备注
笔记本 macOS (MacBook Air) XX SSH 客户端
云服务器 cloud.example.com (x.x.x.x) root 阿里云 ECS,中转站
公司主机 10.x.x.x (内网) tsdl 主机名 Zeus,SSH 端口 22

配置详情

1. 云服务器 (cloud.example.com)

启用 GatewayPorts

让反向隧道监听在 0.0.0.0(公网),而非仅 localhost

bash 复制代码
# /etc/ssh/sshd_config
GatewayPorts yes

修改后重启 sshd:

bash 复制代码
systemctl restart sshd
阿里云安全组

入方向添加规则:

协议 端口 说明
TCP 12222 0.0.0.0/0 反向 SSH 隧道

2. 公司主机 (Zeus)

SSH 密钥(免密登录到云服务器)

生成密钥(如已有可跳过):

bash 复制代码
ssh-keygen -t rsa -b 4096

将公钥 ~/.ssh/id_rsa.pub 的内容添加到云服务器的 ~/.ssh/authorized_keys

反向隧道命令
bash 复制代码
autossh -M 0 -N -p 22 \
  -o "ServerAliveInterval=30" \
  -o "ServerAliveCountMax=3" \
  -o "StrictHostKeyChecking=no" \
  -o "ExitOnForwardFailure=yes" \
  -R 12222:localhost:22 root@cloud.example.com

参数说明:

参数 作用
-M 0 禁用 autossh 自身的监控端口,依赖 SSH 心跳
-N 不执行远程命令,仅做端口转发
-p 22 显式指定云服务器 SSH 端口(公司主机默认端口可能是 2222)
-R 12222:localhost:22 云服务器的 12222 端口 → 公司主机的 22 端口
ServerAliveInterval=30 每 30 秒发心跳包
ServerAliveCountMax=3 3 次心跳无响应则断开(触发 autossh 重连)
ExitOnForwardFailure=yes 端口绑定失败时退出(避免假连接)
systemd 服务(开机自启)

文件:/etc/systemd/system/ssh-reverse-tunnel.service

ini 复制代码
[Unit]
Description=Reverse SSH Tunnel to Cloud Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=tsdl
ExecStart=/usr/bin/autossh -M 0 -N -p 22 -o "ServerAliveInterval=30" -o "ServerAliveCountMax=3" -o "StrictHostKeyChecking=no" -o "ExitOnForwardFailure=yes" -R 12222:localhost:22 root@cloud.example.com
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

启用:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl enable ssh-reverse-tunnel.service
sudo systemctl start ssh-reverse-tunnel.service

3. 笔记本

SSH 配置

文件:~/.ssh/config

复制代码
Host company
    HostName cloud.example.com
    Port 12222
    User tsdl
使用
bash 复制代码
ssh company

免密直连公司主机。

连接流程

复制代码
1. 笔记本发起 ssh company
2. SSH 连接 cloud.example.com:12222(阿里云安全组放行)
3. 云服务器 12222 端口是公司主机建立的反向隧道
4. 流量通过隧道到达公司主机的 SSH (localhost:22)
5. 登录为 tsdl 用户

日常维护

bash 复制代码
# 查看隧道状态(在公司主机上)
sudo systemctl status ssh-reverse-tunnel

# 重启隧道
sudo systemctl restart ssh-reverse-tunnel

# 查看隧道日志
sudo journalctl -u ssh-reverse-tunnel -f

# 手动启动隧道(不用 systemd 时)
autossh -M 0 -f -N -p 22 -o "ServerAliveInterval=30" -o "ServerAliveCountMax=3" -o "ExitOnForwardFailure=yes" -R 12222:localhost:22 root@cloud.example.com

故障排查

现象 原因 解决
笔记本 ssh 超时 阿里云安全组未开放 12222 检查安全组入站规则
隧道断开 网络波动 autossh 会自动重连(10秒间隔)
隧道端口被占用 旧进程未退出 pkill -f "ssh.*-R 12222" 后重启
公司主机无法连云服务器 公司 /etc/ssh/ssh_config 默认端口不是 22 tunnel 命令中显式指定 -p 22
GatewayPorts 未生效 sshd 未重启 systemctl restart sshd
相关推荐
元启数宇1 小时前
机电设计AI不只是消防:给排水、暖通、强弱电如何进入自动化?
运维·人工智能·自动化
CHrisFC1 小时前
LIMS 系统 AI 建设路径:从自动化到智能化的演进之路
运维·人工智能·自动化
杰克逊的日记1 小时前
如何部署EDA工具及运维
运维·eda运维
码语智行1 小时前
常见nginx配置
运维·nginx
上海达策TECHSONIC1 小时前
零售ERP选型解析:SAP Business One 适配成长型零售企业的核心逻辑
大数据·运维·人工智能·云计算·运维开发·零售
蜡笔婧萱2 小时前
磁盘监控 + Web 服务巡检自动化脚本实训任务
运维·自动化
折哥的程序人生 · 物流技术专研2 小时前
Tomcat 严重警告:JDBC 驱动未注销 + 工作线程泄漏 —— 原因、影响与彻底修复(生产级终极指南)
java·运维·数据库·mysql·oracle·tomcat
Techblog of HaoWANG2 小时前
智巡守卫:多模态巡检智能体算法服务端设计与实现——基于Ollama+Qwen3.5的自动化巡检报告生成系统
运维·人工智能·算法·目标检测·自动化·边缘计算
hweiyu002 小时前
Linux命令:newgrp
linux·运维·服务器