使用SSH隧道实现多层主机大穿越

很郁闷的现网登录

实际工作中,现网需要维护和管理的服务器通常不只一台,而是N多台(N>3)的有木有???很不幸,绝大多数现网环境只有一台服务器提供了公网地址,有时甚至只有一个端口允许被允许使用--那就是端口22

这就是说,我们只能通过SSH登录到现网环境的一台服务器上,然后在以该服务器为跳板,继续SSH登录别的服务器。超繁琐的有木有???

如果要上传文件到内部一台服务器,需要先用SFTP上传到公网允许直接访问的服务器,然后再第二次传到其它服务器。下载文件同也这样需要这样多次传递。传来传去被累死的有木有???

更悲催的环境是:要访问某服务器D,需要先登录A,然后通过A登录B,然后登录C,最后才能登录D

穿越

电视剧天天穿越,搞IT的没理由不紧跟时代潮流,我们也需要穿越。穿越的道具就是SSH隧道

假设有如下现网环境:

+-----------+   (SSH)   +-----------+

|   Alpha   | ===++===> |   Beta    |

| 220.0.0.1 |    ||     | 10.0.0.2  |

+-----------+    ||     +-----------+

                 ||

                 ||     +-----------+

                 ++===> |   Gamma   |

                        | 10.0.0.3  |

                        +-----------+

有三台服务器,Alpha允许公网访问,并且只开放了一个SSH端口--22端口。 BetaGamma这两台服务器不能从公网直接访问,只有SSH登录Alpha服务器后,通过Alpha服务器访问。所有服务器都提供SSH服务,各服务器的用户名密码就是它的主机名(如:Alpha服务器的登录用户名/密码是alpha/alpha)。

好了,现在我们不想每次SSH登录Beta服务器都要先登录Alpha,这样太麻烦。上传/下载文件也很不方便。我们希望把Beta22端口给映射出来。这样,我们就可以直接穿越Alpha,直捣Beta

如果现在自己用的电脑是Windows服务器,那么如何建立这个SSH穿越隧道?首先,你需要准备一个SSH客户端工具:plink.exe(这个工具就相当于Linux服务器下的ssh命令,也就是说,如果你自己用的电脑是Linux系统,下面的所有命令都可以用ssh来代替plink.exe。)

然后,在控制台模式下输入如下命令:

plink.exe -N -pw alpha -L 127.0.0.1:10022:10.0.0.2:22 alpha@220.0.0.1

(注:如果有防火墙提示,请选择允许。)

运行后,plink.exe不会退出,会一直运行,你也不用关闭它。这时在你的电脑上,将会建立起一个监瑞脑消金兽听端口10022别小看它,它就是本次穿越的入口。连接这个端口就相当于连接了Beta服务器的22端口。相当于建立了如下形式的SSH穿越隧道:

+-----------+  (SSH)   +-----------+   (SSH)   +-----------+

| Your PC   | =======> |   Alpha   | ========> |   Beta    |

|           |          | 220.0.0.1 |           | 10.0.0.2  |

+-----------+          +-----------+           +-----------+

| 10022 Port|--------------------------------->|  22 Port  |

+-----------+           (穿越了)                +-----------+

然后,你只需要在你的SSH客户端软件(如:SecureCRT)中立一个到127.0.0.1:10022的连接,就直接连到Beta上了。使用SFTP连接127.0.0.1:10022就可以直接上传、下载Beta服务器上的文件资料了。

哈哈,爽吧!

如果你突然发现Gamma这台Oracle数据库服务器的一个存储过程有问题,需要修改一下,怎么办?现网只开放了一个公网端口22啊?神马端口映射的想法啊,都是白搭,现网环境不允许!。

啊,什么,你说要SSH登录到Alpha,然后用sqlplus连接上去修改? Oh, my god! PL/SQL这么高级的工具不用实在是太可惜了。

现在,有了我们的穿越大法,一切皆有可能! 速速输入命令:

plink.exe -N -pw alpha -L 127.0.0.1:1521:10.0.0.3:1521 alpha@220.0.0.1

好了,现在你用PL/SQL连接127.0.0.1:1521吧,它将直接穿越到达Gamma服务器的1521端口。

超级大穿越

最近在做一个项目,超郁闷。我需要经常访问的服务器是Gmmma,处于这样的网络环境中:

+-----------+   (SSH)   +-----------+   (SSH)     +--------------+

|   Alpha   | ========> |   Beta    | ==========> |   Gamma      |

| 220.0.0.1 |           | 10.0.0.2  |             | 192.168.0.2  |

+-----------+           +-----------+             +--------------+

每次要访问Gamma,需要先登录Alpha,然后登录Beta,最后才能登录Gamma。不知道你晕不晕,反正我是晕了!

现在,让我们来实现一次,跨越两台服务器的超级大穿越:

首先, SSH登录Alpha服务器,然后输入如下命令:

ssh -N -L 127.0.0.1:10022:192.168.0.2:22 beta@10.0.0.2

