SSH端口转发详解及实例

一、SSH端口转发简介

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

1.1 SSH端口转发的两大功能

  • 加密SSH Client端至SSH Server端之间的通讯数据。
  • 突破防火墙的简直完成一些之前无法建立的TCP连接。

 

二、本地转发

命令:-L localport:remotehost:remotehostport sshserver

说明:localport       本机开启的端口号

      remotehost      最终连接机器的IP地址

      remotehostport        转发机器的端口号

      sshserver       转发机器的IP地址

选项:-f 后台启用

      -N 不打开远程shell,处于等待状态(不加-N则直接登录进去)

      -g 启用网关功能

    接下来,我们通过实验来详细的说明一下如何实现本地转发:

实验一:实现SSH端口转发——本地转发

  • 背景:企业内部C服务器只允许telnet连接(23端口)访问,不允许外部直接访问,B服务器是一个ssh服务器;有一个用户需要从外部连接到企业内部的C服务器。
  • 前提:防火墙允许22端口进来(或者企业内部有一个堡垒机,ssh -t通过堡垒机进去)。
  • 原理:A用户通过ssh协议连接到B机器上,再通过B机器做跳板,连接至C机器。
  • 机器:rhel5模拟A用户,CentOS6模拟B机器,centos7模拟C机器
  • 图示如下:

SSH端口转发详解及实例

  • 实验步骤:

1)模拟C机器不允许A用户连接,并且开启B机器的telnet服务端口23。

在centos7上输入以下口令:

iptables -A INPUT -s 192.168.191.55 -j REJECT

SSH端口转发详解及实例

此时,从rhel5用ssh命令连接centos7,是拒绝的:

SSH端口转发详解及实例

同时,我们还要开启7的telnet服务端口23:

systemctl start telnet.soc ket

ss -ntl命令可以查看的服务端口是否已开启

SSH端口转发详解及实例

2)开启端口转发(telnet隧道)

    首先,我们在5机器上确认已经开启的端口有哪些:

SSH端口转发详解及实例

 

我们使用的端口是9527端口,从上图中我么已经看出,9527端口没有被占用,所以我们可以使用~

接着我们建立本地转发的隧道(5上输入以下命令):

ssh -L 9527:192.168.191.77:23 -fN 192.168.191.66

SSH端口转发详解及实例

    在这里,我们可以使用ps aux来查询后台运行的进程。也可以通过ss -nt查看接口连接情况:

SSH端口转发详解及实例

SSH端口转发详解及实例

3)在rhel5上输入以下命令,用9527端口连接自己:

    telnet 127.0.0.1 9527

SSH端口转发详解及实例

    此时,我们可以查看一下centos6和centos7的连接情况:

SSH端口转发详解及实例

SSH端口转发详解及实例

    至此,我们已经实现了A用户在公司外部远程连接C机器的需求,接下来我们就来讲一讲实现过程:

    data <- -> localhost:9527端口 <- -> localhost:XXXXX(随机在客户端6开一个端口) <- -> sshsrv:22(通过ssh封装) <- -> sshsrv:YYYYY(服务器解封装,开一个端口,代表telnet客户端) <- -> telnetsrv:23

  用大白话来解释就是:当rhel5(A用户)连接自己的9527端口时,该请求自然会通过ssh协议封装发送给centos6(B机器),然后在centos6(C机器)上解封装,形成telnet流量,发送给centos7(C机器)。

  实验做完了,如果我们想要停止这个隧道,直接把后台的隧道进程杀死就可以了,命令如下:

  killall ssh

SSH端口转发详解及实例

  我们的实验圆满完成ヾ()ノ

 

三、远程转发

  在我们实验一的场景下,首先要满足的是防火墙上必须打开22端口,但是在现实生活中,企业处于安全考虑,一般是不会打开防火墙,只允许出不允许进。所以,当防火墙的端口没有打开的时候,我们要怎么办呢?这就要用到我们接下来要说的远程转发了:

命令:-R sshserverport:remotehost:remotehostport sshserver

说明:sshserverport         被转发机器开启的端口号

      remotehost          最终连接机器的IP地址

      remotehostport        被转发机器的端口号

      sshserver            被转发机器的IP地址

  同样的,我们以实验来具体说明我们的远程转发:

实验二、实现SSH端口转发——远程转发

  • 背景:企业内部C服务器只允许telnet连接(23端口)访问,不允许外部直接访问,B服务器是一个ssh服务器;有一个用户需要从外部连接到企业内部的C服务器。
  • 原理:B机器访问A用户,给A用户转发
  • 机器:rhel5模拟A用户,centos6模拟B机器,centos7模拟C机器
  • 图示如下:

SSH端口转发详解及实例

  • 实验���骤:

1)模拟C机器不允许A用户连接,并且开启B机器的telnet服务端口23。

  在centos7上输入以下口令:

  iptables -A INPUT -s 192.168.191.55 -j REJECT

SSH端口转发详解及实例

  此时,从rhel5用ssh命令连接centos7,是拒绝的:

SSH端口转发详解及实例

  同时,我们还要开启7的telnet服务端口23:

  systemctl start telnet.soc ket

  用ss -ntl命令可以查看的服务端口是否已开启

SSH端口转发详解及实例

2)开启隧道转发(telnet隧道)

    这一次,由于防火墙完全关闭,外部的设备连接不进来,所以我们要通过B机器去连接A用户的机器,因此,我们的开启隧道命令要在B机器(centos6)上运行:

    首先,我们要确定一下centos6上开启了哪些端口:

SSH端口转发详解及实例

    然后,我们选择一个没有被开启的端口开启隧道,进行实验:

SSH端口转发详解及实例

  同样的,在这里,我们可以使用ps aux来查询后台运行的进程。也可以通过ss -nt查看接口连接情况:

SSH端口转发详解及实例

SSH端口转发详解及实例

3)在rhel5上输入以下命令,用9527端口连接自己:

    telnet 127.0.0.1 9527

SSH端口转发详解及实例

    此时,我们可以查看一下centos6和centos7的连接情况:

SSH端口转发详解及实例

SSH端口转发详解及实例

    至此,我们已经实现了A用户在公司外部远程连接C机器的需求,接下来我们就来讲一讲实现过程:

  data <- -> sshsrv:9527端口 <- -> sshsrv:22(通过ssh封装) <- -> localhost:XXXXX(随机在客户端6开一个端口) <- -> localhost:YYYYY(服务器解封装,开一个端口,代表telnet客户端) <- -> telnetsrv:23

  用大白话来解释就是:当rhel5(A用户)连接自己的9527端口时,该请求自然会通过ssh协议封装发送给centos6(B机器),然后在centos6(C机器)上解封装,形成telnet流量,发送给centos7(C机器)。

  实验做完了,如果我们想要停止这个隧道,直接把后台的隧道进程杀死就可以了,命令如下:

  killall ssh

SSH端口转发详解及实例

  我们的实验圆满完成ヾ()ノ

相关推荐