为什么我们需要VPC中的私有子网?

AWS VPCconfiguration中有4个场景 。 但是让我们看看这两个:

  • 场景1:1个公共子网。
  • 场景2:1个公有子网和1个私有子网。

由于在公共子网中启动的任何实例都没有EIP(除非被分配),它已经不能从Internet寻址。 然后:

  • 为什么需要私人子网?
  • 私有和公有子网之间的区别究竟是什么?

更新: 2015年12月下旬,AWS 宣布了一项新function,即VPC的托pipeNAT网关 。 此可选服务为私有子网中的VPC实例提供了另一种访问Internet的机制,在此之前,常见解决scheme是VPC内的公共子网上的EC2实例,充当“NAT实例”,提供networking地址转换从技术angular度而言, 端口地址转换)用于其他私有子网中的实例,从而允许这些机器使用NAT实例的公用IP地址作为出站Internet访问。

新的托pipeNAT服务并没有从根本上改变以下信息的适用性,但是下面的内容并没有解决这个问题。 NAT实例仍然可以按照描述使用,或者可以设置Managed NAT Gateway服务。 此答案的扩展版本集成了更多关于NAT网关的信息,以及它如何与NAT实例进行比较,因为这些都与VPC中的私有/公有子网范例相关。

请注意, Internet网关NAT网关是两个不同的function。 具有Internet访问权限的所有VPCconfiguration都将具有Internet网关虚拟对象。


要了解Amazon VPC中“私有”和“公共”子网之间的区别,需要了解IP路由和networking地址转换(NAT)如何工作,以及如何在VPC中专门实施这些子网。

VPC中的公有和私有子网的核心区别在于VPC路由表中的子网的默认路由是什么。

这种configuration又决定了在特定子网上的实例上使用或不使用公共IP地址的有效性。

每个子网只有一条默认路由,它只能是以下两种情况之一:

  • VPC的“Internet网关”对象,在“公共”子网的情况下,或者
  • NAT设备 – 即NAT网关或EC2实例,在“私有”子网的情况下执行“NAT实例”angular色。

因特网网关没有公网IP地址的情况下不进行任何networking地址转换,所以没有公网IP地址的实例不能连接到互联网 – 做下载软件更新或访问其他AWS资源,如S3 1和SQS – 如果其VPC子网上的默认路由是Internet网关对象。 所以,如果你是一个“公共”子网上的实例,那么你需要一个公共IP地址来完成服务器通常需要做的大量事情。

对于只有私有IP地址的情况,有另一种出站访问互联网的方式。 这是networking地址转换²和一个NAT实例进来的地方。

私有子网上的机器可以访问Internet,因为私有子网上的默认路由不是 VPC“Internet网关”对象 – 它是configuration为NAT实例的EC2实例。

NAT实例是具有公有IP的公有子网上的一个实例,也是特定的configuration。 有AMI是预先build立这样做,或者你可以build立自己的。

当私人寻址机器向外发送stream量时,stream量由VPC发送到NAT实例,NAT实例用自己的公共IP地址replace数据包上的源IP地址(私有机器的私有IP地址),将stream量到互联网,接受响应数据包,并将它们转发回原始机器的私有地址。 (它也可以重写源端口,在任何情况下,它都会记住映射,以便知道哪个内部机器应该接收响应数据包)。 NAT实例不允许任何“意外的”入站stream量到达私有实例,除非已经专门configuration为这样做。

因此,当从私有子网访问外部Internet资源时,stream量将穿越NAT实例,并显示目的地是从NAT实例的公共IP地址发出的……所以响应stream量会回到NAT实例。 无论是分配给NAT实例的安全组还是分配给私有实例的安全组,都需要configuration为“允许”此响应stream量,因为安全组是有状态的。 他们意识到响应stream量与内部发起的会话相关,所以它是自动允许的。 当然,除非安全组被configuration为允许,否则意外的stream量将被拒绝。

与传统的IP路由不同,默认网关在同一子网上,它在VPC中的工作方式不同:任何给定私有子网的NAT实例始终位于不同的子网上,而其他子网始终是公有子网,因为NAT实例需要有一个公共的外部IP,其默认网关必须是VPC的“Internet网关”对象。

