SSH端口转发Forwarding及隧道Tunneling

目录

概述

环境及术语约定

本地转发

远程转发

动态转发

多级转发


概述

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

  1. 加密 SSH Client 端至 SSH Server 端之间的通讯数据,保证安全。
  2. 突破网络、防火墙等限制完成一些之前无法建立的 TCP 连接。

SSH一共提供了 3 种端口转发,分别是本地转发(-L参数)远程转发(-R参数)、动态转发(-D参数)。 还可以实现多层转发。

环境及术语约定

  • 本地主机:通常你当前正在使用的这台机器;
  • 目的主机:是需要被访问的最终目的对象;
  • 跳板主机:本地主机与跳板主机网络互通可访问,同时跳板主机与目的主机网络互通可访问。并且跳板主机开启了ssh服务(默认端口22)。

本地转发

使用场景:一台 服务器(目的主机)限制了只有特地主机(如服务器自身)才能直接连接此服务器上的应用。如果我们由于调试或者测试的需要想临时从其他机器(本地主机)访问这台服务器 , 有什么方法能够实现呢?本地端口转发可以做到。

本地端口转发通过参数 -L 指定,命令格式:

ssl  -L  [本地主机bind地址:]本地主机端口:目的主机:目的主机端口  User@跳板主机

举例:ssh -L 55555:192.168.43.203:3000 [email protected]

执行以上命令后:

  • 会提示输入ssh登录[email protected]的密码。登录成功后,会在本地主机上启用55555侦听端口。
  • 登录成功后,通过访问本地主机的55555端口,即可访问到目的主机192.168.43.203:3000。(这里目的主机服务上http service,因此可以在本地主机上访问http://本地主机:本地主机端口 方式进行测试 )
  • 目的主机是由跳板主机进行访问的。如果命令行中目的主机写“localhost”,表示相对于跳板主机而言的localhost,不是相对于本地主机的localhost。
  • 本地主机跳板主机之间是通过ssl协议进行连接的,我们必须保持这个 SSH 连接以使端口转发保持生效。一旦关闭了此连接,相应的端口转发也会随之关闭。只能在新建立 SSH 连接的同时创建端口转发。而不能在一个已经存在的 SSH 连接上,增加端口转发。
  • 本地主机bind地址默认为127.0.0.1,仅在本地主机127.0.0.1上进行侦听。若要在本地主机上其他网卡地址(例如0.0.0.0全部网卡地址)上进行侦听,则可将命令行中本地主机bind地址指定为*号。

通过本地端口转发与直接访问目的主机(若允许直接访问)的区别:

  1. 安全性:本地主机跳板主机之间是通过ssl协议连接,完成加密,转发,解密,通讯。因此他们之间传输的安全的。若允许直接访问远程主机,除非专门增加了安全机制,否则默认是明文传输,不安全。
  2. 突破访问限制: 本地主机跳板主机之间走ssl协议(默认22端口)。可以绕过远程主机的防火墙等限制(比如远程主机可行限制只允许该服务器本地才能访问,或者目的主机不开放3000端口对外访问)

远程转发

使用场景:一台 服务器(目的主机)在内部网络,无法从外部访问。而跳板主机有公网IP连接外网,也能访问内部网络。如何通过跳板主机实现从外部访问内部的目的主机呢?远程端口转发可以做到。

远程端口转发通过参数 -R 指定,命令格式:

ssl  -R  [跳板主机bind地址:]跳板主机端口:目的主机:目的主机端口  User@跳板主机

举例:ssh -R  3389:192.168.43.203:3389 [email protected]

执行以上命令后:

  • 会提示输入ssh登录[email protected]的密码。登录成功后,会在跳板主机上启用3389侦听端口。
  • 登录成功后,通过访问跳板主机的3389端口,即可访问到目的主机192.168.43.203:3389。(这里目的主机服务是远程桌面的3389端口,因此可以通过mstsc跳板主机 访问远程桌面方式进行测试,也可在跳板主机上通过命令curl -vv telnet://localhost:跳板主机端口 方式进行测试 )。
  • 目的主机是由跳板主机进行访问的。如果命令行中目的主机写“localhost”,表示相对于跳板主机而言的localhost,不是相对于本地主机的localhost。
  • 本地主机(既发出以上命令的机器)与跳板主机之间是通过ssl协议进行连接的,我们必须保持这个 SSH 连接以使端口转发保持生效。一旦关闭了此连接,相应的端口转发也会随之关闭。只能在新建立 SSH 连接的同时创建端口转发。而不能在一个已经存在的 SSH 连接上,增加端口转发
  • 跳板主机bind地址默认为127.0.0.1,仅在跳板主机127.0.0.1上进行侦听跳板主机端口。若要在跳板主机上其他网卡地址(例如0.0.0.0全部网卡地址)上进行侦听,则需要将命令行中跳板主机bind地址指定为*号(前提需要确保跳板主机上ssh_config中的GatewayPorts属性为yes,既允许在跳板主机其他网卡上监听)。

动态转发

使用场景:前文的本地转发、远程转发都需要提前知道并指定目的主机的地址和端口。但在代理上网等场景,无法提前指导客户端要访问的网址(且网址也不固定),这时候就需要动态转发了。动态转发是通过SOCKS4或SOCKS5协议完成!

本地端口转发通过参数 -D 指定,命令格式:

ssl  -D  [本地主机bind地址:]本地主机端口  User@跳板主机

举例:ssh -D 44444 [email protected]

当成功执行上面这个命令后。在浏览器中设置代理类型为 SOCKS,代理地址:127.0.0.1,端口4444。即可实现代理上网。

多级转发

  • 先建立第一层转发:

在客户端执行以下命令。从客户端本地转发至跳板主机2222端口(命令中localhost表示相对于跳板主机而言的localhost):

ssh -L 1111:localhost:2222 userA@跳板主机A

  • 再建立第二层转发

登录跳板主机A然后再跳板主机A上执行以下命令。从跳板主机A的2222端口通过跳板主机B转发至目的主机:

ssh -L 2222:目的主机:目的主机端口 userB@跳板主机B

以上两层转发的链路为:

客户端1111端口→(通过ssl)跳板主机A的2222端口→(通过ssl)跳板主机B→目的主机

最终效果就是:访问客户端1111端口,实现访问目的主机。

猜你喜欢

转载自blog.csdn.net/zyplanke/article/details/123223960