在实际项目测试中经常会遇到数据库操作,但是因为公司安全问题,访问数据库往往需要通过跳板机。但通过跳板机,测试效率大打折扣,因此通过使用SSH端口转发,从而达到跨机器直接访问数据库。实际项目中的应用会比下面内容相对复杂一些,但万变不离其宗,基本原理是一样的。

SSH简介

SSH是什么?

SSH是一种协议,是一种有关如何在网络上构建安全通信的规范。SSH的协议涉及认证、加密、网络上传输数据的完整性。具体而言,SSH具有客户端/服务器(C/S)结构,SSH在计算机之间建立网络连接,并充分保障连接的双方是真实可信的(认证),该连接传输的所有数据不会被窃听(加密),不会被修改(完整)。

基于SSH的产品(即实现了SSH协议的产品)可能包含客户端或服务器,也可能都包含。Unix通常都包含有客户端和服务端;其他平台一般仅包含客户端。

术语:SSH协议和产品

经常会见到SSH、SSH-1、SSH-2、ssh等等各种特别相似的词汇,很容易让大家有误解,这里就将这些进行简单说明,方便后续大家理解。

SSH:通用的术语,泛指SSH协议或SSH软件产品

SSH-1:SSH协议版本1

SSH-2:SSH协议版本2

SSH1:实现SSH-1 的一个产品(软件),也是最早的SSH软件

SSH2:实现了SSH-2的一个商业产品

OpenSSH:是OpenBSD项目的产品,它同时实现了SSH-1协议和SSH-2协议

ssh:运行安全终端会话和远程命令的客户端程序,是产品的一个子集,即客户端部分

SSH的功能

1、 安全远程登录
说到远程登录不得不提起来Telnet协议,下面就对telnet和ssh进行简单对比,从而帮助大家理解ssh的安全远程登录功能。

  • Telnet:Telnet为用户提供了在本地计算机上完成远程主机工作的能力。但Telnet不是一种安全通信协议,因为它并不使用任何安全机制,通过网络/互联网传输明文格式的数据,包括密码,所以谁都能嗅探数据包,获得这个重要信息。
  • SSH:SSH是一种非常安全的协议,因为它共享并发送经过加密的信息,从而为通过互联网等不安全的网络访问的数据提供了机密性和安全性,SSH = Telnet + 安全机制。

2、安全文件传输
传统的文件传输程序(ftp、rcp等)都不能提供安全解决方案,使用SSH,只需要使用一个安全拷贝命令(scp)就可以在计算机之间安全传输文件。

3、 安全执行远程命令。例如 ssh nick@xxx.xxx.xxx.xxx "pwd; cat hello.txt"

4、访问控制
假设用户允许另外一个人使用自己的计算机账号,但他只能用于特定目的。例如,在你出差时,允许秘书使用你的账号替你阅读email,但不能执行其他操作。使用SSH,你不用把密码告诉秘书,也不用修改密码就可以授权秘书访问自己的账号,并限定他只能运行邮件程序。

5、端口转发
SSH能为另外一个应用程序的数据流提供透明的加密措施,从而保护其他TCP/IP应用程序,后面会详细解释关于SSH的端口转发功能。

常见的SSH产品

 

详解SSH端口转发

SSH使用的传输机制是TCP/IP,通常使用的是服务器的TCP端口22,并对经过连接传输的数据进行加密/解密操作。SSH端口转发就是SSH对其他应用程序在别的TCP端口上建立的TCP/IP传输进行加密和解密。Telnet、SMTP、IMAP和其他一些基于TCP/IP的不安全协议都可以将其连接通过SSH转发变得安全。SSH端口转发也叫做隧道传输,因为SSH连接提供了一条安全的“隧道”,其他TCP/IP连接可由此经过。

 

如上图所示,使用了端口转发之后,TCP 端口 A 与 B 之间现在并不直接通讯,而是转发到了 SSH 客户端及SSH服务端来通讯,从而自动实现了数据加密并同时绕过了防火墙的限制。

有一点需要注意的是,SSH端口转发 是TCP使用的一种通用代理机制,而且只能用于TCP/IP协议。如果协议不是基于TCP的,比如基于UDP的DNS、DHCP的,就不能使用端口转发机制。

本地转发分析

