.NET Core使用MySqlConnector连接AWS RDS实例被拒绝问题排查
问题解答
核心原因
你在错误提示中看到的username@[...].res.rr.com不是你要连接的数据库服务端地址,也不存在路由跳转问题:这是AWS RDS MySQL服务端做身份校验时,对你的客户端出口公网IP做反向PTR解析得到的域名,和你连接字符串中配置的RDS实例地址无关。
MySQL的身份验证采用用户名+客户端来源地址/域名双匹配规则:当你发起连接请求时,RDS实例会先获取你的公网出口IP,对该IP做反向DNS解析得到对应域名(res.rr.com是美国运营商Spectrum的公网IP反向解析默认后缀),再校验是否允许该用户名从这个域名对应的地址访问,匹配失败就会抛出你看到的错误。
为什么MySQL Workbench/终端可以正常连接
通常是两种场景导致:
- 你在MySQL Workbench中配置了SSH跳板、代理服务,连接RDS的出口IP和你代码直接运行时的出口IP不一致,RDS安全组和账号权限已经放行跳板IP的访问
- 本地工具默认的连接参数(比如SSL模式、IP协议优先级)和MySqlConnector默认参数不同,触发了不同的权限校验逻辑
解决步骤
- 先确认代码运行环境的公网出口IP,检查该IP是否已经添加到AWS RDS的安全组入站规则,允许3306端口的访问请求
- 临时关闭RDS的反向DNS解析校验:在RDS参数组中将
skip_name_resolve参数设为ON,之后错误提示会直接显示客户端出口IP,方便你快速定位匹配问题 - 补全连接字符串的必要参数:如果RDS开启了强制SSL,需要添加
Ssl Mode=Required参数;如果使用非默认端口,要显式指定Port=你的RDS端口 - 核对RDS账号权限:执行SQL
SELECT host FROM mysql.user WHERE user='你使用的数据库用户名';,确认该账号允许的访问来源包含你的出口IP,测试阶段可以临时设置为%(生产环境不推荐)
额外建议
你当前封装的Database类存在连接泄漏风险:MySqlConnection本身已经实现了IDisposable接口,不需要额外封装连接的打开关闭逻辑,推荐通过using块按需管理连接生命周期:
// 标准用法示例 public async Task DoDbOperationAsync(string connectionString) { using var connection = new MySqlConnection(connectionString); await connection.OpenAsync(); // 在此执行你的数据库操作 }
内容的提问来源于stack exchange,提问作者thesongib
相关产品推荐
相关产品推荐

