作者:SkyXZ

CSDN:SkyXZ~-CSDN博客

博客园:SkyXZ - 博客园

在校园网或者是家里的内网中,我们常常会遇到一个头疼的问题:两台设备明明都接入了网络,但当我离开内网之后却无法再远程访问其中的设备。这对我们想要远程调用 GPU 训练模型、远程开发调试、甚至只想从笔记本连回家中台式机的场景来说,简直就是“断网式打击”。

而最近我也遇到了类似的问题。由于有一个比较大的模型需要训练几天,如果直接在我自己的主力电脑上跑训练任务,那在训练过程中我基本就无法再做其他事情了——这显然不现实。好在我手上还有一台笔记本,具备一定的 GPU 算力,可以临时当作训练服务器使用。于是我有了一个想法:把这台笔记本部署成“GPU 服务器”,专门用来训练模型,而我则通过主力设备进行远程连接与监控。但很快我发现一个难题——这台笔记本在校园网的内网环境中,我根本无法从外部网络通过 SSH 访问它。更进一步地,我希望无论身处宿舍、家中,甚至外出,只要联网就能随时连接这台“GPU 小服务器”,查看训练状态、调整参数甚至重新启动训练任务。为此,我开始尝试一种解决方案:利用拥有公网 IP 的阿里云服务器作为“中转跳板”,借助 SSH 的反向隧道打通公网与内网之间的连接

┌──────────────┐ ssh -p 2222 root@公网IP

│ 设备 A │ ─────────────────────────────┐

│(任意地点) │ │

└──────────────┘ ▼

┌──────────────┐

│ 公网服务器 │

│(阿里云 ECS)│

└──────────────┘



ssh -R 2222:localhost:22 root@公网IP │

┌──────────────┐ │

│ 设备 B │──────────────────────────────┘

│(校园网 GPU)│

└──────────────┘

一、 拥有一台你的云服务器

想要做到内网穿透或者反向 SSH,首先你得要有一台具有公网 IP 的服务器。因为我们的目标是从外部访问一台处于内网(如校园网或家庭网)中的设备,而内网设备的 IP 是不能直接被外网访问到的。所以,我们需要借助这台 “中转服务器”,作为公网和内网之间的桥梁。我使用的阿里云的服务器,其链接如下:2025主会场_创新加速季 就上阿里云-阿里云创新加速季,如果你是新人的话最低68便可以拿下一个具有公网IP的双核40GB的服务器,可以说非常划算了;

购买了服务器之后我们进入控制台,左下角便可以看到你服务器的公网IP啦

接着我们点进服务器详情里,开放防火墙端口,否则即使你服务配置再完美,外部请求也会被服务器的安全机制拦下,我们将2222端口开放出来作为我们的反向 SSH 端口,当然这个端口大家可以随便选择,只要不与当前服务冲突即可

PS:若你使用了宝塔等面板,务必进入宝塔后台的【安全】→【防火墙】,同样添加对应的端口放行。否则即便阿里云层面放行了,系统依然可能拦截连接。

为了让反向 SSH 隧道可以正常绑定公网 IP 并对外可访问,我们还需要修改阿里云服务器上的 SSH 服务配置文件 —— /etc/ssh/sshd_config,默认情况下,SSH 服务只允许在本地接口上监听反向转发的端口,也就是说,就算你把设备 B 的 SSH 映射到了阿里云服务器的 2222 端口,外部设备 A 也无法通过公网连接进来。所以,我们要手动开启两个配置项,只需按照如下操作即可:

# Step-1 打开ssh配置文件
sudo nano /etc/ssh/sshd_config
# Step-2 找到以下两行,如果前面有 # 注释,请将其注释取消并将no改为yes,如果找不到,可以手动添加在文件末尾:
AllowTcpForwarding yes #允许 SSH 端口转发
GatewayPorts yes #允许反向端口绑定公网地址(否则只绑定 localhost)
# Step-3 重启 SSH 服务使配置生效
sudo systemctl restart sshd
# Step-4 检查服务是否监听对应端口
netstat -tlnp | grep 2222