同样,您不能在私有子网上部署具有公用IP的实例。 这是行不通的,因为私有子网上的默认路由(根据定义)是NAT实例(对通信执行NAT),而不是Internet网关对象(不是)。 来自因特网的入站stream量将冲击实例的公共IP,但是回复将尝试通过NAT实例向外路由,这将丢弃stream量(因为它将由对它不知道的连接的回复组成,所以它们被认为是无效的),或将重写回复stream量使用自己的公共IP地址,这是行不通的,因为外部来源不会接受来自除了他们试图发起通信的IP地址。

那么从本质上讲,“私人”和“公共”的名称实际上并不是来自互联网的可访问性或不可访问性。 它们是关于将被分配给该子网上的实例的地址types,这是因为需要翻译(或避免翻译)这些用于因特网交互的IP地址。

由于VPC具有从所有VPC子网到所有其他VPC子网的隐式路由,因此默认路由在内部VPCstream量中不起作用。 具有私有IP地址的实例将从它们的私有IP地址连接到VPC中的其他私有IP地址,而不是从它们的公共IP地址(如果它们具有一个的话)……只要目的地址是另一个私有地址在VPC内。

如果使用私有IP地址的实例在任何情况下都不需要发起出站Internet通信,那么它们在技术上可以部署在“公共”子网上,并且仍然将无法从Internet访问…但是在这样的configuration下,他们不可能发起到Internet的出站stream量,包括与其他AWS基础设施服务的连接,例如S3 1或SQS。


1.关于S3,具体来说, 总是要求互联网访问是一个过分简化,随着时间的推移,可能会扩大范围,并扩展到其他AWS服务,因为VPC的function不断增长和发展。 有一个相对较新的概念,称为VPC端点 ,允许您的实例(包括仅具有私有IP地址的实例)直接从VPC中的选定子网访问S3,而不触及“Internet”,并且不使用NAT实例或NAT网关,但这确实需要额外的configuration,并且只能用于访问与您的VPC相同的AWS区域中的存储区。 默认情况下,S3 – 在撰写本文时,唯一具有创buildVPC端点function的服务 – 只能通过Internet从VPC内部访问。 当您创buildVPC端点时,会创build一个前缀列表( pl-xxxxxxxx ),您可以在VPC路由表中使用该前缀列表通过虚拟“VPC端点”对象直接将该特定AWS服务的stream量发送到服务。 它还解决了限制对特定实例的S3的出站访问的问题,因为前缀列表可以在出站安全组中使用,代替目标IP地址或块 – 并且S3 VPC端点可以受附加策略语句,根据需要限制桶内部的访问。

2.如文档中所述,这里实际讨论的是端口以及networking地址转换。 虽然在技术上有点不太精确,但是把这个组合操作称为“NAT”是很常见的。 这有点类似于我们许多人倾向于说“SSL”的时候,我们实际上是指“TLS”。 我们知道我们在说什么,但是我们没有用最正确的词来形容它。 “注意我们在本文档中使用术语NAT来遵循常见的IT实践,尽pipeNAT设备的实际angular色是地址转换和端口地址转换(PAT)。”

我没有名气给迈克尔的回答添加评论,因此join了我的评论作为答案。

值得注意的是,与运行自己的实例相比,AWSpipe理的网关比当前贵3倍。 这当然假设您只需要一个NAT实例(即,您没有configuration多个用于故障转移的NAT实例等),这通常适用于大多数中小型用例场景。 假设每月通过NAT网关传输100GB的数据,

托pipeNAT实例每月成本= $ 33.48 /月($ 0.045 /小时*一个月744小时)+ 4.50美元(每GB处理数据为$ 0.045 * 100GB)+ $ 10($ .10 / GB标准AWS数据传输费用NAT网关)= $ 47.98

t2.nano实例configuration为NAT实例= $ 4.84 /月($ 0.0065 *一个月内744小时)+ $ 10(对于通过NAT实例传输的所有数据,$ 0.10 / GB标准AWS数据传输费用)= $ 14.84