运行这行命令后,ssh不会退出,也不能让ssh退出!如果你嫌它烦,直接CTRL+z & bg,丢它到后面去。

接下来,还需要在自己的电脑上输入命令:

plink.exe -N -pw alpha -L 127.0.0.1:20022:127.0.0.1:10022 alpha@220.0.0.1

这样,就在自己电脑上建立了一个20022端口,连接这个端口就相当于连接到了Gamma22端口。

其实,上面的操作建立的是两条SSH穿越隧道: 一条是自己电脑的20022端口到Alpha服务器的10022端口,另一条是Alpha服务器的10022端口到Gamma服务器的22端口。这两个隧道首尾相连,形成一个超长的隧道,从而实现了本次所期望的超级大穿越:

+-----------+               +-----------+   (SSH)   +-----------+   (SSH)     +--------------+

| 你的电脑  | ============> |   Alpha   | ========> |   Beta    | ==========> |   Gamma      |

|           |               | 220.0.0.1 |           | 10.0.0.2  |             | 192.168.0.2  |

+-----------+               +-----------+           +-----------+             +--------------+

|20022端口  | ------------> | 10022端口 | ----------------------------------> | 22端口       |

+-----------+               +-----------+                                     +--------------+

 

穿越原理

下面来介绍一个上面提到的建立SSH穿越隧道的基本原理。建立SSH隧道这里最主要使用ssh客户端工具的-L参数。 “-L”参数主要用来建立本地端口到远端主机指定端口的隧道。“-L”参数的格式是:

-L [本地监瑞脑消金兽IP:]本地监瑞脑消金兽听端口号:目标主机IP:目标端口号

(其中,“本地监瑞脑消金兽IP”可以省略,省略的话就认为是“0.0.0.0”,但为了安全性考虑,请务必使用“127.0.0.1”做为本地监瑞脑消金兽听端口,而不要使用默认的“0.0.0.0”。)

使用“-L”参数运行ssh客户端工具后,ssh客户端工具将会一直运行而不会退出,并根据本地监瑞脑消金兽听端口号建立一个监瑞脑消金兽听端口。当有程序连接该端口后,立即通过SSH隧道,通知SSH的远端主机连接目标主机IP:目标端口号,最终建立隧道。

比如:前面提到的一条命令plink.exe -N -pw alpha -L 127.0.0.1:1521:10.0.0.3:1521 alpha@220.0.0.1在其被执行后,客户端工具plink.exe将会持续运行,建立起一条SSH隧道,隧道的一端是运行plink.exe的本地电脑,另一端则是Alpha服务器。然后plink.exe会在本地电脑建立监瑞脑消金兽听端口1521。一旦有程序连接本地的1521端口, plink.exe将立即通知SSH隧道的另一端(也就是Alpha服务器)去连接“10.0.0.3:1521”这个目标主机IP及端口,并建立起本地1521端口与10.0.0.3:1521端口的传输通道。就这样,SSH实现了我们所期望的穿越。

“-N”参数,它是指仅仅是希望建立起一条SSH隧道,不需要远端主机执行命令。

“-pw”参数,它是指定了SSH的登录密码。(注:Linux下的ssh命令没有该参数。)

其它参数: ssh客户端还有其它很多与建立隧道相关的参数,如“-R”,还有更有意思的“-D”大家可以用Linux的男人(“man”)看看,这个抛出来的砖就不多说了,希望有玉的都被引出来。

安全考虑

现网为什么只允许一台服务器的22端口对公网开放,很大程度是出现安全性的考虑,我们这里建立了方便我们使用的隧道,会不会影响目标网络的安全性?这是我们不得不考虑的问题。

我只能说,对安全性有一定影响,但并不大:

首先,建立本机与目标服务器的隧道后,极大的方便了我们管理和维护目标主机,但是所有操作并没有在目标网络上多开放端口。唯一新开的一个端口是本机的端口,还是使用“127.0.0.1”的监瑞脑消金兽IP地址建立的(这里得强调一下,建立隧道时,本地监瑞脑消金兽IP”务必使用“127.0.0.1”),也就是说,隧道建立后,也有本机能使用这个隧道,网络上的任何其它主机都无法使用这个隧道,这个隧道实际是私有的。它和我们平时先SSH到公网主机,再通过公网主机跳到到内网其它主机是性质是一致的,只是为我们省略一些操作步骤及麻烦事。

另外,这个隧道是临时的,当SSH客户端程序退出后,隧道即刻消失。

要说隧道被非法利用,最有可能的是,运行SSH客户端程序的电脑已经被种了木马程序,然后在隧道建立后,黑客利于木马远程偷偷的控制这台电脑,使用这个临时建立的隧道进行一些非法的操作。

总结

SSH是一个安全传输协议,最常见的用途是登录目标主机,进行命令处理--相当于基于安全连接的Telnet。另一个常见的用途是文件传输(SFTP)。其实,SSH功能多得去了,好好利用,将会造福全人类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值