当前位置: 首页 > news >正文

实验室服务器远程访问终极方案:SSH 反向隧道 + systemd 自动重连

🚀 实验室服务器远程访问终极方案:SSH 反向隧道 + systemd 自动重连

适用于:

  • 没有公网 IP 的实验室服务器
  • 想用 VSCode / SSH / Jupyter 远程开发
  • 希望稳定、自动重连、开机自启

🧠 一、问题背景

在很多实验室环境中:

  • GPU 服务器(内网机器)❌ 没有公网 IP
  • 无法直接 SSH ❌
  • 无法用 VS Code Remote ❌
  • Jupyter / TensorBoard 无法访问 ❌

但通常:

👉 可以访问外网(主动连接)


💡 二、核心思路(关键!)

我们引入一台有公网 IP 的云服务器作为“跳板机”。

实验室服务器 C  --->  云服务器 B  <---  本地电脑 A(主动连接)

核心技术:

👉 SSH 反向隧道(Reverse SSH Tunnel)

本质一句话:

让内网服务器主动“把自己暴露”到公网。


⚙️ 三、环境准备

1️⃣ 云服务器 B(阿里云等)

确保 SSH 配置允许端口转发:

sudo vim /etc/ssh/sshd_config

修改为:

AllowTcpForwarding yes
GatewayPorts yes

重启 SSH:

sudo systemctl restart sshd

2️⃣ 开放安全组端口

在云服务器控制台开放:

TCP 12345

3️⃣ 实验室服务器 C

准备 SSH 私钥:

chmod 600 /root/.ssh/aliyun.pem

测试连接:

ssh -i /root/.ssh/aliyun.pem root@47.104.XXX.XXX

🔌 四、建立反向 SSH 隧道

在实验室服务器执行:

ssh -i /root/.ssh/aliyun.pem \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=3 \
-o ExitOnForwardFailure=yes \
-NR 0.0.0.0:12345:localhost:22 \
root@47.104.XXX.XXX

🔍 参数解释

参数 含义
-R 远程端口转发
12345 云服务器开放端口
localhost:22 映射到本机 SSH
-N 不执行命令
ServerAliveInterval 心跳保活
ExitOnForwardFailure 转发失败直接退出

🧪 五、验证连接

在云服务器 B:

ss -tln | grep 12345

应看到:

0.0.0.0:12345

在本地电脑 A:

ssh -p 12345 用户名@47.104.XXX.XXX

连接成功 🎉


🔄 六、实现自动重连 + 开机自启(关键)

使用 systemd 创建服务。


1️⃣ 创建服务文件

sudo nano /etc/systemd/system/reverse-ssh.service

写入:

[Unit]
Description=Persistent reverse SSH tunnel
After=network-online.target
Wants=network-online.target[Service]
Type=simple
User=root
ExecStart=/usr/bin/ssh \-i /root/.ssh/aliyun.pem \-o StrictHostKeyChecking=accept-new \-o ServerAliveInterval=30 \-o ServerAliveCountMax=3 \-o ExitOnForwardFailure=yes \-o TCPKeepAlive=yes \-N -R 0.0.0.0:12345:localhost:22 \root@47.104.XXX.XXX
Restart=always
RestartSec=10[Install]
WantedBy=multi-user.target

2️⃣ 启动服务

sudo systemctl daemon-reload
sudo systemctl enable reverse-ssh
sudo systemctl start reverse-ssh

3️⃣ 查看状态

systemctl status reverse-ssh

💻 七、VS Code 远程连接

编辑本地 SSH 配置:

~/.ssh/config
Host labHostName 47.104.XXX.XXXPort 12345User 实验室用户名

VS Code Remote SSH 直接连接:

lab

🌐 八、扩展:Jupyter / TensorBoard / Web服务

修改 service:

