在使用阿里云 ECS 搭建业务系统的过程中,很多人会遇到一个看似诡异的问题:
我在 ECS 上部署了 Nginx,绑定了公网 EIP,配置好域名指向,外部访问一切正常,但在同一个 VPC 内部的 ECS 上,无法通过域名访问该服务!
是不是你也踩过这个坑?我们就来深入分析这个问题,并介绍几种优雅的解决方案。
问题场景
我们公司在阿里云上面的业务系统,不能通过域名访问。
- 4 台 ECS 都在同一个 VPC 内
- 一台 ECS 上部署了 Nginx,绑定了一个公网 EIP(比如
123.123.123.123
) - 你的域名
a.com
指向了这个 EIP - Nginx 做反向代理,把请求分发给 VPC 内的服务 A、B、C
外部访问 a.com
没问题,内部 ECS 访问 a.com
却失败了。
原因:VPC 内不支持 Hairpin NAT(回环访问)
阿里云目前不支持在 VPC 内部通过公网 IP(EIP)访问自身或 VPC 内的其它 ECS 实例。这是由其 NAT 网关和路由机制决定的。
所以当你在 ECS 内执行:
curl http://a.com
DNS 会解析 a.com
→ EIP → Nginx(公网 IP),然后 ECS 通过公网出去再回来,这条回环路线是被阿里云 VPC 明确禁止的。
解决方案 1:使用阿里云私有域名解析(PrivateZone)
最推荐、最优雅的方式是使用 阿里云云解析 PrivateZone,为你的内网环境创建私有的 DNS 解析记录。

配置步骤:
- 进入控制台:云解析 PrivateZone 控制台
- 新建 Zone
- 域名:
a.com
- 类型:私有域名
- 绑定你的 VPC(确保所有 ECS 都在这个 VPC 内)
- 域名:
- 添加解析记录
- 主机记录:
@
- 记录类型:
A
- 记录值:Nginx 的内网 IP(如
192.168.1.10
)
- 主机记录:
这样,在 VPC 内部 所有 ECS 执行 curl http://a.com
时,解析到的是内网 IP,绕过了公网路径问题。
✅ 优点:
- 中央化配置,无需手动维护
/etc/hosts
- 支持多个记录,灵活扩展
- 内外解析隔离,外部仍走公网 IP
🟠 注意:
PrivateZone 是 收费服务,但费用较低(按解析记录数和请求量计费)
解决方案 2:自建 DNS + Split-Horizon DNS
如果你不想使用阿里云增值服务,可以在 VPC 内部自建一个 DNS 服务器,如:
CoreDNS
dnsmasq
Bind
并设置:
- 内部访问
a.com
→ 内网 IP - 外部仍解析到公网 EIP
然后修改 ECS 的 /etc/resolv.conf
指向你的 DNS 即可。
address=/a.com/192.168.1.10
适合中大型企业或有 DevOps 团队的情况。
解决方案 3:临时使用 hosts 文件
如果 ECS 数量很少,短期内可以手动添加:
echo "192.168.1.10 a.com" >> /etc/hosts
不过这不是长久之计,后续维护麻烦,不建议长期使用。
总结对比
方案 | 解析方式 | 内外一致性 | 成本 | 维护难度 | 推荐程度 |
---|---|---|---|---|---|
PrivateZone | 云解析(私有域名) | ✅ | 💰(付费) | ⭐⭐ | ⭐⭐⭐⭐⭐ |
自建 DNS | 自定义 DNS 服务 | ✅ | 自主(弹性) | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
hosts 文件 | 手动维护 | ❌ | 免费 | ⭐⭐⭐⭐⭐(繁琐) | ⭐⭐ |
最佳实践建议
企业级或项目正式环境: 推荐使用阿里云 PrivateZone,稳定高效,原生集成,兼容性好。
测试或预算有限: 可先自建 DNS 或临时用 hosts,但建议后期逐步过渡到 PrivateZone。
如果你在使用过程中遇到具体配置问题,欢迎留言讨论,我会持续更新更多实用技巧。
📚 参考资料
- 阿里云帮助文档:ECS 无法通过公网地址访问自己
https://help.aliyun.com/document_detail/42848.html - 阿里云开发者社区问答:关于 Hairpin NAT 的讨论
https://developer.aliyun.com/ask/381831 - 阿里云云解析 PrivateZone 介绍
https://help.aliyun.com/document_detail/64611.html - PrivateZone 使用文档
https://help.aliyun.com/document_detail/100646.html - CoreDNS 内网部署教程
https://coredns.io/manual/toc/