通过多个 SSH 跳转查询 Redshift

通过多个 SSH 跳转查询 Redshift

我想从笔记本电脑上运行的 IDE (IntelliJ) 查询 AWS Redshift 集群。此集群只能从我们 VPC 中的 EC2 实例直接访问。

在此处输入图片描述

该 EC2 实例无法从我的笔记本电脑直接访问:必须先ssh访问我们数据中心的另一台服务器,然后再ssh访问我们 VPC 中的 EC2 实例,才能通过psql客户端在 Reshift 集群上运行查询。其他用户和cron'd shell 脚本也会从同一个 EC2 实例在该集群上执行命令。

我想从我的笔记本电脑设置一条 SSH 隧道,通过我们数据中心的中间服务器,到 EC2 实例,最终到 Redshift 集群,而不影响其他用户/脚本。

我尝试过这个:

ssh -fNL 5439:localhost:22 host_in_datacenter ssh -fNL 22:localhost:22 ec2_instance ssh -fNL 22:localhost:5439 reshift_host

返回:

[08P01] Protocol error.  Session setup failed.

... 当我尝试通过客户端连接时。

我见过的大多数用于访问远程数据库的 SSH 链接示例都只有一个跳跃到运行数据库的主机,而最后一个跳跃最终到达数据库主机本身。

是否可以在不影响其他用户的情况下从我的笔记本电脑到 Redshift 集群创建 SSH 隧道?如果可以,您能看出我做错了什么吗?

答案1

看起来你可能不理解 SSH 转发语法。请不要介意,但这是一个典型的例子,说明为什么复制/粘贴软件开发和系统管理如此危险。人们在网上寻找如何做事的例子,却懒得去研究到底发生了什么。

让我们分解一下你的命令的一部分:

ssh -fNL 5439:localhost:22 host_in_datacenter

这意味着接收流量localhost:5439并将其转发到您正在 ssh 连接的服务器上的端口 22。这没有任何意义,而且永远不会起作用,因为它是一个在端口 22 上监听的 SSH 服务器,它不知道如何处理非 SSH 流量。

你要做的是选择其他随机的高端口,并用它来通过你的链传递流量。像这样:

ssh -fNL 5439:localhost:12345 host_in_datacenter ssh -fNL 12345:redshift_host:12345 ec2_instance

不过说实话,这很笨拙。如果我是你,我要么让你的网络崩溃,这样你只需要通过一个主机就可以访问 Redshift或者在 AWS 中设置 VPN,以便您可以直接从工作站连接。

相关内容