使用ssh反向连接,轻松连接内网主机

       最近偶得一服务器,DELL的R730,配置了双路E5-2603v5和8G内存,H330阵列卡,300G的SAS硬盘*3。果断做了RAID5阵列,用life cycle配置完成后直接装了centos7.4(1708),实际体验相当棒,比买的云服务器性能不知道高出了多少倍。这里还要感谢一下DELL的客服妹子,非常专业,有问必答,且主动要求帮忙提供更多的电话支持,本着要多折腾折腾的性子,我十分感动然后拒绝了她,于是走上了折腾之路。 具体过程就不说了,参照客服发来的教程,加上之前PC上装centos的经验,总算是成功装上了。

参考资料:13G服务器如何使用Lifecycle安装Windows 2012

U盘安装centos7.2,解决安装过程中的错误

    由于没有独立IP,且内网错综复杂,从服务器到公网出口网关中间跳了4层路由,想把服务器通过端口映射映射到公网去的想法基本是凉了,所以准备用这台服务器做程序测试使用,但如果想通过公网SSH连接这台服务器,正常情况下是不可能的。但是LINUX的SSH有强大的反向连接功能,完美的解决了这个问题。(附图:内网路由追踪)

image.png

SSH反向连接原理:

1、什么是反向连接?

反向连接是指主机A(受控端)主动连接主机B(控制端),在主机A和主机B之间建立一个远程连接,通过这个连

接主机B可以主动的向主机A发送一些请求。

2、为什么需要主机A主动去连接主机B呢?

这是因为主机A在局域网内,如果没有对主机A进行端口映射,对于主机B来说主机A是不可见的,如果在主机B这

边向主机A发送连接请求,这个请求是不可达的。而主机B有自己独立的IP,对于主机A来说是可见的,可以直接向

主机B请求连接。

3、SSH反向连接的过程

方法就是主机A主动去连接主机B,主机B响应主机A的连接请求,它们之间就建立了一个远程连接。然后主机B在

本地再创建一个本地连接,重定向到主机A和主机B刚才建立的远程连接上,之后对这个本地连接的操作都会反馈到

远程连接上去。整个过程类似于文件的DUP,这就在主机A和主机B之间建立了连接通道,此时对于主机B来说,主

机A已经是可见了。

连接流程如下:

3.1、主机A ssh客户端向主机B sshd服务端发送请求,建立远程连接。

3.2、主机B sshd服务端创建本地连接很远程连接的映射(反向连接通道)。

3.3、主机B ssh客户端向主机B sshd服务端的连接通道发送请求, 建立主机B ssh和主机A sshd的连接。

完成连接后,主机A对于主机B可见的形式就是存在于主机B的那个本地连接。

4、为什么需要在主机B对远程连接映射一个本地连接?

反向连接就是CS架构,不过是受控端主动向控制端请求连接,让它们之间的连接建立。传统的CS方式是可以解决

主机A和主机B之间的连接问题,但是那样主机A和主机B的连接方式并不灵活,两者之间能做的事情,只能是CS之际

协议规定的事情。在主机B上建立了主机A的连接映射后, 对于主机B来说主机A已经不是局域网内那台不可见的主

机,主机A已经是存在主机B的一台可见主机,这样就消除了局域网和广域网的阻碍。 主机A和主机B之间建立的那

个远程连接就是主机A和主机B的通道-“网线”。

        简单的来说,就是准备一台外网主机,然后内网主机主动跟外网主机建立一条连接,然后在外网主机上将内网主机的端口映射到本地的其他端口,就可以实现访问内网主机了。好比B给A写过一封信,A就知道了B的地址,那么A就可以一直给B写信寄到这个地址去了。

下面来说一下怎么实现SSH反向连接。

准备工具:一台独立IP的云服务器,一台内网主机。操作环境为centos7。下文独立IP云服务器称之为A,内网主机称之为B。

一、配置两台主机互相信任

“配置主机互相信任”两台主机之间通过秘钥连接,无需输入密码,这样两台主机之间互相登录会比较方便。

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
yum -y update

2.在B(内网服务器)上生成公钥并传送到A:

ssh-keygen
#接下来一路回车直到出现如下面字样:
+--[ RSA 2048]----+
|     . .+.  o .  |
|    . .+ = . + . |
|     .+ = o .  ..|
|      .o o    . .|
|     .  S .  E   |
|      ..o  .     |
|       o .o      |
|       ... .     |
|      ...        |
+-----------------+
#继续操作
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
rsync -avz /root/.ssh/authorized_keys root@A地址:/root/.ssh/authorized_keys
#选yes,然后输入密码即完成

3.在A(云服务器)上生成公钥并传送到B:

ssh-keygen
#接下来一路回车直到出现如下面字样:
+--[ RSA 2048]----+
|     . .+.  o .  |
|    . .+ = . + . |
|     .+ = o .  ..|
|      .o o    . .|
|     .  S .  E   |
|      ..o  .     |
|       o .o      |
|       ... .     |
|      ...        |
+-----------------+
#继续操作
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
#切换到B
scp root@A地址:/root/.ssh/authorized_keys /root/.ssh/authorized_keys
#选yes,然后输入密码即完成

然后试一下,从ssh到A是否需要密码,如果不需要则成功。

二、建立B到A的反向连接隧道

在B(内网服务器)上操作

ssh -NfR 1000:localhost:22 root@A地址 -p 22

参数释义:

-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定远程主机的端口

这样我们就把内网服务器A的ssh端口22,通过代理隧道映射到了云服务器A的1000端口上,在A上执行:

ss -ant |grep 1000

看到如下结果,表示成功:

LISTEN  0  128    127.0.0.1:1000      *:*

三、展现奇迹的时刻

在A上执行:

ssh root@localhost -p 1000

成功登陆了内网服务器!

四、优化连接稳定性

因为这样的ssh连接隧道不是很稳定,要是崩溃了那还得用内网服务器B重新连接一次A,非常麻烦。为了方便远程管理,我们需要更稳定的隧道连接,而autossh就完美解决了这个问题。

1.安装autossh:

yum -y install epel-release
yum -y install autossh

2.然后我们执行autossh建立一条稳定的隧道连接:

autossh -M 1001 -NfR 1000:localhost:22 root@A地址 -p 22

M:本机监听端口,监听ssh隧道是否正常,如果断了就重连。

3.配置开机启动:

vim /etc/rc.local
#加入如下内容
autossh -M 1001 -NfR 1000:localhost:22 root@A地址 -p 22
#内容结束
chmod +x /etc/rc.d/rc.local

接下来可以随时随地通过A连接到内网B主机了。

评论

目前评论:0   

点击加载更多评