当前位置 主页 > 服务器问题 > Linux/apache问题 >

    SSH端口转发,本地端口转发,远程端口转发,动态端口转发详解

    栏目:Linux/apache问题 时间:2019-10-14 18:00

    第一部分 SSH端口转发概述

    当你在咖啡馆享受免费 WiFi 的时候,有没有想到可能有人正在窃取你的密码及隐私信息?当你发现实验室的防火墙阻止了你的网络应用端口,是不是有苦难言?来看看 SSH 的端口转发功能能给我们带来什么好处吧!

    SSH端口转发概述

    让我们先来了解一下端口转发的概念吧。我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。

    它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。

    例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。

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

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

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

    图 1. SSH 端口转发

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

    第二部分 SSH本地端口转发与远程端口转发

    SSH本地端口转发实例分析

    我们先来看第一个例子,在实验室里有一台 LDAP 服务器(LdapServerHost),但是限制了只有本机上部署的应用才能直接连接此 LDAP 服务器。

    如果我们由于调试或者测试的需要想临时从远程机器(LdapClientHost)直接连接到这个 LDAP 服务器 , 有什么方法能够实现呢?

    答案无疑是本地端口转发了,它的命令格式是:

    ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

    在 LdapClientHost 上执行如下命令即可建立一个 SSH 的本地端口转发,例如:

    $ ssh -L 7001:localhost:389 LdapServerHost

    图 2. 本地端口转发

    这里需要注意的是本例中我们选择了 7001 端口作为本地的监听端口,在选择端口号时要注意非管理员帐号是无权绑定 1-1023 端口的,所以一般是选用一个 1024-65535 之间的并且尚未使用的端口号即可。

    然后我们可以将远程机器(LdapClientHost)上的应用直接配置到本机的 7001 端口上(而不是 LDAP 服务器的 389 端口上)。之后的数据流将会是下面这个样子:

    我们在 LdapClientHost 上的应用将数据发送到本机的 7001 端口上,

    而本机的 SSH Client 会将 7001 端口收到的数据加密并转发到 LdapServertHost 的 SSH Server 上。

    SSH Server 会解密收到的数据并将之转发到监听的 LDAP 389 端口上,

    最后再将从 LDAP 返回的数据原路返回以完成整个流程。

    我们可以看到,这整个流程应用并没有直接连接 LDAP 服务器,而是连接到了本地的一个监听端口,但是 SSH 端口转发完成了

    剩下的所有事情,加密,转发,解密,通讯。

    这里有几个地方需要注意:

    SSH 端口转发是通过 SSH 连接建立起来的,我们必须保持这个 SSH 连接以使端口转发保持生效。一旦关闭了此连接,相应的端口转发也会随之关闭。