如果运行了第四步之后看到了如下内容即代表配置成功:

tcp        0      0 0.0.0.0:2222        0.0.0.0:*           LISTEN      1234/sshd

二、设备端配置:反向 SSH 隧道的建立

完成了公网云服务器(阿里云)的准备和配置后,接下来就是在内网设备(设备 B)上发起连接,通过 SSH 隧道将自己的 SSH 服务“反向映射”到云服务器上,这一步的目标是:

让外部设备通过连接云服务器的某个端口,间接访问设备 B 的 SSH

在设备 B 上执行如下命令(假设设备 B 的 SSH 默认运行在 22 端口,阿里云服务器映射端口为 2222):

ssh -fN -R 0.0.0.0:2222:localhost:22 your_alicloud_user@your_alicloud_ip -p 22

解释一下这个命令的含义:

参数 含义
-f 在后台执行 SSH 连接
-N 不执行远程命令,只建立隧道
-R 建立反向端口转发:将远程服务器的 2222 端口映射到设备 B 的本地 22 端口
0.0.0.0:2222 代表映射监听公网地址(所有来源都能访问)
localhost:22 表示连接设备 B 本地的 22 端口
your_alicloud_user@your_alicloud_ip 阿里云服务器的登录信息
-p 22 指定阿里云服务器的 SSH 端口(默认是 22)

运行时会要求你输入阿里云服务器的密码,输入密码后主要不报错,没有信息打印是正常哒!

建议你配置 SSH 公钥免密登录,这样可以实现设备 B 开机后自动连接,后续也不会频繁输入密码。

而由于连接一旦断开,设备 B 的 SSH 隧道就会失效,所以推荐使用 autossh 工具 来自动重连。安装并使用如下:

sudo apt install autossh  # 或 yum install autossh
autossh -fN -R 0.0.0.0:2222:localhost:22 your_alicloud_user@your_alicloud_ip -p 22

你也可以将这条命令写入设备 B 的开机启动脚本(如 /etc/rc.local 或 Systemd 服务),实现开机自连。

三、实现远程登陆

要注意的是,这里的 IP 地址是阿里云服务器的公网 IP,而非设备 B 的 IP。用户名则是设备B的用户名,而非服务器的用户名。之所以可以连上设备 B,是因为它主动通过反向 SSH 隧道,把自己的 SSH 服务“映射”到了云服务器的 2222 端口上。我们相当于是通过云服务器,“绕过”了内网的限制,间接访问了设备 B。

ssh -p 2222 device_B_user@your_alicloud_ip

连接之后我们便可以直接使用或者是使用VScode进行开发啦!

