AWS RDS MySQL 连接方式 Demo:公网直连、跳板机与 SSM 隧道对比
本文记录一次 RDS MySQL 连接方式实验:先演示如何让 RDS 暂时公开访问,便于从本机直接连接;再演示更推荐的私有访问方式,包括跳板机和 AWS Systems Manager Session Manager 端口转发。
安全提醒:公网直连只适合短期学习或临时测试,不建议用于生产环境。生产环境应优先将 RDS 放在私有子网中,并通过应用安全组、跳板机或 SSM 隧道进行受控访问。
一、三种连接架构
1. 公网直连 RDS
本地电脑 -- MySQL 3306 --> RDS MySQL
RDS Publicly accessible = Yes
特点:
- 配置简单。
- 本机可以直接访问 RDS endpoint。
- RDS 会暴露在公网访问面上。
- 安全主要依赖安全组 IP 白名单。
适用场景:
- 短期学习。
- 临时验证。
- 非生产测试。
不建议用于:
- 生产数据库。
- 存放敏感数据的数据库。
- 长期运行环境。
2. 通过跳板机访问 RDS
本地电脑 -- SSH 22 --> Bastion EC2 -- MySQL 3306 --> RDS MySQL
公有子网 私有访问
特点:
- RDS 不需要公开访问。
- RDS security group 只允许来自 Bastion security group 的 3306 访问。
- 本机只需要能 SSH 到跳板机。
注意:
- 跳板机 SSH 不要开放给
0.0.0.0/0。 - 入站 SSH 来源应限制为自己的公网 IP 或企业出口 IP。
- 需要做好系统补丁、审计、密钥管理。
3. 通过 SSM Session Manager 端口转发访问 RDS
本地电脑 -- SSM Session --> Managed EC2 -- MySQL 3306 --> RDS MySQL
无需开放 SSH 私有访问
特点:
- EC2 不需要开放 22 端口。
- 访问权限可以通过 IAM 控制。
- 不需要管理 SSH key。
- 更适合企业环境中的受控运维访问。
二、如何判断 RDS 是否在私有访问路径中
判断 RDS 是否公网暴露,要看三个地方。
1. RDS Publicly accessible
进入:
RDS 控制台 -> Databases -> 选择 DB instance -> Connectivity & security
检查:
Publicly accessible = No
如果是 Yes,说明 RDS 允许被分配公网访问入口。是否真的能连通,还取决于子网路由和安全组。
2. DB subnet group 的子网路由表
进入:
RDS 控制台 -> Subnet groups -> 选择 DB subnet group
记录其中的 subnet,再到 VPC 控制台查看每个 subnet 关联的 route table。
判断标准:
| Route table 默认路由 | 子网类型 |
|---|---|
0.0.0.0/0 -> igw-xxxxxxxx |
公有子网 |
0.0.0.0/0 -> nat-xxxxxxxx |
私有子网,可主动出站 |
只有 VPC local 路由 |
隔离私有子网 |
注意:子网名字叫 private 不一定真私有,最终要看路由表。
3. RDS Security Group
进入:
EC2 控制台 -> Security Groups -> 选择 RDS 使用的 security group
推荐入站规则:
Type: MySQL/Aurora
Protocol: TCP
Port: 3306
Source: App-SG 或 Bastion-SG / SSM-EC2-SG
不建议:
Source: 0.0.0.0/0
三、Demo 1:RDS 公网直连
步骤 1:修改 RDS 为公开访问
进入:
RDS 控制台 -> Databases -> 选择数据库实例 -> Modify
在连接配置中修改:
Public access: Yes
然后:
- 点击 Continue。
- 确认修改摘要中包含公开访问变更。
- 选择 Apply immediately。
- 等待数据库状态从
modifying恢复为available。 - 回到 Connectivity & security 确认
Publicly accessible = Yes。
步骤 2:安全组放行本机公网 IP
查询本机公网 IP:
curl https://checkip.amazonaws.com
然后在 RDS 使用的 security group 中添加入站规则:
Type: MySQL/Aurora
Port: 3306
Source: <your-public-ip>/32
不要使用:
0.0.0.0/0
步骤 3:验证网络连通性
确认 RDS endpoint 解析结果:
nslookup <rds-endpoint>
公网直连场景下,解析结果应是公网地址,而不是:
10.x.x.x
172.16.x.x - 172.31.x.x
192.168.x.x
在 PowerShell 测试端口:
Test-NetConnection -ComputerName <rds-endpoint> -Port 3306
关注:
TcpTestSucceeded: True
如果是 False,通常需要检查:
- RDS 是否已经
Publicly accessible = Yes。 - RDS 是否已经恢复为
available。 - Security group 是否放行当前公网 IP。
- 当前网络是否阻断 3306 出站流量。
步骤 4:本机连接 RDS
下载 RDS SSL 证书:
curl -o global-bundle.pem https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
连接数据库:
mysql -h <rds-endpoint> \
-P 3306 \
-u <db-user> \
-p \
--ssl-mode=VERIFY_IDENTITY \
--ssl-ca=./global-bundle.pem
验证:
SHOW DATABASES;
SELECT VERSION();
SELECT CURRENT_USER();
四、Demo 2:通过跳板机连接私有 RDS
架构
本地电脑 -- SSH 22 --> Bastion EC2 -- MySQL 3306 --> RDS MySQL
前提条件
- RDS 与 Bastion EC2 在同一个 VPC,或网络可达。
- RDS
Publicly accessible = No。 - Bastion EC2 位于公有子网,并有公网 IP。
- Bastion security group 的 SSH 入站只允许自己的公网 IP。
- RDS security group 的 MySQL 入站只允许 Bastion security group。
步骤 1:创建 Bastion EC2
建议配置:
AMI: Amazon Linux 2023
Instance type: t3.micro 或 t4g.micro
Subnet: 公有子网
Auto-assign public IP: Enable
Security group: bastion-sg
Inbound: TCP 22 from <your-public-ip>/32
步骤 2:配置 RDS Security Group
在 RDS security group 中添加:
Type: MySQL/Aurora
Port: 3306
Source: bastion-sg
这样只有跳板机可以访问 RDS。
步骤 3:登录跳板机
ssh -i <your-key.pem> ec2-user@<bastion-public-ip>
如果连不上,检查:
- Bastion 是否有公网 IP。
- Bastion security group 是否允许你的公网 IP 访问 22。
- 本机网络是否允许 SSH 出站。
步骤 4:在跳板机安装 MySQL 客户端
Amazon Linux 2023:
sudo dnf install -y mariadb105
步骤 5:从跳板机连接 RDS
mysql -h <rds-endpoint> -P 3306 -u <db-user> -p
验证:
SHOW DATABASES;
SELECT VERSION();
SELECT CURRENT_USER();
五、Demo 3:通过 SSM Session Manager 端口转发连接 RDS
相比传统跳板机 SSH,SSM 端口转发可以减少公网 SSH 暴露面。
前提条件
EC2 需要成为 Systems Manager managed instance:
- 安装并运行 SSM Agent。
- EC2 绑定 IAM role,包含
AmazonSSMManagedInstanceCore权限。 - EC2 能访问 Systems Manager 服务,可以通过 NAT Gateway 或 VPC endpoint。
- 本机安装 AWS CLI 和 Session Manager plugin。
- RDS security group 允许来自该 EC2 security group 的 3306 访问。
启动端口转发
Linux/macOS:
aws ssm start-session \
--target <instance-id> \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["<rds-endpoint>"],"portNumber":["3306"],"localPortNumber":["3307"]}'
Windows PowerShell:
aws ssm start-session `
--target <instance-id> `
--document-name AWS-StartPortForwardingSessionToRemoteHost `
--parameters '{"host":["<rds-endpoint>"],"portNumber":["3306"],"localPortNumber":["3307"]}'
本机连接:
mysql -h 127.0.0.1 -P 3307 -u <db-user> -p
六、常见问题排查
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
| RDS 改成公开访问后仍连不上 | 修改未完成,或没有选择立即应用 | 等待状态变为 available,确认 Publicly accessible 字段 |
Test-NetConnection 在 cmd 中不可用 |
这是 PowerShell 命令 | 使用 PowerShell 执行 |
TcpTestSucceeded: False |
安全组未放行、RDS 未公开、网络阻断 | 检查 public access、security group、当前公网 IP |
| 换网络后连接失败 | 公网 IP 变化 | 重新查询公网 IP 并更新 /32 安全组规则 |
跳板机没有 mysql 命令 |
默认未安装客户端 | sudo dnf install -y mariadb105 |
| 本机直连私有 RDS 超时 | RDS 没有公网访问入口 | 使用跳板机或 SSM 隧道 |
| SQL 报语法错误 | 已连接成功,但 SQL 写错 | 修正 SQL,例如 SHOW DATABASES; |
七、实验结束后的清理
如果只是学习测试,建议实验结束后立即清理:
- 将 RDS
Publicly accessible改回No。 - 删除 RDS security group 中临时添加的
<your-public-ip>/32。 - 终止不再使用的 Bastion EC2。
- 删除不再使用的 key pair、本地私钥和临时安全组规则。
- 如果不再需要测试数据库,删除 RDS 实例,避免持续计费。
八、生产环境建议
生产环境建议采用:
RDS in private subnets
+ RDS Publicly accessible = No
+ RDS SG only allows App-SG / Bastion-SG / SSM-EC2-SG
+ IAM + Secrets Manager 管理权限和密码
+ SSM Session Manager 优先于开放 SSH
+ CloudTrail / VPC Flow Logs / RDS 日志用于审计
核心原则:
- 数据库不要长期暴露公网。
- 安全组来源不要使用
0.0.0.0/0。 - 运维入口要可控、可审计、最小权限。
- Demo 和生产配置要明确分开。

参考资料
更多推荐




所有评论(0)