端口转发的概念和应用

      

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

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

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


本地端口转发

        wKioL1naJ2eCL-fIAABYgp-QXww679.png-wh_50

    a要访问c先将telnet用ssh封装,传到b后,解封后,再以telnet方式访问c,此时的c认为是b通过telnet再链接自己,而其实是a在链接(要保证防火墙上的端口是打开着的,如果没打开,就进不来了,需要进行远程端口转发,后面解释)

实例:

 acentos5,b是centos6,c是centsos7,首先在a上制定防火墙策略,即禁止a访问,如下指令

iptables -A INPUT -s 192.168.37.105 -j REJECT

   然后启动a的telnet服务

systemctl start telnet.socket

    接下来在a上执行如下命令

ssh -L 9527.192.168.37.107:23 -fN 192.168.37.106

     9527是a的发出端口,在执行前,最好检查下(ss -nutl)有么有程序占用着这个端口,后面的ip地址是目标也就是c的ip地址,23是c的接收端口,在后面的地址是b的地址,也就是接收ssh链接的b,fn是后台启用且不打开7的shell,而是处于等待状态,执行完后,隧道已经就建立了,可使用ss -nt查看

此时,用a链接c,就执行如下命令

telnet 127.0.0.01 9527

   这时,可以在c上执行,下面的命令

ss -ntl

    能够查看到6正在链接,在b上使用同样的命令,看到a在链接,也就是说测试此时隧道已经建立起来。


远程端口转发

     与本地端口转发类似,但是此时防火墙上的端口是关闭的,所以此时用远程端口转发即可解决问题。此时,防火墙已经打开,端口不可访问,只准往外链接不能外,部往内部链接,因此要想建立链接需要从内部链接外部,也就是此时命令是在b中打的,执行如下命令

ssh -R 9527.192.168.37.107:25 -fN 192.168.37.105

也就是l换成R,第一个ip是最终要访问的7第二个ip是此时充当服务器的ab此时扮演的是客户端,执行完成后,输入指令

telnet 127.0.0.1 9527

这里的地址和端口号是a自己的地址和端口号,这样一个远程端口转发就完成了


动态端口转发

   

     当用firefox访问internet时,本机的1080端口做为代理服务器, firefox的访问请求被转发到sshserver上,由sshserver替之访问internet在本机firefox设置代理socket proxy:127.0.0.1:1080,它的命令格式如下,

ssh -D 1080 root@sshserver

动态端口转发,和本地和远程端口转发不一样,在动态端口转发中,目标主机地址和端口都不固定,具体转发到哪里,可以通过代理服务器由自己来指定。