当您使用冗余NAT实例时,这当然会发生变化,因为AWS托pipeNAT网关具有内置的高可用性冗余。 如果你不关心额外的33美元/月,那么pipe理的NAT实例绝对值得减less头痛,而不必维护另一个实例。 如果您正在运行VPN(例如OpenVPN)实例来访问VPC内的实例,则可以简单地将该实例configuration为您的NAT网关,然后不必为NAT保留额外的实例尽pipe有人可能会对VPN和NAT结合的想法感到沮丧)。

我会build议一个不同的策略 – “私有”子网和NAT实例/网关。 他们没有必要。 如果您不希望通过互联网访问机器,请不要将其放置在允许此类访问的安全组中。

通过抛弃NAT实例/网关,可以消除实例/网关的运行成本,并且可以消除速度限制(即250mbit或10gbit)。

如果你有一台机器,也不需要直接访问互联网,(我会问你是如何补丁*),那么通过一切手段,不要分配一个公共IP地址。

*如果这里的答案是某种代理人,那么你就要承担一些开销,但是每个人都是自己的。

Michael – sqlbot的回答暗示了私有IP地址是必需的。 我认为值得质疑这个假设 – 我们甚至需要首先使用私有IP地址吗? 至less有一位评论者提出了同样的问题。

在具有NAT实例的私有子网上的服务器的优点是什么?与具有严格的安全策略的公共子网中的服务器相比, – abhillman 14年6 月24日在23:45

设想一下您使用VPC的情况,并将公有IP地址分配给您的所有EC2实例。 不要担心,这并不意味着它们必须通过互联网才能访问,因为您使用安全组来限制访问,就像使用EC2 classic一样。 通过使用公共IP地址,您可以轻松地将某些服务暴露给有限的受众而无需使用ELB之类的function。 这使您无需设置NAT实例或NAT网关。 而且由于您需要的子网数量只有一半,您可以select为您的VPC使用较小的CIDR分配,或者可以使用相同大小的VPC创build较大的子网。 而更less的子网意味着您将为亚利桑那州的stream量支付更less的费用。

那么,我们为什么不这样做呢? AWS为什么说最好的做法是使用私有IP?

amazon web services公共IPv4地址的供应有限,因为整个互联网的公共IPv4地址供应有限。 使用私有IP地址对他们来说是最有利的,而私有IP地址实际上是无限的,而不是过度消耗稀缺的公有IPv4地址。 您可以在AWS价格弹性IP如何看到这一些证据; 附加到实例的EIP是免费的,但是未使用的EIP需要花费。

但是为了争辩,让我们假设我们不关心互联网上公共IPv4地址的短缺。 毕竟, 我的申请是特殊的。 接下来发生什么?

只有两种方式将公有IP地址附加到VPC中的EC2实例。

1.关联公共IP地址

启动新的EC2实例时,您可以请求公共IP地址。 此选项在控制台中显示为checkbox,在使用aws-cli时显示为–associate-public-ip-address标志,在使用CloudFormation时显示为embedded式networking接口对象上的AssociatePublicIpAddress标志。 在任何情况下,公共IP地址都被分配给eth0 (DeviceIndex = 0)。 启动新实例时只能使用这种方法。 但是,这带来一些缺陷。

一个缺点是,更改使用embedded式networking接口对象的实例的安全组将强制实例的即时replace,至less如果您使用CloudFormation。

另一个缺点是当实例停止时,以这种方式分配的公共IP地址将会丢失。

2.弹性IP

一般来说,弹性知识产权是首选方法,因为它们更安全。 您可以保证继续使用相同的IP地址,不会冒任何意外删除EC2实例的风险,您可以随时随意添加/分离弹性IP,并且可以自由更改应用于EC2实例的安全组。

…但是,AWS会将您限制在每个地区的5个EIP。 您可以申请更多,并且您的请求可能被授予。 但是AWS可能会根据我上面提到的推理拒绝这个请求。 因此,如果您计划将基础架构扩展到每个区域5个EC2实例之外,那么您可能不希望依赖EIP。

总之,使用公有IP地址确实带来了一些好处,但如果您尝试仅使用公有IP地址,则会遇到pipe理或缩放问题。 希望这有助于说明和解释为什么最佳实践是他们的方式。