SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。此外, SSH还能够将其他 TCP 端口的不安全网络数据通过 SSH 链接进行安全转发,并自动提供加、解密服务。通常称这一过程为“隧道”。这正是由于SSH 为其他不安全的 TCP 链接提供了一个安全的通道来进行传输而得名。此外,如果工作环境中的防火墙限制了一些网络端口的使用,但却允许SSH 的连接,那么可以通过将 TCP 端口进行转发以便使用 SSH进行通讯。
1、本地端口转发
假设有这样三台主机X,Y和Z。
它们的IP分别为
主机X 地址 IPX
主机Y 地址 IPY
主机Z 地址 IPZ
现在主机X需要访问主机Z中的某项服务。然而,由于各种原因主机X到Z暂时无法访问。幸运的是,主机Y可以访问Z,而X又可以访问到Y。最终,可以通过ssh的端口转发实现X–>Z的访问。
在主机X上执行以下命令:
ssh -L 13306:IPZ:3306 jacknichao@IPY```
该命令表示绑定本地主机(主机X)的13306端口,然后指定主机Y,将所有的数据转发到目的主机Z的3306端口。
需要注意的是,以上命令只是绑定主机X的环回地址即127.0.0.1,即只有本地进程能够访问,并通过该端口进行数据转发
如果此时存在另一个主机M(设IP为IPM),想要通过主机X访问到Z上的某个服务,即主机M通过主机X的端口进行数据转发。数据链路如下图所示
![这里写图片描述](https://img-blog.csdn.net/20171016212926969?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFja19uaWNoYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
那么可以在**主机X**执行以下命令:
``` ssh –L IPM:13306:IPZ:3306 root@IPY ```
该命令表示,在主机X上只接受来自主机IPM的端口转发请求。此时主机M将数据转发到主机X的13306端口上即可访问主机Z的特定服务了。
如果我们允许任何主机的都能访问主机X的端口,并将请求转发到目的主机,可以使用如下命令
ssh –L 0.0.0.0:13306:IPZ:3306 root@IPY
该命令将绑定的IP设为0.0.0.0,即表示允许任何远程主机访问主机X的13306端口,并对数据进行转发。
完成以上功能还可以使用如下命令
ssh –L -g 13306:IPZ:3306 root@IPY
“`
使用参数 -g(允许远程机器使用本地端口转发)起到的效果与绑定到0.0.0.0一样
2、远程转发
假设此时的主机Y是一台内网地址,主机Y可以连接主机X,相反主机X却不能连接主机Y。此时,本地端口转发就不能解决问题了。
解决办法是:因为主机Y可以连接主机X,那么先让主机Y连接主机X,再让主机X利用这条连接去做端口转发,由此可以实现主机X连接主机Z。
在主机Y上执行以下命令:
ssh –R 13306:IPZ:3306 IPX
以上命令R参数接收3个值,分别为远程主机端口:目标主机:目标主机端口。
该命令是指:让主机X监听它的13306端口,然后所有数据经过主机Y转发到主机Z的3306端口。此时,对于主机Y来说主机X的端口为远程端口,所以此种方法被称为“远程端口转发”.
3、动态端口绑定
假设此时需要在主机X上访问facebook等国外网站,然而当前想直接访问这样的网站是办不到的。幸运的是,你有一台国外的虚拟主机主机Y。那么,你只需在主机X上做一个动态端口转发即可。
在主机A上执行以下命令:
ssh –D 8080 root@IPY
SSH会建立一个socket,去监听本地的8080端口。一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。此时只需在浏览器中配置主机A的ip地址为代理服务器则即可访问facebook等国外网站了。