You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:26:01