首页 > 解决方案 > 通过 AWS SSM 代理命令设置 SSH 隧道

问题描述

我的问题”:

我想通过 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 实例复制到 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 管理员。

标签: amazon-web-servicesamazon-ec2sshssh-tunnelaws-ssm

解决方案


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

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

推荐阅读