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

如上图所示,使用了端口转发之后,TCP 端口 A 与 B 之间现在并不直接通讯,而是转发到了 SSH 客户端及服务端来通讯,从而自动实现了数据加密并同时绕过了防火墙的限制。
本地端口转发
我们先来看第一个例子,在实验室里有一台 LDAP 服务器(LdapServerHost),但是限制了只有本机上部署的应用才能直接连接此 LDAP 服务器。如果我们由于调试或者测试的需要想临时从远程机器(LdapClientHost)直接连接到这个 LDAP 服务器 , 有什么方法能够实现呢?
答案无疑是本地端口转发了,它的命令格式是:
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
在 LdapClientHost 上执行如下命令即可建立一个 SSH 的本地端口转发,例如:
$ ssh -L 7001:localhost:389 LdapServerHost
如此就实现了将389端口映射到7001上
远程端口转发
我们来看第二个例子,这次假设由于网络的原因我们不能用 SSH 直接从 LdapClientHost 连接到 LDAP 服务器(LdapServertHost),但是反向连接却是被允许的。那此时我们的选择自然就是远程端口转发了。
它的命令格式是:
ssh -R <local port>:<remote host>:<remote port> <SSH hostname>
远程转发即将本机端口映射到远程主机。假设我们需要将一台机器的443端口实现远程(192.168.3.14)访问,先将本机的443端口映射到远程主机(192.168.3.14)的20443端口
ssh -CfgN -R 20443:127.0.0.1:443 root@192.168.3.14
再在远程主机上将远程主机的127.0.0.1:20443端口映射到192.168.3.14:20443
ssh -CfNg -L 192.168.3.14:20443:127.0.0.1:20443 root@127.0.0.1
如此一来就实现了访问192.168.3.14:20443就是访问127.0.0.1:443的效果
映射到全局端口
上面的命令可以一行命令实现吗?是的可以,我们首先需要修改一下ssh的配置文件/etc/ssh/sshd_config中的GatewayPorts option为yes
GatewayPorts option needs to be enabled (set to yes or clientspecified) for this to work (check file /etc/ssh/sshd_config)
然后通过这一条命令就可以实现了
ssh -CfNg -R 0.0.0.0:20443:127.0.0.1:443 root@192.168.3.195