最近偶得一服务器,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有强大的反向连接功能,完美的解决了这个问题。(附图:内网路由追踪)
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主机了。