同一VPC内EC2实例无法连接RDS实例的排查求助
这种坑我之前踩过好几次!明明VPC内的EC2和RDS,配置了安全组互访却连不上,反而加EC2公网IP就好使,大概率是这几个细节没注意到:
1. EC2安全组的出站规则被忽略了
很多人只盯着RDS的入站规则,却忘了EC2自身的安全组得放行到RDS端口的出站流量。比如你的RDS用的是MySQL的3306端口,或者PostgreSQL的5432端口,得确保EC2的安全组出站规则里,允许目标为RDS安全组(或对应端口)的流量通过。毕竟流量是双向的,光RDS允许进,EC2不让出也白搭。
2. 你可能用了RDS的公网端点来连接
如果你的RDS实例同时开启了公网和内网端点,当你用公网地址连接时,流量会绕Internet Gateway走一圈,这时候RDS识别到的是EC2的公网IP,自然只认你添加的公网IP规则。正确的做法是用RDS的内网私有端点/IP来连接,这样流量才会走VPC内部的私有网络,RDS才会匹配到EC2的安全组规则。
3. 路由表的本地路由被篡改了
你说用了默认路由表,但得确认默认路由表中,VPC私有网段(比如10.0.0.0/16)对应的路由目标是不是local。如果这条本地路由被错误地改成指向Internet Gateway,那VPC内的流量会被强制走公网,RDS看到的还是EC2的公网IP,自然不触发安全组的互访规则。
4. RDS安全组规则的配置细节出错
检查下RDS的入站规则:
- 有没有比允许EC2安全组更靠前的拒绝规则?安全组规则是按顺序匹配的,拒绝规则会优先生效。
- 源是不是选错了?比如你以为选的是EC2的安全组,结果不小心选成了其他无关的安全组。
- 端口是不是匹配?比如RDS用的是自定义端口,你却配置了默认的3306,那规则等于无效。
5. EC2的多网卡导致流量路径异常
如果你的EC2实例绑定了多个弹性网卡,其中一个带公网IP,另一个是内网网卡,连接RDS时可能默认走了公网网卡的路由,导致流量以公网IP的形式访问RDS。这种情况可以检查EC2的路由策略,或者直接用内网网卡的IP来发起连接测试。
建议你先从「确认RDS连接地址是内网端点」和「检查EC2出站规则」这两点入手,这两个是最常见的问题根源!
内容的提问来源于stack exchange,提问作者Chris Smeal

