同一EC2实例上ECS服务通过Network ELB无法连接本地MySQL求助
解决同一EC2实例内通过Network ELB连接MySQL失败的问题
嘿,这个问题我之前帮同事排查过好几次,核心原因基本都是EC2的源/目标检查在搞鬼,再配合MySQL的绑定配置问题。咱们一步步来解决:
1. 先搞定EC2实例的源/目标检查(最关键的一步)
默认情况下,EC2实例的源/目标检查是开启的,它会验证入站流量的源地址是否和出站请求的目标地址匹配。当你在实例内部访问Network ELB时,数据包的路径是:实例内网IP → ELB → 实例内网IP,这时候实例会认为这个入站流量的源应该是ELB,但实际源是自己的内网IP,所以直接把包拦截了。
解决方法:
- 打开AWS EC2控制台,找到运行MySQL的那个实例
- 右键点击实例 → 「网络设置」→ 「更改源/目标检查」
- 把开关改成禁用,保存设置
2. 确认MySQL的绑定地址
如果MySQL只绑定了127.0.0.1,那即使ELB把流量转过来,MySQL也不会响应来自内网IP的请求:
- 找到你的MySQL配置文件(通常是
/etc/my.cnf或/etc/mysql/my.cnf) - 找到
bind-address配置项,把它改成0.0.0.0(允许所有IP访问)或者实例的内网IP - 重启MySQL服务:
sudo systemctl restart mysqld(如果是用service管理的话就是sudo service mysqld restart)
3. 检查安全组和NACL配置
别漏了安全组和NACL的放行:
- EC2实例安全组:要允许「实例自身的内网IP」访问3306端口(或者你MySQL用的自定义端口),因为当你从实例内部通过ELB访问时,源IP就是实例自己的内网IP
- VPC NACL:确保入站和出站规则都允许3306端口的流量,覆盖ELB所在子网和实例所在子网的IP段
4. 测试验证
做完上面几步后,回到实例的SSH终端,再试一次:
telnet your-elb-dns-name 3306
如果看到类似Escape character is '^]'的提示,说明连通成功了。也可以直接用MySQL客户端测试:
mysql -h your-elb-dns-name -u your-mysql-user -p
补充说明
为什么外部机器能成功连接?因为外部请求的源IP是公网IP,ELB转发后实例的源/目标检查会认为这个流量是从ELB来的,符合规则,所以不会拦截。而实例内部访问时的路径比较特殊,才触发了这个限制。
内容的提问来源于stack exchange,提问作者Supagoat
相关产品推荐
相关产品推荐

