因特网网关不会对没有公共 IP 地址的实例进行任何网络地址转换,所以没有公共 IP 地址的实例无法将 向外连接到因特网——如果其 VPC 子网上的默认路由是因特网网关对象,则无法进行下载软件更新或访问其他 AWS 资源(如 S31和 SQS)。因此,如果您是“公共”子网上的一个实例,那么您就需要 需要一个公共 IP 地址,以便完成服务器通常需要完成的大量工作。
对于只有私有 IP 地址的情况,有另一种出站访问 Internet 的方式。这就是网络地址转换和 NAT 实例的用武之地。
私有子网上的机器可以访问 Internet,因为私有子网上的默认路由是 没有,VPC“ Internet Gateway”对象——它是配置为 NAT 实例的 EC2实例。
NAT 实例是公共子网上具有公共 IP 和特定配置的实例。有一些 AMI 是预先构建的,或者您可以构建自己的 AMI。
当私有寻址机器向外发送流量时,流量通过 VPC 发送到 NAT 实例,NAT 实例用自己的公共 IP 地址替换数据包上的源 IP 地址(私有机器的私有 IP 地址) ,将流量发送到 Internet,接受响应数据包,然后将它们转发回原始机器的私有地址。(它还可以重写源端口,并且在任何情况下,它都会记住映射,以便知道哪个内部机器应该接收响应数据包)。一个 NAT 实例不允许任何“意外”的入站流量到达私有实例,除非它被特别配置为这样做。
类似地... 您不能在私有子网上部署具有公共 IP 的实例。它不起作用,因为私有子网上的默认路由(根据定义)是一个 NAT 实例(在流量上执行 NAT) ,而不是 Internet Gateway 对象(不执行)。来自互联网的入站流量会碰到实例的公共 IP 地址,但是回复会尝试通过 NAT 实例向外路由,这样要么会丢失流量(因为它将由对它不知道的连接的回复组成,所以它们会被认为是无效的) ,要么会重写回复流量,使用它自己的公共 IP 地址,这不会起作用,因为外部来源不会接受来自 IP 地址的回复,而不是它们试图启动通信的 IP 地址。
因此,从本质上讲,“私人”和“公共”的标识并不真正关乎互联网的可访问性或不可访问性。它们是关于将被分配给该子网上的实例的地址类型,这是相关的,因为需要翻译——或避免翻译——这些 IP 地址以进行 Internet 交互。
由于 VPC 具有从所有 VPC 子网到所有其他 VPC 子网的隐式路由,因此默认路由在内部 VPC 通信中不起作用。具有私有 IP 地址的实例将“从”他们的私有 IP 地址连接到 VPC 中的其他私有 IP 地址,而不是“从”他们的公共 IP 地址(如果他们有的话) ... ... 只要目标地址是 VPC 中的另一个私有地址。
如果您的实例与私有 IP 地址从来没有,在任何情况下,需要发起出站互联网流量,那么他们在技术上可以部署在一个“公共”子网,仍然无法从互联网访问... 但在这样的配置,它们不可能发起出站流量向互联网,其中包括与其他 AWS 基础设施服务,如 S31或 SQS 连接。