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机器
图⽰如下:
实验步骤:
1)模拟C机器不允许A⽤户连接,并且开启B机器的telnet服务端⼝23。
在centos7上输⼊以下⼝令:
iptables -A INPUT -s 192.168.191.55 -j REJECT
此时,从rhel5⽤ssh命令连接centos7,是拒绝的:
同时,我们还要开启7的telnet服务端⼝23:
systemctl start telnet.soc ket
⽤ss -ntl命令可以查看的服务端⼝是否已开启
2)开启端⼝转发(telnet隧道)
⾸先,我们在5机器上确认已经开启的端⼝有哪些:
我们使⽤的端⼝是9527端⼝,从上图中我么已经看出,9527端⼝没有被占⽤,所以我们可以使⽤~
接着我们建⽴本地转发的隧道(5上输⼊以下命令):
ssh -L 9527:192.168.191.77:23 -fN 192.168.191.66
在这⾥,我们可以使⽤ps aux来查询后台运⾏的进程。也可以通过ss -nt查看接⼝连接情况:
3)在rhel5上输⼊以下命令,⽤9527端⼝连接⾃⼰:
telnet 127.0.0.1 9527
此时,我们可以查看⼀下centos6和centos7的连接情况:
⾄此,我们已经实现了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
  我们的实验圆满完成ヾ(✿ ▽ )ノ
三、远程转发
  在我们实验⼀的场景下,⾸先要满⾜的是防⽕墙上必须打开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机器
图⽰如下:
实验步骤:
1)模拟C机器不允许A⽤户连接,并且开启B机器的telnet服务端⼝23。
  在centos7上输⼊以下⼝令:
  iptables -A INPUT -s 192.168.191.55 -j REJECT
  此时,从rhel5⽤ssh命令连接centos7,是拒绝的:
  同时,我们还要开启7的telnet服务端⼝23:
  systemctl start telnet.soc ket
  ⽤ss -ntl命令可以查看的服务端⼝是否已开启
2)开启隧道转发(telnet隧道)
这⼀次,由于防⽕墙完全关闭,外部的设备连接不进来,所以我们要通过B机器去连接A⽤户的机器,因此,我们的开启隧道命令要在B机器(centos6)上运⾏:
⾸先,我们要确定⼀下centos6上开启了哪些端⼝:
然后,我们选择⼀个没有被开启的端⼝开启隧道,进⾏实验:
  同样的,在这⾥,我们可以使⽤ps aux来查询后台运⾏的进程。也可以通过ss -nt查看接⼝连接情况:
3)在rhel5上输⼊以下命令,⽤9527端⼝连接⾃⼰:
telnet 127.0.0.1 9527
此时,我们可以查看⼀下centos6和centos7的连接情况:
⾄此,我们已经实现了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
  我们的实验圆满完成ヾ(✿ ▽ )ノ
四、动态转发
  众所周知,我国有⼀个功能强⼤的防⽕墙,⽤来避免我们访问⾕歌等外国的部分⽹站,嗯。。。FQ的⽅法有很多,相信⼤家不⽐⼩编懂的少,所以我们就不⼀⼀举例说明了。接下来,⼩编就给⼤家说⼀说如何通过ssh转发技术实现FQ~
  这⾥,就要⽤到我们的动态转发技术了:
  当⽤firefox 访问internet 时,本机的1080 端⼝做为代理服务器,firefox 的访问请求被转发到sshserver 上,由sshserver替之访问internet。
  接下来,我们还是以实验进⾏说明:
实验三、实现SSH端⼝转发——动态转发
背景:模拟Google的服务器C不允许国内⽹站A直接访问,B服务器是国外的⼀个⼩型的学习⽤的服务器;国内⽹站A可以访问国外学习服务器B;实现国内⽹站A访问模拟Google服务器C。
原理:国内⽹站A通过ssh协议连接到国外学习服务器B上,再通过国外学习服务器B做跳板,连接⾄Google服务器C。
机器:centos6模拟国内⽹站A,rhel5模拟国外学习服务器B,centos7模拟Google服务器C
图⽰如下:
实验步骤:
1)在模拟google服务器C上搭建⼀个⽹页,从互联⽹上访问centos7时,页⾯显⽰"Welcome le"
  命令如下:
centos vim命令[root@centos7 ~]# cd /var/www/html/
[root@centos7 html]# vim index.html
<h1> Welcome le </h1>
编写完⽂件以后,记得重启⼀下httpd服务:
[root@centos7 html]# systemctl restart httpd
2)模拟Google服务器C不允许国内⽹站A连接
  在centos7上输⼊以下⼝令:
  [root@centos7 ~]# iptables -A INPUT -s 192.168.191.66 -j REJECT
  此时,我们来测试⼀下centos6和rhel5能否访问centos7,命令为:
  curl 192.168.191.77 或 links 192.168.191.77
[root@rhel5 ~]# curl 192.168.191.77
<h1> Welcome le </h1>
[root@centos6 ~]# curl 192.168.191.77
curl: (7) couldn't connect to host
  可以看出,rhel5可以连接到centos7,但是centos6不能连接到centos7。我们现在的需求就是希望centos6可以借助于rhel5访问centos7,⽅法也很简单,接下来就给⼤家说⼀说。
3)动态端⼝转发
⾸先,我们在6机器上确认已经开启的端⼝有哪些:
  我们使⽤1080端⼝,从上图中我么已经看出,1080端⼝没有被占⽤,所以我们可以使⽤~
  接着我们建⽴动态转发的隧道(6上输⼊以下命令):
  ssh -D 1080 -fN 192.168.191.55
在这⾥,我们可以在rhel5上查看到centos6的连接:
4)设置代理rhel5访问centos7,命令如下(在centos6上输⼊):
5)在图形化界⾯,在centos6上的firefox浏览器设置代理:
  我们的实验圆满完成ヾ(✿ ▽ )ノ

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。