无法直连 SSH?一招反向SSH搞定内网到公网的远程连接问题的更多相关文章

  1. 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则

    负载均衡-Nginx中文文档 http://www.nginx.cn/doc/example/loadbanlance.html 负载均衡 一个简单的负载均衡的示例,把www.domain.com均衡 ...

  2. 春节过后就是金三银四求职季,分享几个Java面试妙招,轻松搞定HR!

    春节过后就是金三银四,分享几个Java面试妙招,轻松搞定HR! 2020年了,先祝大家新年快乐! 今年IT职位依然相当热门,特别是Java开发岗位.软件开发人才在今年将有大量的就业机会.春节过后,金三 ...

  3. 端口被占用通过域名的处理 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则

    负载均衡-Nginx中文文档 http://www.nginx.cn/doc/example/loadbanlance.html 负载均衡 一个简单的负载均衡的示例,把www.domain.com均衡 ...

  4. SSH反向代理转发至内网msf

    前言 买了个便宜的 vps , 在上面装 msf 也装不上,于是想着把端口映射到内网来. 正文 拓扑如下: 首先在内网主机 B ssh -fCNR 7281:localhost:5000 root@C ...

  5. 搭建nginx反向代理用做内网域名转发

    先上一个我的正常使用的配置 location / { proxy_pass http://192.168.1.84:80; proxy_redirect off; proxy_set_header H ...

  6. 忘记MySQL密码怎么办?一招教你搞定!

    在安装完 MySQL 或者是在使用 MySQL 时,最尴尬的就是忘记密码了,墨菲定律也告诉我们,如果一件事有可能出错,那么它一定会出错.那如果我们不小心忘记了 MySQL 的密码,该如何处理呢?别着急 ...

  7. windows利用iis配置反向代理实现ECS内网互通oss

    IIS实现反向代理 新建两个站点,端口分别使用 80 和 81,在DNS中新建A记录,指向该计算机(10.4.34.41) 配置过程如下: 1.在Windows Server 2012 R2上 安装A ...

  8. nginx之十三:搭建 nginx 反向代理用做内网域名转发

      user www www;worker_processes 1;error_log logs/error.log;pid logs/nginx.pid;worker_rlimit_nofile 6 ...

  9. Nginx笔记总结十四: nginx反向代理,用内网域名转发

    user www www; worker_processes ; error_log logs/error.log; pid logs/nginx.pid; worker_rlimit_nofile ...

  10. SSH反向连接让外网也可远程访问内网机器

    最近把树莓派折腾了一番,放在了家里,但是家里是内网,出门在外,不方便直接ssh上来,于是请教了秦兄,指点迷津,发现SSH反向链接可以实现这个功能. 1. ssh反向链接的概念 A主机:外网,ip:11 ...

随机推荐

  1. RocketMq安装踩坑:docker0网桥冲突

    前言 最近项目用到了RocketMq,需要在Cento7系统上搭建一套集群环境用于测试.整个的环境搭建过程中,我遇到了一个比较初级的问题:启动RocketMq的broker失败.   问题经过 首先我 ...

  2. RabbitMQ 延迟任务(限时订单) 思路

    一.场景 我们经常会碰见,一个需求就是,发送一条指令(消息),延迟一段时间执行,比如说常见的淘宝当下了一个订单后,订单支付时间为半个小时,如果半个小时没有支付,则关闭该订单.当然实现的方式有几种,今天 ...

  3. BUUCTF---keyboard

    题目 ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr e ...

  4. AI穿上身:苹果手表如何改变你的生活?

    楔子:一个普通理工男的科技启示录 我是张三,一个标准的90后理工男.在这个日新月异的科技时代,我习惯用精密的逻辑和近乎机械的效率来审视世界.每天早上6点45分准时起床,每一分钟都被精确地规划,生活就像 ...

  5. JDK8-时间格式化类-时区类-工具类--java进阶day07

    1.时间格式化类:DateTimeFormatter 1.创建方式 使用DateTimeFormatter调用ofPattern方法即可 . 2.格式化方法 创建好DateTimeFormatter对 ...

  6. 【Ubuntu】在Ubuntu上配置Java环境

    [Ubuntu]在Ubuntu上配置Java环境 壹.前言 Java是运用得非常广泛的编程语言,在使用Linux时难免会碰到需要用到JDK的情况,故本文介绍如何在Ubuntu上配置Java21环境. ...

  7. 学习unigui【21】unistringGrid的标题栏动态增加

    var Column: TUniGridColumn; begin Column := TUniGridColumn(unstrngrd_summary.Columns.Add); Column.Ti ...

  8. DevSecOps的实现与相关开源工具

    DevSecOps的实现与相关开源工具 DevSecOps是一种以自动化方式在DevOps流程中集成安全工具的方法.DevSecOps不仅仅是引入新的安全工具,还包括关于使用这些工具的必要知识.这需要 ...

  9. AI提示词:通用 vscode linux c++ 项目CMakeLists和bulid模板

    AI提示词 写vscode linux c++20 的CMakeLists.txt文件.build.rebuild文件 这是多项目结构,目录结构如下: projs: │ build.sh 顶层buil ...

  10. app自动化的特殊操作

    一.截屏 File srcfile=driver.getScreenshotAs(OutputType.FILE); //得到截图源文件对象 File dstfile=new File("C ...