本文记录一次 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

然后:

  1. 点击 Continue。
  2. 确认修改摘要中包含公开访问变更。
  3. 选择 Apply immediately。
  4. 等待数据库状态从 modifying 恢复为 available
  5. 回到 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;

七、实验结束后的清理

如果只是学习测试,建议实验结束后立即清理:

  1. 将 RDS Publicly accessible 改回 No
  2. 删除 RDS security group 中临时添加的 <your-public-ip>/32
  3. 终止不再使用的 Bastion EC2。
  4. 删除不再使用的 key pair、本地私钥和临时安全组规则。
  5. 如果不再需要测试数据库,删除 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 和生产配置要明确分开。

参考资料

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