问题

前段时间在外地没有在实验室,随身携带了一个笔记本电脑。但是笔记本性能不够,想用SSH远程连接实验室的电脑。问如何连接?现有以下设备

设备 IP 备注 系统
实验室电脑C1 192.168.0.24 内网,可访问外网。SSH登陆端口为321。 Linux
笔记本电脑A1 动态变化 无公网IP Linux、win
云端服务器B1 113.4.67.278 有公网IP Linux

目标:

访问实验室电脑C1321端口。

解决办法:

  1. 如果局域网共用一个公网IP(此公网IP可以在外网访问),且可以操作实验室的路由器,可以在路由器上添加端口映射。这样可以通过直接访问公网IP的虚拟端口,访问到局域网内的电脑。

    但是很遗憾笔者实验室的公网IP被学校的防火墙拦住了,无法在外网直接访问。

  2. 借助各种内网穿透的软件,但是题主没有找到一个鲁棒可靠的软件。实在要推荐一个那就 ngrok

  3. SSH远程端口转发访问局域网电脑,此方法需要一个中转服务器(有公网IP)。

前面两种方法本文就不展开介绍了,主要介绍第三种方法。

SSH远程端口转发

所谓远程端口转发,就是将发送到远程端口的请求,转发到目标端口。这样就可以通过访问远程端口,来访问目标端口的服务。

通常,本地主机是没有独立的公网IP的,它与同一网络中的主机共享一个IP。没有公网IP,云主机是无法访问本地主机上的服务的。

通过远程转发,我们就可以通过访问云主机B1XXX端口来访问实验室主机C1321端口。

使用-R属性,就可以指定需要转发的端口,语法是这样的:

-R 远程网卡地址:远程端口:目标地址:目标端口

实现

实验室主机C1上操作

ssh -fCNR port:localhost:321 root@113.4.67.278
# 远程网卡地址可省略,表示绑定了C1的所有网卡
# port : 自定义一个端口,如1321
# 321 : 实际想访问的本地端口
# root和ip地址根据实际情况改写 # -f : 表示SSH连接在后台运行
# -C : 表示压缩数据传输
# -N : 用于端口转发,表示建立的SSH只用于端口转发,不能执行远程命令
# -R : 指定远程端口转发

通过远程转发,我们可以直接通过SSH在云端服务器B1上登录C1

ssh -p 1321 name@localhost
# name改写成C1的用户名

但是我们还不能在A1上直接登录C1,还要在B1电脑上操作:

sudo echo 'GatewayPorts yes' >> /etc/ssh/sshd_config
sudo service ssh restart
# GatewayPorts yes确保外网也能访问这个1321这个监听端口,而不是只能被localhost访问。

这样我们就可以直接在A电脑访问C电脑了:

ssh -p 1321 name@113.4.67.278
# name改写成C1的用户名

存在问题

  1. ssh会因为超时而关闭,因此不稳定
  2. 开关机之后通道就不存在了,因此还要设置开机自启

为了解决两个问题我采用了crontab。通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。

C1密钥连接B1

因为每次ssh远程转发,都需要输入B1的用户密码,因此要设置密钥连接,省去输入密码的过程。

C1上操作

ssh-copy-id -i keyfile nameB1@113.4.67.278
# -i keyfile keyfile指定公钥文件上传到B1上,也可以不指定
# nameB1 B1用户名

cron

在Linux系统中,计划任务一般是由 cron 承担,我们可以把 cron 设置为开机时自动启动。

/sbin/service cron start //启动服务
/sbin/service cron stop //关闭服务 /sbin/service cron restart //重启服务
/sbin/service cron reload //重新载入配置

cron可以让系统在指定的时间,去执行某个指定的工作,我们可以使用 crontab 指令来管理cron机制

crontab 参数