假设你在家里有一台电脑名主机H,上面运行着某个支持IMAP的email阅读器,你想连接到服务器主机S上的IMAP服务器,从而读取并发送邮件。通常,这个连接是不安全的,你的邮箱账号、密码在IMAP服务器和客户端之间明文传输,我们可以使用SSH端口转发,透明地将IMAP连接重新路由,使其通过SSH安全地对连接上的数据进行加密。

语法是这样的:ssh -L <本地监听端口号>:<目的主机>:<目的服务的端口号> <隧道终点主机>

具体到该例子:ssh –L 端口Y : S : 端口143 S

-L 表示是本地转发,此时该TCP服务的客户端与SSH客户端同在H上。后面接着三个值,由冒号分开,分别表示:需要监听的本地端口Y,目的主机(S),目的服务的端口号143(IMAP服务端通用的端口号是143)。

这个命令可分开下面两个步骤理解:

  1. Hi,本地的ssh客户端,请你在本地建立一个监听端口,凡是到这个端口的数据,都请你通过ssh 通道传给ssh服务端
  2. Hi,隧道终点主机,请你收到我的数据之后,把数据转到我制定的目的主机和目的服务端口上

通过端口转发,整个数据链路由原来(H,X)--> (S,143)转为下面几步

  1. (H,X)--> (H,Y),家中H上的IMAP客户端向本地的Y端口发送数据,其中Y就是本地端口转发时SSH客户端新建立的本地监听端口
  2. (H,Z)--> (S,22),家中H上的SSH客户端读Y端口数据,加密数据,利用SSH通道,将加密后数据发送到S
  3. (S,W)-->(S,143),SSH服务端将收到的加密数据解密,然后将其传给S的143端口上监听IMAP的服务器
 

除了本地转发还有远程转发,本次解决项目中实际问题时未涉及使用远程转发技术,因此不做详细介绍,感兴趣的可私下了解。

利用本地转发技术实现跨机器直接访问

现在很多公司为了加强网络安全,都会使用跳板机,所谓跳板机就是一台服务器,维护人员在维护过程中,首先要统一登录到这台服务器(跳板机)上,然后从这台服务器(跳板机)再登录到目标设备进行维护。于是我们面临一个情况,本机ssh->跳板机->目标机器,而跳板机一般作为通道,提供的权限很低,很多命令无法执行,这个限制会让我们工作效率大大降低。我们利用前面的SSH本地端口转发技术来彻底解决该问题吧!

我们将上面的描述图形化,见下图。

 

图中的“我”,现在是要访问内部网站的192.168.1.0/24网段里面的服务器,然而由于不在一个网段,我是不可以直接ssh到内部网络的服务器。通常的做法是先ssh到“SSH Server”,然后再在ssh server上访问内部网站的服务器。我能不能不用上ssh server就直接ssh到内部服务器呢?

结合前面的SSH本地端口转发,我可以这样做:

1、挖隧道

ssh –L 11125 : 192.168.1.2 : 22 [user@10.1.1.1](mailto:user@10.1.1.1)

在本地电脑创建监听端口:11125,192.168.1.2:22就是我们无法直接访问到目的主机及端口号,10.1.1.1就是我们这次挖隧道的终点主机,即可访问的SSH服务端

2、使用隧道

如果我们希望继续使用的TCP服务还是ssh客户端,因此我们就需要再打开一个ssh客户端。

ssh –p 11125 localhost

这行命令看起来是说,用ssh连接到本地电脑的端口11125上。结合刚才步骤1建立的隧道,这条命令就会被转发到跳板机10.1.1.1,然后跳板机会把这个ssh命令转发到目的主机192.168.1.2。

当然我们还可以使用其他服务,例如连接数据库,我们只需要连接当前主机11125端口即实现了连接在服务器192.168.1.2的数据库了。

到此,我们已经完美的实现了跨机器直接访问的目的。



作者:桃子妈咪
链接:https://www.jianshu.com/p/b22d765ec9ef
來源:简书
插播:金融壹账通质量开放平台现提供测试一站式解决方案,包括UI自动化、测试过程管理、app评测、接口自动化、接口压测、舆情监控等测试服务,欢迎访问:http://fit-stg1.jryzt.com/Hyperion-server/html/index.html。