通过 AWS SSM 代理命令设置 SSH 隧道

Posted

技术标签:

【中文标题】通过 AWS SSM 代理命令设置 SSH 隧道【英文标题】:Setting up SSH tunnel through AWS SSM proxycommand 【发布时间】:2020-06-17 20:21:02 【问题描述】:

我的“问题”:

我想通过 SSH 隧道连接到我的 DocumentDB。我不确定这是否可能,但我想尝试一下。

是什么阻止了我这样做:

在提供我的 EC2 pem 文件和数据库(通用 RDS pem)的同时,我无法转而转发 DocumentDB 端口。

我的设置:

我已经在 ECS Fargate 中设置了我的基础架构,并连接到了 DocumentDB。唯一可供公众使用的端口是 80 和 443(80 重新路由到 443),我想保持这种状态。我已经设置了一个 EC2 实例(没有传出路由),当需要通过 AWS SSM 连接时,我正在启动(并且我想保持这种状态)。

EC2 实例是 Amazon Linux 2 AMI。

现在我已经设置了一个代理命令来通过 SSH 连接,而无需在我的 ~/.ssh/config 文件中使用 SSM 打开端口。

# --- SSH over AWS Session Manager ---
host i-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

按预期工作,我能够通过 SSH 连接并通过 SCP 从 EC2 实例复制文件。我可以使用这个 SSH 连接(或未更改的 AWS SSM 连接)通过 mongoshell 访问我的 DocumentDB,但现在我问自己是否可以打开一个 SSH 隧道到它。

我尝试过的:

ssh -L 8022:my-document-db-instance.amazonaws.com:27017 ssm-user@i-ec2-instance -i ~/.ssh/ec2-instance.pem -v

到 EC2 实例的 SSH 隧道已成功创建(至少看起来如此)并且没有显示任何错误,但我无法通过 Robo3T(或 mongoshell)连接到数据库。我怀疑在隧道中打开连接是错误的,但我不知道如何启动它。

我尝试打开通往 EC2 实例的隧道,然后通过 Robo3T 从那里建立隧道,但效果不佳(部分原因是我不知道要连接到 EC2 上的哪个端口)。

我不得不承认我不是我想成为的 Linux 管理员。

【问题讨论】:

您正在超时或出现其他错误? 我不这么认为,至少我没有看到任何错误消息。我一直在尝试ssh -N -L 27018:localhost:27017 ssm-user@i-0abe…3a1 -i ~/.ssh/sos-key-dev.pem -v 并收到错误channel 2: open failed: connect failed: Connection refused debug1: channel 2: free: direct-tcpip: listening port 27018 for localhost port 27017, connect from 127.0.0.1 port 58127 to 127.0.0.1 port 27018, nchannels 3 似乎我无法在这里格式化。 老实说,我几乎不知道我在这里做什么(通过隧道),我只是想尽一切办法让它发挥作用。 【参考方案1】:

我在通过 aws 会话管理器将端口转发到 rds(mysql) 时遇到了类似的问题。您可以尝试以下选项

    确保 DocumentDB 已启动并运行。 确保附加到 DocumentDB 的安全组仅从堡垒主机的安全组打开入站端口 (27017)。 确保附加到 EC2 实例的安全组已打开出站端口 (27017) 通过 Robo3T 连接时将 localhost 更改为环回地址 (127.0.0.1)。 使用 ec2-user 代替 ssm-user。

【讨论】:

以上是关于通过 AWS SSM 代理命令设置 SSH 隧道的主要内容,如果未能解决你的问题,请参考以下文章

如何在 kubernetes pod 中正确创建用于创建 SSH 隧道的 sidecar 容器

通过 SSH 隧道连接到 .Net Core 中的 AWS DocumentDb

Spring boot Resttemplate通过ssh隧道的动态代理设置连接不识别远程DNS

如何配置系统通过 ssh 反向隧道/代理使用 git?

使用 JSch 创建一个通过 SSH 隧道化的 SOCKS 代理

通过 SSH 端口转发连接到 AWS