SSH远程端口转发实现跨局域网访问

问题

想用SSH远程连接没有公网ip的电脑。问如何连接?现有以下设备

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

目标:

访问实验室电脑C1321端口。

解决办法: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

但是我们还不能在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-keygen -t rsa

查看密钥的生成位置,一般在根目录下的 /root/.ssh/id_rsa.pub文件

ssh-copy-id -i /root/.ssh/id_rsa.pub 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

参考文章

  1. https://www.cnblogs.com/bubaya/p/7828817.html
  2. 玩转SSH端口转发 | Fundebug博客 - 一行代码搞定BUG监控 - 网站错误监控|JS错误监控|资源加载错误|网络请求错误|小程序错误监控|Java异常监控|监控报警|Source Map|用户行为|可视化重现
  3. SSH 端口转发 - SSH 教程 - 网道
  4. Ubuntu18定时任务脚本 - 知乎​​​​​

转载

SSH远程端口转发实战详解 - Xi-iX - 博客园 (cnblogs.com)

笔记 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想和我重名?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值