我有两个 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 对等流量的费率相似。