我在通过 ec2 实例 (Ubuntu) 使用会话管理器访问私有子网中的 AWS RDS 实例时遇到问题。
使用 AWS 会话管理器进行端口转发 -
aws ssm start-session --target $INSTANCE_ID \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":[3307],"localPortNumber":["8000"]}' \
--profile=production \
--region=us-east-1`
现在本地8000端口成功转发到EC2的3307端口。
lsof -nP +c 15 | grep LISTEN
session-manager 59744 xrage 12u IPv4 0xa6c821d0a800e9a1 0t0 TCP 127.0.0.1:8000 (LISTEN)
EC2 实例有一条 iptable 规则,将端口 3307 上的所有流量转发到端口 3306 (MYSQL PORT) 上的 rds 主机。
sudo iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 3307 -j DNAT --to-destination <rds_private_ip>:3306
这允许我从 ec2 访问所需端口上的远程主机,但仍然无法在端口 8000 上本地访问远程主机。
本地计算机上的网络详细信息 -
- 不使用任何代理
- Mac 上的防火墙被禁用
因此很明显,SSM 设置正在工作,但其他东西正在阻止此流量,这里需要一些帮助。
答案1
当你说远程主机可以访问MySQL实例时,你尝试过该端口(telnet)或mysql命令行客户端,只是为了确认?
假设上述问题是肯定的,我将继续下一步。据我了解,AWS-StartPortForwardingSession 旨在涵盖以下场景:您的 EC2 上正在运行某些内容,例如您手动安装并安装的 MySQL 数据库。您希望通过 SSM 将流量从您的工作站(例如)转发到在 EC2 上运行的 MySQL 实例。这就是 AWS-StartPortForwardingSession 的设计目的。
在您的情况下,EC2更像是一个堡垒主机,而您的MySQL实例是RDS类型。因此,您的 EC2 不托管任何东西——它只是连接到 RDS 的网关。
假设上述假设是正确的,我将使用 AWS-StartSSHSession 代替(https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html)。
完整的答案会很冗长,但我几个月前才这样做:https://medium.com/@clearwaterstream/recipe-connect-to-an-rds-database-in-a-private-subnet-from-your-workstation-over-https-c66db6ead9f0
答案2
2022 年 5 月 27 日,AWS宣布支持为了使用会话管理器将端口转发到远程主机:
首先,请在要与其建立端口转发会话的托管实例上安装 SSM 代理版本 3.1.1374.0 或更高版本。您可以使用会话管理器文档从命令行启动端口转发会话
AWS-StartPortForwardingSessionToRemoteHost
。
要启动端口转发会话,请从 CLI 运行以下命令。将<EC2_INSTANCE_ID>
、<RDS_DB>
、<RDS_PORT>
和的值替换<LOCAL_PORT>
为您的信息:
aws ssm start-session \
--target <EC2_INSTANCE_ID> \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["<RDS_DB>"], "portNumber":["<RDS_PORT>"], "localPortNumber":["<LOCAL_PORT>"]}'
更多详细信息请参阅 AWS 文档:AWS Systems Manager - 用户指南 - 会话管理器 - 启动会话(端口转发到远程主机)。
相关 AWS 博客文章:
相关 GitHub 问题和拉取请求:
- aws/amazon-ssm-agent - 问题 #208 - 功能请求:转发到远程端口
- aws/amazon-ssm-agent - 问题 #240 - 功能请求:允许为 AWS-StartSSHSession 指定 IP #240
- aws/amazon-ssm-agent - Pull 请求 #389 - 支持指定主机进行端口转发
相关 StackOverflow 问题: