如何在 AWS 中为传出流量设置静态 IP 地址?

如何在 AWS 中为传出流量设置静态 IP 地址?

我在 3 个可用区中拥有多个 EC2 实例。我在这些实例上运行的应用程序正在与具有白名单机制的多个第三方应用程序通信。我知道我能够通过使用 NAT 网关使用静态 IP 地址(弹性 IP)与这些第三方应用程序通信。如果我这样做,那么我需要为每个第三方应用程序指定一个特定的路由才能使其工作。我想要实现的是静态传出 IP,而无需定义所有这些路由。因此基本上默认情况下通过 NAT 网关路由所有流量。我尝试了以下操作,但我无法再访问我的应用程序。(顺便说一下,所有这些 EC2 实例都位于应用程序 LoadBalancer 后面)

子网路由表:

10.0.0.0/16     ->  local
0.0.0.0/0       ->  NAT Gateway

NAT 网关子网路由表

10.0.0.0/16     ->  local
0.0.0.0/0       ->  Internet Gateway

如果我设置了以下路由表,它就会工作,但随后我必须为我的应用程序正在与之通信的每个第三方应用程序设置特定的路由。

子网路由表:

10.0.0.0/16                 ->  local
0.0.0.0/0                   ->  Internet Gateway
ThirdPartyApplicationIp/32  ->  NAT Gateway

NAT 网关子网路由表

10.0.0.0/16     ->  local
0.0.0.0/0       ->  Internet Gateway

通过具体定义这些路由,我们可能会遇到问题,例如,当 DNS 记录更新和 IP 地址更改时。我知道这种情况会发生,因为我知道一些第三方应用程序也在使用带有 ELB 的 AWS,并且 ELB 的 IP 会随着时间的推移而变化。此外,当我们必须像这样管理所有这些第三方应用程序时,这也不是很方便。

有没有办法解决这个问题,这样我就不必为每个第三方应用程序定义特定的路由,并且仍然能够通过应用程序负载均衡器访问我的应用程序并尊重 DNS 更改?

附加问题:
解决这个问题还可以解决我目前还没有遇到但在不久的将来会遇到的以下问题:将来当我们的应用程序与第三方应用程序通信并且该应用程序也连接我们的应用程序时,流量将通过 NAT 网关路由。因为这是我设置的路由,但是一旦第三方应用程序尝试通过应用程序 LoadBalancer 连接到我们的应用程序,它就不会起作用,因为那时流量应该直接通过 Internet 网关路由,而不是通过 NAT 网关路由。但是如果我这样做,我将失去我的静态 IP。有办法解决这个问题吗?

Matt 建议的结果: Matt 的建议有效,但我真的不明白为什么。所以我开始尝试使用该设置,试图找出区别。因为路由表和我以前做的一样,这对我来说似乎很奇怪。事实证明,如果我将一个 EC2 实例添加到具有分配的公共 IP 的私有子网(再次使其成为公共子网),整个路由就会失败,我的 ELB 将不再响应请求。删除该新 EC2 实例(具有分配的公共 IP)后,它仍然会失败。只有在删除我的 ELB 中的可用区域并再次添加我的私有子网后,它才会起作用。现在我不明白的是,为什么只是简单地添加一个具有公共 IP 的新 EC2 实例会破坏所有路由?(该新 EC2 实例不在 ELB 的目标组中,只是在子网中闲置)

答案1

为了高效使用 NAT 网关/实例,您的 EC2 实例应位于私有子网中。这样,您就拥有一条默认路由,所有出站流量都会通过 NAT。

将您的 EC2 实例从公共子网移至私有子网。由于 ELB 位于您的 VPC 内,因此您的负载均衡器仍将能够访问它们。

此外,通过将 EC2 实例移至私有子网,您可以提高安全性,因为外界无法直接访问它们。如果您需要访问它们,请设置一个堡垒 EC2 实例,您可以:

  • 使用 SSH 隧道访问您的内部 EC2 实例,或者
  • SSH 两次以访问您的内部 EC2 实例。

我不是 Ansible 万事通,但我确信有一种方法可以使用 Ansible 并保持您的 EC2 实例的私密性。

相关内容