很郁闷的现网登录
实际工作中,现网需要维护和管理的服务器通常不只一台,而是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功能多得去了,好好利用,将会造福全人类。