ExecStart=/usr/bin/ssh \-i /root/.ssh/aliyun.pem \-o ServerAliveInterval=30 \-o ServerAliveCountMax=3 \-N \-R 0.0.0.0:12345:localhost:22 \-R 0.0.0.0:8888:localhost:8888 \-R 0.0.0.0:6006:localhost:6006 \root@47.104.XXX.XXX

对应服务

端口 服务
12345 SSH
8888 Jupyter
6006 TensorBoard

访问方式:

http://47.104.XXX.XXX:8888

🧩 九、常见问题

❓ Q1:必须有公网 IP 吗?

❌ 不需要
✅ 只需要能访问外网


❓ Q2:为什么连接不上?

常见原因:

  • 没开 GatewayPorts yes
  • 安全组没放行端口
  • 端口被占用

❓ Q3:为什么端口是 127.0.0.1?

👉 没开启公网绑定

解决:

GatewayPorts yes

🔥 十、最终效果

你将获得:

能力 是否支持
SSH 远程
VS Code Remote
Jupyter
TensorBoard
HTTP 服务
自动重连
开机自启

🧠 总结

👉 systemd + SSH 反向隧道 = 实验室远程访问标准方案

http://www.jsqmd.com/news/575420/

相关文章:

  • Java结构化并发性能翻倍实录:从CompletableFuture到StructuredTaskScope的4步重构法
  • Courant-Fischer 定理:从特征值到奇异值的几何视角
  • 探索NVIDIA Profile Inspector:从入门到精通的显卡配置与优化全面指南
  • EPM系统多少钱?2026年价格对比+实施费用拆解 - 冠融盈科
  • 从零配置一个Radius服务器:基于FreeRADIUS的802.1x无线认证实战(含排错记录)
  • 如何通过WeChatMsg实现微信聊天记录永久保存:本地化数据管理创新解决方案
  • VS2022里NX/UG二次开发模板不显示?别慌,手把手教你修复NX Wizard(附环境变量设置)
  • Graphormer部署教程:Docker容器化封装与Kubernetes集群调度实践
  • 利用快马平台快速构建极域电子教室部署原型:一键生成环境检测与安装脚本
  • OpenLayers地图动画进阶:飞机航线牵引线效果实现原理详解
  • 利用mimikatz离线破解Windows SAM文件中的用户密码哈希
  • jqktrader:量化交易自动化的技术革新与突破
  • 告别调参玄学:用Python手把手复现红外小目标检测的LCM算法(附完整代码)
  • 7大场景赋能:FileMeta让文件元数据管理效率提升300%
  • 蓝牙SDP协议实战:从服务发现到高效连接的实现路径
  • 从LC到晶体:振荡器电路实战与性能深度对比
  • 3步解锁RTX显卡潜力:DLSS Swapper让游戏性能提升50%的秘密武器
  • Visual C++运行库深度修复指南:从问题诊断到系统优化
  • RabbitMQ 3.13.0实战:5分钟搞定MQTT 5.0协议配置与特性测试(附Docker命令)
  • 实时风控系统如何用Mojo重写Python核心模块,又不丢失Scikit-learn生态?——某Top3支付机构生产环境全链路复盘
  • 网站内容优化有哪些SEO工具
  • DAB SG(信号发生器)的频道与频率设置详解
  • LaTeX简历模板定制指南:从零开始打造专业简历
  • 利用快马ai快速构建openclaw局域网访问工具原型
  • S32K144开发板从S32DS迁移到Keil5.35的完整避坑指南(附文件路径清单)
  • 跨平台实战:Java集成GDAL从Windows到Docker的完整部署指南
  • VVC/VTM编码分析进阶:如何利用DecoderAnalyserApp深度解读CU划分与语法元素
  • 3步轻松解密:ncmdumpGUI帮你解决网易云音乐NCM格式跨平台播放难题
  • 基于Transformer的CasRel模型原理详解与源码剖析
  • Photon光影包:颠覆级Minecraft视觉体验的沉浸式渲染方案