SpongeBob

人生三种境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
扩大
缩小

ssh端口转发详解

 

        SSH有三种端口转发模式,本地端口转发(Local Port Forwarding)远程端口转发(Remote Port Forwarding)以及动态端口转发(Dynamic Port Forwarding)。对于本地/远程端口转发,两者的方向恰好相反,动态端口转发则可以用于科学上网。

 

一.ssh端口转发简介

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

        总的来说 SSH 端口转发能够提供两大功能:

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

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

 

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

 

二.ssh本地转发

 命令:-L localport:remotehost:remotehostport sshserver

 命令中的L参数一共接受三个值,分别是"本地端口:目标主机:转发主机端口 转发主机IP",它们之间用冒号分隔。

 选项:-f 后台启用

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

            -g 启用网关功能

 实验: 

 有一个用户A需要从外部连接到内部的C服务器,C服务器只允许telnet连接(23端口)访问,不允许外部直接访问,B服务器是一个ssh服务

 rhel5为A用户,centos6为B服务器,centos7为C服务器

1.设置C服务器不能被A用户连接,开启B服务器的端口23

[root@centos7 ~]# iptables -A INPUT -s c5 -j REJECT

这个时候A用户不能连接到C服务器

[root@c5 ~]# ssh c7
The authenticity of host 'c7 (172.18.250.99)' can't be established.

2.建立本地转发的隧道

[root@c5 ~]# ssh -L 9527:c7:23 -fN c6
root@c6's password: 

我们使用ss -nt命令发现A用户已经连接上了跳板机B的端口

[root@c5 ~]# ss -nt
State       Recv-Q Send-Q                        Local Address:Port                          Peer Address:Port 
ESTAB       0      0                            172.18.253.184:41277                        172.18.250.66:22    
ESTAB       0      164                   ::ffff:172.18.253.184:22                    ::ffff:172.18.253.25:56725

3.在rhel5上使用9527端口连接自己

[root@c5 ~]# telnet 127.0.0.1 9527    
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
CentOS release 6.9 (Final)
Kernel 2.6.32-696.el6.x86_64 on an x86_64
Centos7 login: docker 
Password:
Last login: Mon Apr  9 21:33:43 from c6

最后我们实现了A用户连接到C服务器,具体的实现过程为:

当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23data -- localhost:9527 --localhost:XXXXX --sshsrv:22 --sshsrv:YYYYY --telnetsrv:23

 

三.ssh远程转发

命令:-R sshserverport:remotehost:remotehostport sshserver

实验:

企业内部C服务器只允许telnet连接(23端口)访问,不允许外部直接访问,B服务器是一个ssh服务器;有一个用户需要从外部连接到企业内部的C服务器。B机器访问A用户,给A用户转发

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

[root@centos7 ~]# iptables -A INPUT -s c5 -j REJECT

2.开启隧道转发

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

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

[root@centos6 ~]# ss -ntl
[root@centos6 ~]# ssh -L 9527:c7:23 -fN c5

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

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

[root@c5 ~]# telnet 127.0.0.1 9527    
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
CentOS release 6.9 (Final)
Kernel 2.6.32-696.el6.x86_64 on an x86_64
Centos7 login: docker 
Password:
Last login: Mon Apr  9 21:33:43 from c6

登陆成功!

 

四.ssh动态转发

原理:当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet

 

命令:ssh -Nf -D [local_A_address]:local_A_port via_B_server

参数: -D,dynamic,动态端口转发

应用:

本地和远程端口转发,都限定了目标服务器以及目标服务器的端口;而动态端口转发,A把B作为了自己的全权代理,不限定目标服务器及其端口;这里要求在A上,做下代理设置,比如浏览器的代理设定为自己的IP:PORT;本地端口转发和远程端口转发,其实都可看着是动态端口转发(代理)的子集;三者和一般代理的目的和场景都一致,区别在于这里自己A和代理服务器B之前的所有连接都是基于加密的SSH。

 

posted on 2018-09-08 14:21  青山揽流萤  阅读(884)  评论(0编辑  收藏  举报

导航