Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何在AWS上创建多ssh隧道?_Amazon Web Services_Ssh - Fatal编程技术网

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

Amazon web services 如何在AWS上创建多ssh隧道?,amazon-web-services,ssh,Amazon Web Services,Ssh,我在端口p2的主机2上有一个正在运行的实例。我想通过localhost:p2访问 我可以使用h1.pem通过ssh连接到host1,从host1通过h2.pem通过ssh连接到host2 我相信您所描述的情况是,您可以从本地主机(主机h0)访问主机h1(IP地址a.a.a.a),主机h1可以访问主机h2(IP地址b.b.b.b),但h0与主机h2没有连接 您希望通过h1从h0连接到h2,并建立从h0上的端口到h2上的目标端口的TCP隧道 我会教你怎么钓这条鱼,而不是只为你钓一条鱼 首先,假设您确

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


我可以使用h1.pem通过ssh连接到host1,从host1通过h2.pem通过ssh连接到host2

我相信您所描述的情况是,您可以从本地主机(主机h0)访问主机h1(IP地址a.a.a.a),主机h1可以访问主机h2(IP地址b.b.b.b),但h0与主机h2没有连接

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

我会教你怎么钓这条鱼,而不是只为你钓一条鱼

首先,假设您确实拥有从h0到h2的直接访问权限,您将如何建立SSH连接

您将按以下方式连接:

ssh -i h2.pem h2user@b.b.b.b
ssh -i h1.pem h1user@a.a.a.a
…你可以建一条这样的隧道

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 h2.pem h2user@b.b.b.b
ssh -i h1.pem h1user@a.a.a.a
因此,我们获取该信息,并告诉SSH我们希望使用它创建一个到h1的
ProxyConnection
,在这里我们将运行
nc
命令,该命令建立一个远程连接并将其负载绑定回stdin和stdout。SSH将把h2的主机名和SSH端口传递给在h1上运行的
nc
,这将在到h1的SSH连接上传递给我们,我们将使用它与h2进行SSH对话。我们将其作为
ProxyCommand
传递给从h0到h2的ssh尝试

'-o ProxyCommand=ssh -i h1.pem h1user@a.a.a.a nc %h %p'
将所有内容放在一起(为了清晰起见,请使用换行符):

就在这里

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

请注意,在此场景中,键h1.pem和h2.pem都位于本地计算机上。h1上根本不需要存在h2.pem密钥

还要注意的是,这与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”消息,确认您的连接仍然是端到端建立的。

我相信您描述的是一种情况,即您可以从本地主机(主机h0)访问主机h1(IP地址a.a.a.a),主机h1可以访问主机h2(IP地址b.b.b.b),但h0与主机h2没有连接

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

我会教你怎么钓这条鱼,而不是只为你钓一条鱼

首先,假设您确实拥有从h0到h2的直接访问权限,您将如何建立SSH连接

您将按以下方式连接:

ssh -i h2.pem h2user@b.b.b.b
ssh -i h1.pem h1user@a.a.a.a
…你可以建一条这样的隧道

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 h2.pem h2user@b.b.b.b
ssh -i h1.pem h1user@a.a.a.a
因此,我们获取这些信息,并告诉SSH我们想使用它创建一个到h1的
ProxyConnection
,在这里我们将运行
nc
命令,该命令建立一个远程连接,并将其负载绑定回stdin和stdout。SSH将把主机名和SSH端口h2传递给在h1上运行的
nc
,并在到h1的SSH连接,我们将使用它与h2进行SSH对话。我们将此作为
ProxyCommand
传递到从h0到h2的SSH尝试

'-o ProxyCommand=ssh -i h1.pem h1user@a.a.a.a nc %h %p'
将所有内容放在一起(为了清晰起见,请使用换行符):

就在这里

在引擎盖下,h0与h1建立ssh连接,在h1上运行
nc 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“Connected YYYY-mm-dd HH:mm:SS”,确认您的连接仍然是端到端建立的。

您是否在EC2安全组设置中设置了允许localhost访问host2的权限?让我们澄清一下。您想从localhost ssh连接到h2吗(您无法直接访问)通过h1(您可以访问并且可以访问h2),并且您希望通过ssh会话使用TCP隧道,以便通过localhost和h2之间的端到端ssh连接(通过h1)将localhost:portx的连接发送到h2:portx具有讽刺意味的是,我在这里描述目标的方式显然不是“clari”