我曾经看到过这个问题:来自 AWS 自动扩展组的传出流量的静态 IP 地址但它似乎并不完全符合我想要做的事情。
场景如下:
我有一组自动扩展的 Web 服务器,它们从 ELB 接收流量。这对于传入的 Web 流量来说运行良好。
问题是我有许多外部服务需要这些 Web 服务器连接。这些服务要求我向供应商提供一个 IP 地址,以便他们可以将发出请求的服务器列入白名单。我正在尝试创建一个 NAT 实例,以便来自这些 Web 服务器的出站请求看起来都来自一个 IP(因为扩展组可以拥有任何自动分配的 IP)。
AWS 的所有方案都围绕着通过 NAT 让私有子网访问互联网。在这种情况下,我只需要通过 NAT 路由来自这些盒子的请求。传入的 Web 流量应该仍能正常工作,响应直接通过互联网网关。
当我尝试设置它时,通过修改主路由表以通过 NAT 发送出站流量,一切都停止工作(我假设是因为没有通过互联网网关路由流量的规则,因为我刚刚将其更改为 NAT)
希望这是有意义的。任何建议都将不胜感激。
答案1
NAT 实例是您所处情况的正确解决方案,但我怀疑您犯了一个常见的配置错误——您的 Web 服务器实例与您的 ELB 位于同一子网中。
这样做很直观,但却不正确,除非您的 Web 服务器也有自己的公共 IP 地址。
我之所以这样假设,是因为否则当您更改其默认路由时,您的 Web 服务器就没有理由无法回复请求 —— Web 服务器不与浏览器对话,它们只与 ELB 对话 —— 所以当您更改默认路由时,从技术上讲,ELB 无法再路由回浏览器。
正确的配置是将 ELB 放在公共子网上(使用 Internet 网关作为其默认路由),将 Web 服务器放在私有子网上(使用 NAT 实例作为其默认路由)。当然,NAT 实例本身也位于公共子网上。
尽管此 AWS 文档是关于 Elastic Beanstalk 的,该插图仍然具有相关性。ELB 显示在公共子网中,连同 NAT 实例,而 Web 服务器则位于私有子网中。
也可以看看为什么我们需要 VPC 中的私有子网?