AWS 安全组不允许从私有 IP 访问 EC2 实例

AWS 安全组不允许从私有 IP 访问 EC2 实例

我有两个 EC2 实例。它们都位于同一个 VPC 中,并且都分配有公有 IP。

我的问题是,我需要使用安全组中的公共 IP 来允许它们进行通信。如果我尝试使用私有 IP,它们的连接将被拒绝。

我最终将删除他们的公共 IP,并且希望之后不必更改我的安全组设置。

为什么我不能使用私有 IP 作为同一 VPC 中两台机器的源?

答案1

tl;dr:当您使用其公共 IP 地址连接到实例时,您也必须使用源计算机的公共地址作为源地址(如果源实例没有公开 IP,则使用其 NAT 网关的公共地址),并且您的流量在您执行此操作时传出到互联网并返回(尽管您承认您并没有走太远到互联网)。

让我们举两个例子:

#1 public 203.0.113.1 private 172.31.3.1
#2 public 203.0.113.2 private 172.31.3.2

如果实例 #1 使用实例 #2 的公网 IP 203.0.113.2 连接到实例 #2:

  • IP 数据包离开实例#1,其源 IP 为 172.31.3.1,目标地址为 203.0.113.2。
  • 数据包到达 VPC 路由表,路由表发现 203.0.113.2 不是 VPC 内的 IP 地址,因此路由表将其发送到 Internet 网关
  • 互联网网关看到源地址为 172.31.3.1 的流量,它知道该地址实际上是一个具有公共 IP 203.0.113.1 的 EC2 实例,因此它将源 IP 地址从 172.31.3.1 重写为 203.0.113.1,并将其发送到互联网。
  • 现在源 IP 是 203.0.113.1,目标 IP 是 203.0.113.2。
  • 一个未命名的组件(可能位于 Internet 网关内部,但也可能位于 Internet 网关和一个很少讨论的区域性 AWS 基础设施(称为交通中心——其中每个区域至少有两个)看到 203.0.113.2 属于您的 Internet 网关,流量被发回至您的 Internet 网关进行处理。
  • Internet 网关知道 203.0.113.2 属于您的实例 #2,因此它将目标地址转换为 172.31.3.2;此时源地址仍然是 203.0.113.1。
  • 实例#2 及其安全组将此流量视为来自 Internet,源 IP 为 203.0.113.1,因此这是安全组必须允许的地址。

如果实例#1 使用 172.31.3.2 连接到实例#2,那么基本上这些都不会发生,因此实例#2 的安全组将把 172.31.3.1 视为源地址。

使用目标实例的私有 IP 是可行的方法。

请注意,使用私有 IP 时,您还可以在实例 #2 的安全组规则中列出实例 #1 的安全组 ID,而不是列出实例 #1 的私有 IP 地址。它与控制台中的 IP 位于同一位置 -sg在那个框中输入,您应该能够选择一个。如果您将实例 #1 放在自动扩展的“一组”中,这可能更容易维护并且效果很好 - 这样如果机器发生故障,自动扩展就会替换它。

还要注意,当两个实例使用它们的公共 IP 进行通信时,您需要为出去和回来付费。 它不像互联网流量费用那么高,但费率与区域内可用区间和区域内 VPC 对等流量的费率相似。

相关内容