今天讲远程连接,所有代码案例在:
https://github.com/suchocolate/test/tree/master/remote
本文仅适用于无可控防火墙的场景,如有自己的防火墙和无限制IP,请忽略本文。
1.简单分析
机房拓扑如下
众所周知,一般FW只允许内对外发起访问,禁止外对内发起访问。
在这种场景下,想要远程,就需要一个在公网的代理节点帮忙。(实际这种由公网通过代理节点访问私网的连接方式应该叫做反向代理,为了便于理解本文简称代理)
如何实现:首先由内网机发起到代理节点的连接并保持连接,而后远程client访问代理节点,代理节点从隧道转发给内网机,这样就实现了远程连接。
因此想实现远程连接需要2个素材:
-
一个带公网IP的代理节点。
-
合适的转发方式。
2.我用过的转发方式
我用过5种转发方式(都是基于SSH隧道):
接下来我为大家一一介绍,条件有限,我用3台虚拟机和物理机模拟:
-
内网机:192.168.70.138 u41
-
代理:192.168.70.135 u42_proxy 192.168.137.21(假如这是公网ip)
-
client:192.168.137.1(就是我的物理机)
-
A主机:192.168.70.151 a_host
3.SSH:基础的端口转发
端口转发是SSH自带的功能,仅用SSH命令就可以实现。
1)远程转发
以图为例,首先内网机使用如下命令发起远程(R)端口转发,就能将代理上的15022端口转发到内网机的22端口上:
ssh -fCNR 15022:localhost:22 root@192.168.70.135
# f:程序放到后台
# C:数据压缩,压缩节省流量
# N:这不是一条远程SSH命令
# R:远程转发,将远程15022端口发到本地的22端口
可以看到在后台运行了一个SSH远程转发的进程。
接下来只要在代理节点上使用如下命令就可以访问内网机了。
ssh -p 15022 root@localhost
# p:端口15022
# root:内网机的账号
# localhost:登陆的主机
# 意思就是登陆本机的15022端口,又因为这个映射成了远端的内网机的22端口
# 所以当登陆这个端口时,就是登陆内网机的22端口。
成功登陆到了内网机。
2)本地转发
仅远程转发没有预期的方便,这个远程方式需要我们先登陆到代理节点,才能SSH访问内网机。能不能实现client不登录代理,就能登陆内网机?当然可以,我们先看一下代理节点的监听端口:
可以看到,代理节点上监听的是环回口的15022,所以只能在代理节点上访问。如果想实现不登录代理就转发,我们还得在代理上开一个本地转发,监听任意地址,流量转给15022:
接下来在代理节点运行本地(L)转发命令:
ssh -fCNL *:15023:localhost:15022 root@localhost
# L:本地转发命令,将15023转发到本地的15022端口
# root:这里的root是代理自己的账号和密码
可以看到,代理节点运行了SSH后台本地转发进程,并且在监听0.0.0.0:15023端口了。
我们在cl