usage:	crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
(default operation is replace, per 1003.2)
-u 指定用户,不指定用户就默认自身
-e (edit user's crontab) (使用预设的编辑器,开启crontab并编辑)
-l (list user's crontab) (列出crontab中的内容)
-r (delete user's crontab) (移除crontab)
-i (prompt before deleting user's crontab) (移除crontab,不过会再确认一下)

语法示例

分(0-59) 时(0-23) 日期(1-31) 月(1-12) 星期(0-7)(0和7都是周天)
*/5 * * * * 每五分钟执行
0-5 * * * * 每小时的前五分钟执行
0,1 * * * * 每小时的前两分钟执行
0 * * * * 0分时执行,即每小时执行一次
0 0 * * * 0时0分时执行,即每天执行一次
0 0 1 * * 1号0时0分时执行,即每月执行一次
* : 代表取值范围内的所有数字
/ : 代表“每”
- : 代表从某数字到某数字
, : 代表分开几个离散的数字

因此我们定时执行ssh远程转发,就可以确保连接的稳定性。

# 编辑crontab
crontab -e
# 添加命令
*/10 * * * * ssh -fCNR 1321:localhost:321 root@113.4.67.278
# 开机自启
systemctl enable --now cron

至此大功告成。

最后

SSH除了远程转发,还有逆向的本地转发。还有动态转发,动态转发可以做简易的VPN。

端口转发详解可参考文章2,3

参考文章

  1. https://www.cnblogs.com/bubaya/p/7828817.html
  2. https://blog.fundebug.com/2017/04/24/ssh-port-forwarding/
  3. https://wangdoc.com/ssh/port-forwarding.html
  4. https://zhuanlan.zhihu.com/p/271980834

SSH远程端口转发实战详解的更多相关文章

  1. SSH隧道:端口转发功能详解

    SSH系列文章: SSH基础:SSH和SSH服务 SSH转发代理:ssh-agent用法详解 SSH隧道:端口转发功能详解 1.1 ssh安全隧道(一):本地端口转发 如下图,假如host3和host ...

  2. [转帖]SSH远程登录配置文件sshd_config详解

    SSH远程登录配置文件sshd_config详解 2016年06月02日 17:42:25 Field_Yang 阅读数 61386   版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权 ...

  3. ssh远程端口转发&&windows系统提权之信息收集&&网安工具分享(部分)

    一.ssh远程端口转发 背景:当我们在渗透过程中,获取到内网的一台仅有内网IP的服务器后,我们可以通过ssh隧道,将内网某个主机的端口进行远程转发 1.网络拓扑图 假设获取的服务器为web服务器,we ...

  4. Nginx服务器中配置非80端口的端口转发方法详解

    这篇文章主要介绍了Nginx服务器中配置非80端口的端口转发方法详解,文中使用到了Nginx中的proxy_pass配置项,需要的朋友可以参考下 nginx可以很方便的配置成反向代理服务器: 1 2 ...

  5. ssh远程端口转发

    当ssh的连接方向和应用连接的方向不一致时,这就称为ssh远程转发. 主机3是一台web server 应用请求是主机2到主机1 ssh请求是主机1到主机2 主机2开启ssh服务 service ss ...

  6. SSH 远程端口转发

    既然"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发. 还是接着看上面那个例子,ho ...

  7. SSH的端口转发:本地转发Local Forward和远程转发Remote Forward

    关于使用ssh portforwarding来进行FQ的操作,网络上已经有很多很好的文章,我在这里只是画两个图解释一下. 首先要记住一件事情就是: SSH 端口转发自然需要 SSH 连接,而 SSH ...

  8. ssh命令:隧道代理+本地端口转发+远程端口转发

        0.前言 nc是一个在网络连接两端的好工具,同时也是也个临时的端口转发的好工具.(永久的端口转发用什么?用iptables) ssh也是这方面的好工具,好处是加密可靠可复用在一端操作即可,代价 ...

  9. SSH 内网端口转发实战

    导读 大家都知道SSH是一种安全的传输协议,用在连接服务器上比较多.不过其实除了这个功能,它的隧道转发功能更是吸引人. 如果两个内网之间的linux服务器需要互相登录,或需要互相访问内网某个端口,担忧 ...

随机推荐

  1. ld-linux-x86-64消耗大量的CPU

    1.现象: 服务器CPU使用率很高 top查看cpu使用进程: 2.进程用户是oracle,根据spid查看是否是数据库进程,经过查询发现:不是数据库内部的进程 select a.sql_id,a.s ...

  2. element的日期选择使用value-format之后表单验证报错

    在表单验证的时候报错 添加一个日期控件,但是发现在表单验证中遇到了冲突如下: Error in event handler for "el.form.change": " ...

  3. hdu5438 拓扑排序+DFS

    解析 对一个有向无环图(Directed Acyclic Graph,简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则 ...

  4. .Net Core Host 之详解

    简介: 开发使用有三年经验了,想趁这个机会把net core的知识点梳理一下,也更好的研究一下.NET 5给我们带来的变化. 主机的概念: 一个主机是封装了应用程序的资源,比如一个对象: 依赖注入 ( ...

  5. LevelDB学习笔记 (2): 整体概览与读写实现细节

    1. leveldb整体介绍 首先leveldb的数据是存储在磁盘上的.采用LSM-Tree实现,LSM-Tree把对于磁盘的随机写操作转换成了顺序写操作.这是得益于此leveldb的写操作非常快,为 ...

  6. 22、编译安装nginx及性能优化

    22.1.编译安装nginx: 1.下载nginx: [root@slave-node1 ~]# mkdir -p /tools/ [root@slave-node1 ~]# cd /tools/ [ ...

  7. Flask(1)- 简介

    背景 为啥要学,很久之前就学过点,没写文章 最近因为要写机器人工具,其实就是简单的纯服务端工具 反正 flask 也挺简单,一天快速过完 概念会直接搬教程的,实操自己敲一遍再总结 参考教程 https ...

  8. 面试题四:手写sql

    矫正数据,有以下2个表,建表语句如下所示 -- 订单表 create table t_order ( id int auto_increment primary key, name varchar(2 ...

  9. 使用Gradle构建多模块SpringBoot项目

    使用Gradle构建多模块SpringBoot项目 本项目使用Gradle构建SpringBoot项目,将不同的业务进行不同的模块划分(不做微服务与分布式架构); - 编辑器:Intellij IDE ...

  10. 所有的Java虚拟机必须实现在每个类或接口被Java程序 “ 首次主动使用 ” 时才初始化他们

    原文:https://www.cnblogs.com/fanjie/p/6916784.html Java程序对类的使用方式可分为两种– 主动使用– 被动使用 被动使用以后再讲,这里说说什么是主动使用 ...