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

dan*_*rus 2 amazon-ec2 amazon-web-services amazon-vpc

我必须使用 EC2 实例。它们都位于同一个 VPC 中,并且都分配有公共 IP。

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

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

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

Mic*_*bot 5

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

让我们举两个例子:

#1 public 203.0.113.1 private 172.31.3.1
#2 public 203.0.113.2 private 172.31.3.2
Run Code Online (Sandbox Code Playgroud)

如果实例 #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 网关
  • Internet 网关看到源地址为 172.31.3.1 的流量,它知道该流量实际上是具有公共 IP 203.0.113.1 的 EC2 实例,因此它将源 IP 地址从 172.31.3.1 重写为 203.0.113.1 并将其发送到 Internet。
  • 源 IP 现在为 203.0.113.1,目标 IP 为 203.0.113.2。
  • 一个未命名的组件(可能位于 Internet 网关本身内,但也可能位于 Internet 网关和一个很少讨论的区域 AWS 基础设施(称为传输中心,每个区域至少有两个)之间)看到 203.0.113.2属于您的互联网网关,流量将被发回您的互联网网关进行处理。
  • 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 进行通信时,您需要为外出和返回付费。这并不像 Internet 流量成本那么多,但费率与区域内可用区之间的费率类似。区域内 VPC 对等流量。