在日常安装部署和运维过程中经常需要远程登陆到内网机器进行配置、升级维护等操作;如果没有远程管理不得不跑托管机房,费时费力。如果维护是的是Windows服务器还好办,直接安装TeamViewer就可以了;但现在大部分都是基于云的系统,主要操作系统是Linux。
Linux安装TeamViewer比较麻烦(安装Libvirt,然后再部署一台Windows系统的虚拟机再安装TeamViewer),这样无形中占用了系统资源给自己增加了工作量和复杂度,而且万一部署的Windows系统的虚拟机出问题,比如远程管理也就连接不上了,还需要现场人员或亲自介入,势必延误维护工作等。
本期“智汇华云”专栏为您带来一次自动化的SSH反向代理的实验。
本期讲解人
张伟
华云数据售前解决方案经理
一、实验概述
1、实验架构
该实验的前提服务器要求是Linux系统,实验架构如下图所示。
该实验的完成在win7系统上进行的,通过VMware Workstation虚拟出两台Linux虚拟机,一台通过SNAT联网;一台通过桥接联网;还要准备一台云主机做为跳板机。
要达到的目的是Linux-2 ssh到云主机公网IP的1234端口直接跳转到内网的Linux-1主机。
2、知识点
ssh的相关参数说明
反向代理
ssh -fCNR
正向代理
ssh -fCNL
-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定远程主机的端口
二、内网机器的准备
1、Linux-1
为了模拟真实的环境用VMware Workstation启动了两台Linux的虚拟机,一台名为Linux-1,通过snat上网,模拟内网的物理机,如下图所示。
2、Linux-2
一台名为linux-2是通过桥接内部网络上网的,用来远程登入用,如下图所示。
3、跳板云主机的选择
因为云主机不跑实际业务,只是中转一下SSH数据,我们可以选择1C1G的带公网IP,价格相对便宜的使用。这里有个简单的价格参考。
华云的1C1G2M带宽,附属IP一个,包年是750元。
某云的云主机1C1G1M带宽,附属IP一个,包年是836.40元。
某云的1C1G1M带宽,附属IP一个,包年是791.82元。
上面数据是通过个人帐户直接购买查询得到,时间结点是2019年的9月初,供大家选择参考。
本人用的是华云的7天试用的云主机(个人实名后可以免费试用7天),如下图所示。
三、配置与操作
1、跳板机
A、修改SSH配置
首先需要SSH的配置,文件在/etc/ssh/sshd_config,修改GatewayPorts为yes,默认是no,如下图所示。
如果是免密码登陆还需要修改以下两项:
AuthorizedKeysFile.ssh/authorized_keys
PubkeyAuthentication yes
重启服务生效
# service sshd restart
B、配置Iptables规则
这里用到了跳板机的两个端口:1234和7280,也可以自定义。
重启服务生效
#service iptables restart
C、配置默认防火墙规则
需要配置防火墙打两个监控的端口,分别为接入隧道1234、反向隧道7280。
D、添加本机隧道
#ssh -fCNL *:1234:localhost:7280 localhost
会提示输入本机密码。
2、linux-1的配置
在linux-1中输入建立反向隧道命令如下:
#ssh -fCNR 7280:localhost:22 root@公网IP
会提示输入跳板机密码,如下图所示。
四、验证与测试
1、跳板机
在跳板机中分别查看1234和7280端口
1234是本机的隧道创建命令建立;7280是linux-1创建反向隧道命令建立。
具体链路如下图所示。
2、Linux-2
在Linux-2的命令行输入ssh命令,注意需要输入的是Linux-1的密码,如下图所示。
作者第一次输入了跳板机的密码,这里提示错误,第二次输入的是linux-1的密码,然后直接登陆到Linux-1的机器。达到了我们最终的目的,不通过任何工具直接建立远程管理系统。
五、系统的改进
1、免名密码登陆
要用脚本执行命令就需要相互免密码登陆,下面是Linux-1到跳板机(这个可以根据环境和安全需要进行配置)。
A、Linux-1
Linux-1的命令行执行下面的命令:
#ssh-keygen -t rsa
#ssh-copy-id root@IP
B、跳板机
跳板机内部的免密码登陆操作
#ssh-keygen -t rsa
#ssh-copy-id root@localhost
跳板机修改ssh的配置
文件在/etc/ssh/sshd_config
AuthorizedKeysFile .ssh/authorized_keys
PubkeyAuthentication yes
重启服务生效
# service sshd restart
2、添加脚本
A、跳板机
添加自动创建隧道的脚本()。
vi /etc/rc.d/rc.local
B、Linux-1
使用SSH的方式不够稳定,使用autossh可以自动在连接断开时自动重连,再把autossh加入系统服务自动启动,则可以做到稳定的连接。
如果是CentOS6可以直接通过yum来安装
#yum install autossh
如果是CentOS7需要通过源码来安装了。
# yum install wget gcc make
#tar -xf autossh-1.4e.tgz
#cd autossh-1.4e
#./configure
#make
#make install
输入:
vi /etc/rc.d/rc.local
添加内容:
#autossh -M 7281 -fCNR 7280:localhost:22 root@IP
在Centos7之后,原来直接修改/etc/rc.d/rc.local启动脚本自动生效的功能在修改了之后,需要重新赋予可执行权限,需要再输入:
#chmod +x /etc/rc.d/rc.local
3、再次测试
可以重启linux-1和跳板机,在启动后不做任何操作,通过linux-2查看是否可以登陆。
跳板机重启,如下图所示。
Linux-1机器重启,如下图所示。
远程登陆测试
作者这里是成功的,如果你没有成功可能是你自己个人配置的问题。如果问题解答可以扫描添加华云的公众号,向作者询问。
六、排错与小结
在实验的过程中也遇到了很多问题,主要是公有云的防火墙、ssh配置、Linux防火墙、隧道重新创建等,在ssh出错后可以在ssh命令后添加-v来进行排错;遇到问题后多问问自己为什么是否可以重现的现该现象,一点点定位问题,然后解决问题。网上公开的类似文章很多,但很多笔者就遇到了ssh-copy-id后主机登陆仍然需求密码的问题,经过分析发现是ssh配置文件的问题。不同的环境会遇到不同的问题,大家要学会具体问题具体分析,逐渐的总结规律,提高分析问题和解决问题的能力,然后不断提高自己的工作效率。
防火墙导致上面的问题。
ssh配置或密钥问题导致上面的问题。
拷贝公钥后仍然需要输入密码,是ssh的配置问题。
七、业务延展
上面这些你已经完成或可能比较熟悉,那我们可以在这个基础上再进行一下延展,在运维行业经常有一句话“删库跑路”,怎么避免这种情况出现?可以考虑建立堡垒机的机制,再进一步可以把堡垒机建在我们跳板机上,同跳板机的管理结合起来就能越来越规范我们的操作,避免意外情况的发生了。
部分参考的文章:
https://blog.csdn.net/jiangbenchu/article/details/84438959