如何在AWS上创建多ssh隧道?

时间:2017-01-15 06:34:08

标签: amazon-web-services ssh

我在端口p2上的host2上有一个正在运行的实例。我想通过localhost访问:p2。

我可以用h1.pem ssh到host1,从host1我可以用h2.pem ssh到host2。

1 个答案:

答案 0 :(得分:2)

我相信您描述的情况是您可以从localhost(主机h0)访问主机h1(IP地址aaaa),主机h1可以访问主机h2(IP地址bbbb),但是h0没有连接到主持人h2。

您希望通过h1从h0连接到h2,并建立从h0上的端口到h2上的目标端口的TCP隧道。

我会教你如何捕捉这条鱼,而不仅仅是为你捕捉它。

首先,假设您已经从h0直接访问到h2,您将如何建立SSH连接?

你会这样连接:

ssh -i h2.pem h2user@b.b.b.b

......你可以建立这样的隧道......

ssh -i h2.pem h2user@b.b.b.b -L 31337:127.0.0.1:3306

这将接受h0端口31337上的连接,并将其连接到端口3306上的h2的环回适配器127.0.0.1。

我相信你想要的。

但是,您无法直接访问h2,因此您需要通过h1 代理 SSH连接。

从h0开始,我们可以像这样连接到h1:

ssh -i h1.pem h1user@a.a.a.a

所以我们接受这个信息,并告诉SSH我们想用它来创建一个ProxyConnection到h1,我们将运行nc命令,它建立一个远程连接并绑定它有效载荷返回stdin和stdout。 SSH会将h2的主机名和SSH端口传递给在h1上运行的nc,这将通过SSH连接传回给我们h1,我们将使用它来通知SSH到h2。我们将此作为ProxyCommand传递给我们从h0到h2的ssh尝试。

'-o ProxyCommand=ssh -i h1.pem h1user@a.a.a.a nc %h %p'

将所有内容放在一起(为了清晰起见,换行符):

ssh '-o ProxyCommand=ssh -i h1.pem h1user@a.a.a.a nc %h %p' \
    -i h2.pem \
    h2user@b.b.b.b \ 
    -L 31337:127.0.0.1:3306

你有它。

在引擎盖下,h0与h1建立ssh连接,运行nc b.b.b.b 22。 h0上的SSH使用这些流通过已经连接到h1的连接创建到h2的第二个ssh会话。隧道通过此连接直接与h2协商。

请注意,在这种情况下,键h1.pem和h2.pem都在本地计算机上。 h2.pem键根本不需要出现在h1上。

另请注意,这与AWS无关。这只是标准的SSH使用。

如果您只想允许隧道,但是您不想或不需要在h2上启动shell,则可以在命令末尾添加-N选项。

或者,如果您想要一个漂亮的小监视器显示您的隧道仍在运行,您可以将其添加到上面显示的完整ssh命令的最后。请务必完全按照所示'包含所有内容。

'perl -MPOSIX -e '\''$|=1; while(sleep(1)){ print "\e[0GConnected " . POSIX::strftime("%Y-%m-%d %H:%M:%S",gmtime)}'\'''

这将在控制台上显示h0“已连接YYYY-mm-dd HH:MM:SS”的消息,确认您的连接仍然是端到端建立。