一、简介

       SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。

1、 SSH 端口转发能够提供两大功能:

1)加密 SSH Client 端至 SSH Server 端之间的通讯数据。

2)突破防火墙的限制完成一些之前无法建立的 TCP 连接。

2、ssh端口转发如图:

二、端口转发

1、本地转发

主机名

系统

IP

用途

master

CentOS7.4

192.168.56.129

客户端

slave1

CentOS7.4

192.168.56.130

mysql5.6

1)在master执行如下命令,即在master和slave1之间建立一条隧道,执行下输入slave1密码;

# ssh -L 9999:192.168.56.131:3306 [email protected]

参数说明:

-L表示本地的某个端口上的通讯数据会被转发到目标主机的对应端口。也可以看作是“映射”;

9999:192.168.56.131:3306表示本地9999端口被转发到目标IP的3306端口上。

2)打开master新窗口,查看

[root@master ~]# ss -tnlp | grep 9999

3)在master登录slave1数据库

[root@master ~]# mysql -h127.0.0.1 -P9999 -uroot

当关闭ssh创建的隧道窗口,立即ssh隧道也随之关闭,在生产环境是不可取的。

4)-N和-f参数

-N选项表示在创建ssh隧道时不会打开shell链接到目标主机上,输入密码后停留在当前。

-f选项表示后台运行ssh隧道,即使关闭创建隧道的shell窗口对应的ssh隧道也不会关闭。

# ssh -N  -f -L 9999:192.168.56.131:3306 [email protected]

2、远程转发

主机名

系统

IP

用途

master

CentOS7.4

公网100.100.100.5

mysql client

slave1

CentOS7.4

192.168.56.130

mysql server

问题:master是系统有公网环境,而slave1系统只有内网,但可以通过nat访问互联网,分析后,slave1可以通过ssh登录master,命令如下:

ssh  root@master_ip

1、通过分析,要想从slave1中创建ssh隧道链接master,并且隧道创建后,master中会监听9999端口,以便其他客户端能通过外网访问;目前需要满足两个如下条件:

(1)从slave1中主动链接到master,即在slave1照片那个执行创建隧道的命令,链接到master.

(2)隧道创建后,转发端口需要监听在master中,以便其他客户端利用master访问到内网的slave1.

2、使用“-R”选项,创建一个“远程转发”模式的ssh隧道,我们在内容slave1执行如下命令:

[root@slave2 ~]# ssh -f -N -R 9999:192.168.56.131:3306 [email protected]

3、创建完毕后,查看运行端口

4、在外网master通过访问本地回环地址的9999端口来访问内网slave1的数据库。

问题:不管是本地转发还是远程转发,都没指向具体的IP地址,也没使用“-g”开启网关功能,最终只会监听127.0.0.1的9999端口。

在使用远程端口转发是生产中很不稳定,网上的朋友提供了autossh的解放方案,这里不做过多讲解,有兴趣的朋友可以去了解一下。

三、本地转发和远程转发的区别

1、本地转发特性:

(1)本地主机:隧道的一头,本地主机即是ssh客户端,又是应用客户端。

(2)远程主机:隧道的另一头,远程主机即是ssh服务端,又是应该服务端。

(3)隧道创建以后,转发端口监听本地主机中,即监听在ssh客户端主机中。

2、远程转发特性:

(1)本地主机:隧道的一头,本地主机即是ssh客户端,又是应用客户端。

(2)远程主机:隧道的另一头,远程主机即是ssh服务端,又是应该服务端。

(3)隧道创建以后,转发端口监听在远程主机中,即监听在ssh服务端主机中。