我在端口p2上的host2上有一个正在运行的实例。我想通过localhost访问:p2。
我可以用h1.pem ssh到host1,从host1我可以用h2.pem ssh到host2。
答案 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”的消息,确认您的连接仍然是端到端建立。