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

  • Post author:
  • Post category:其他



很郁闷的现网登录

实际工作中,现网需要维护和管理的服务器通常不只一台,而是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端口。 Beta和Gamma这两台服务器不能从公网直接访问,只有SSH登录Alpha服务器后,通过Alpha服务器访问。 所有服务器都提供SSH服务,各服务器的用户名密码就是它的主机名(如:Alpha服务器的登录用户名/密码是alpha/alpha)。

好了,现在我们不想每次SSH登录Beta服务器都要先登录Alpha,这样太麻烦。上传/下载文件也很不方便。我们希望把Beta的22端口给“映射”出来。 这样,我们就可以直接穿越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端口,连接这个端口就相当于连接到了Gamma的22端口。

其实,上面的操作建立的是两条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功能多得去了,好好利用,将会造福全人类。