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

Tom*_*mmy 121 vpc amazon-web-services amazon-vpc

AWS VPC配置中有4个方案.但让我们看看这两个:

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

由于在公共子网中启动的任何实例都没有EIP(除非已分配),因此无法从Internet寻址.然后:

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

Mic*_*bot 234

更新: 2015年12月下旬,AWS 宣布了一项新功能,即VPC托管NAT网关.此可选服务为私有子网中的VPC实例提供了另一种访问Internet的机制,此前,常见解决方案是VPC内公共子网上的EC2实例,用作"NAT实例",提供网络地址转换(技术上,端口地址转换)用于其他私有子网中的实例,允许这些计算机使用NAT实例的公共IP地址进行出站Internet访问.

新的托管NAT服务并未从根本上改变以下信息的适用性,但此选项未在后面的内容中解决.仍然可以按照描述使用NAT实例,或者可以配置托管NAT网关服务.这个答案的扩展版本集成了有关NAT网关的更多信息以及它与NAT实例的比较,即将发布,因为它们都与VPC中的私有/公有子网范例相关.

请注意,Internet网关NAT网关是两个不同的功能.具有Internet访问权限的所有VPC配置都将具有Internet网关虚拟对象.


要了解Amazon VPC中"私有"和"公共"子网之间的区别,需要了解IP路由和网络地址转换(NAT)的工作原理,以及它们在VPC中的具体实现方式.

VPC中公共子网和私有子网之间的核心区别在于VPC路由表中子网的默认路由.

反过来,这种配置规定了在该特定子网上的实例上使用或不使用公共IP地址的有效性.

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

  • VPC的"Internet Gateway"对象,在"公共"子网的情况下,或
  • NAT设备 - 即NAT网关或EC2实例,在"私有"子网的情况下执行"NAT实例"角色.

互联网网关没有做任何网络地址转换为实例,而不公网IP地址,以便无需公网IP地址的实例不能连接向外互联网-做事如下载软件更新,或访问像S3等AWS资源1和SQS - 如果其VPC子网上的默认路由是Internet Gateway对象.因此,如果您是"公共"子网上的实例,那么您需要一个公共IP地址,以便执行服务器通常需要执行的大量操作.

对于只有私有IP地址的实例,还有另一种出站访问Internet的方法.这是网络地址转换²和NAT实例的用武之地.

私有子网上的计算机可以访问Internet,因为私有子网上的默认路由不是 VPC"Internet网关"对象 - 它是配置为NAT实例的EC2实例.

NAT实例是具有公共IP和特定配置的公有子网上的实例.有预先建立的AMI可以做到这一点,或者你可以建立自己的AMI.

当私有寻址机器向外发送流量时,流量由VPC发送到NAT实例,NAT实例用自己的公共IP地址替换数据包上的源IP地址(私有机器的私有IP地址),发送流量到Internet,接受响应数据包,并将它们转发回原始机器的私有地址.(它也可能会重写源端口,并且在任何情况下,它都会记住映射,因此它知道哪个内部机器应该接收响应数据包).NAT实例不允许任何"意外"入站流量到达私有实例,除非已经专门配置这样做.

因此,当从私有子网访问外部Internet资源时,流量遍历NAT实例,并且目的地看起来源自NAT实例的公共IP地址...因此响应流量返回到NAT实例.分配给NAT实例的安全组和分配给私有实例的安全组都不需要配置为"允许"此响应流量,因为安全组是有状态的.他们意识到响应流量与内部发起的会话相关,因此它是自动允许的.当然,除非安全组配置为允许,否则意外流量将被拒绝.

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

同样......您无法在私有子网上部署具有公共IP的实例.它不起作用,因为私有子网上的默认路由(根据定义)是NAT实例(对流量执行NAT),而不是Internet Gateway对象(不是).来自Internet的入站流量将达到实例的公共IP,但是回复将尝试通过NAT实例向外路由,这会丢弃流量(因为它将由对其不知道的连接的回复组成,因此它们"被视为无效"或者会重写回复流量以使用自己的公共IP地址,这是行不通的,因为外部来源不接受来自IP地址的回复,而不是他们尝试与之通信的IP地址. .

从本质上讲,"私人"和"公共"指定并非真正涉及互联网的可访问性或不可访问性.它们是关于将分配给该子网上的实例的地址类型,这是相关的,因为需要转换 - 或避免转换 - 这些IP地址用于Internet交互.

由于VPC具有从所有VPC子网到所有其他VPC子网的隐式路由,因此默认路由不会在内部VPC流量中发挥作用.具有私有IP地址的实例将"从"其私有IP地址连接到VPC中的其他私有IP地址,而不是"来自"其公共IP地址(如果有的话)......只要目标地址是另一个私有地址在VPC内.

如果具有私有IP地址的实例在任何情况下都不需要发起出站Internet流量,那么它们在技术上可以部署在"公共"子网上,并且仍然无法从Internet访问...但在这样的配置下,他们不可能将出站流量发送到Internet,其中包括与其他AWS基础架构服务的连接,例如S3 1或SQS.


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

2.如文档中所述,这里实际讨论的是端口和网络地址转换.虽然在技术上有点不精确,但将组合操作称为"NAT"是很常见的.这有点类似于当我们实际意味着"TLS"时,我们许多人倾向于说"SSL"的方式.我们知道我们在谈论什么,但我们没有使用最正确的词来形容它."注意我们在本文档中使用术语NAT来遵循常见的IT实践,尽管NAT设备的实际角色是地址转换和端口地址转换(PAT)."

  • 详细的答案,但我仍然想知道.具有NAT实例的私有子网上的服务器和具有严格安全策略的服务器公有子网有什么优势? (16认同)
  • @abhillman这不是一个优势.它是关于网络的工作方式,在VPC中.给定子网*上的所有实例都必须*使用相同的默认网关,它将是"Internet网关"虚拟对象,它不会执行NAT,或者它将是一个NAT实例,它不会"不执行" "NAT.除非你的所有机器都有公共IP,否则它们都没有,你将需要两种类型的子网.如果一切都是面向Internet的Web服务器,当然,您可能只需要一个公有子网,并且具有正确的安全配置,没有任何缺点. (12认同)
  • @VirtualJasper你不应该*要*使用全公共地址.尽可能使用私有IPv4地址是最佳做法.它可以减少你的攻击面.它提供更好的出口控制.IPv4地址空间稀缺而且变得越来越多,消耗更多此类资源的道德方面超出了您的需求.更合乎逻辑的是,如果您不断要求AWS支持人员增加允许的地址数量,他们会在某个时候开始提问.VPC旨在以这种方式工作.你能破坏系统并使用所有公共IP吗?是.这是个好主意吗?没有. (4认同)
  • @avloss感谢您将我的注意力带回到这一点及其与此答案的相关性.已经差不多两年没有大量的编辑而且你是对的 - 事情在不断发展.我将更新此内容以提及VPC端点. (2认同)

Phi*_*hil 25

我建议使用不同的"私有"子网和NAT实例/网关.它们不是必需的.如果您不希望从Internet访问该计算机,请不要将其放在允许此类访问的安全组中.

通过放弃NAT实例/网关,您可以消除实例/网关的运行成本,并消除速度限制(无论是250mbit还是10gbit).

如果你的机器也不需要直接访问互联网,(我会问你是如何修补它的*),那么无论如何都不要分配公共IP地址.

*如果这里的答案是某种代理,那么,你会产生一些开销,但每个都是他自己的.

  • 我完全同意.我对问题的处理越多,对私有子网的使用就越少.感觉更像是内部网络过去看起来的遗物,而且它们的存在主要在于熟悉.我确信有些边缘情况可能仍然有效,但总的来说,我说不要使用它们.对于这个问题的顶部(并且非常长的答案)没有解决实际问题的事实表明它们的冗余. (5认同)
  • 我完全同意这里的理论,但实际上我发现 AWS 默认情况下将每个区域限制为 20 个 EIP,并且我怀疑他们是否愿意增加该限制以允许数百个公共 IPv4 地址。它们是互联网上的稀缺资源。 (2认同)
  • 脱离专用子网固有地认为错误永远不会发生。它们之间交错着数十个实例和数百条安全规则,并且涉及维护的多名人员,因此不能忽视有人意外打开世界港口的可能性。防御态势通过设计将公共访问限制为需要的少数实例,是一种更好的安全性方法。对于那些绝对可靠的人,继续前进。对于我们其余的仅仅是凡人,在谨慎方面犯错误并不是一个可怕的主意。 (2认同)

Jim*_*ker 23

我没有在Michael的答案上​​添加评论的声誉,因此将我的评论添加为答案.

值得注意的是,与运行您自己的实例相比,AWS管理网关的成本约为日期的3倍.这当然假设您只需要一个NAT实例(即您没有为故障转移配置多个NAT实例等),这对于大多数中小型用例场景通常都是正确的.假设通过NAT网关每月传输100GB数据,

托管NAT实例每月费用= 33.48美元/月(0.045美元/小时*一个月744小时)+ 4.50美元(每GB数据处理0.045美元*100GB)+ 10美元(通过该数据传输的所有数据的标准AWS数据传输费用为0.10美元/ GB NAT网关)= 47.98美元

t2.nano实例配置为NAT实例= $ 4.84 /月(每月$ 0.0065*744小时)+ $ 10(通过NAT实例传输的所有数据的$ .10/GB标准AWS数据传输费用)= $ 14.84

当您使用冗余NAT实例时,这当然会发生变化,因为AWS管理的NAT网关具有内置的高可用性冗余.如果你不关心额外的33美元/月,那么托管的NAT实例绝对值得减少头痛,而不必维护另一个实例.如果您正在运行VPN(例如OpenVPN)实例来访问VPC中的实例,您可以简单地将该实例配置为充当NAT网关,然后您不必为NAT维护额外的实例(虽然有些人可能不赞成组合VPN和NAT的想法).

  • 同意 - 然而,对于t2.nano实例,与NAT网关的尖峰峰值10 Gbit/sec相比,您将看到最大吞吐量可能为250Mbit/sec.不要误解我的意思,我发现价格也有点陡峭,而且还有其他限制 - 我几乎在所有地方都使用NAT实例......但是,公平地说,你支付的部分费用是一些非常严重的原始分组交换功率和网关的网络连接. (4认同)

Nic*_*Nic 14

Michael-sqlbot的答案隐含假设私有IP地址是必需的.我认为值得质疑这个假设 - 我们是否首先需要使用私有IP地址?至少有一位评论者问了同样的问题.

具有NAT实例的私有子网上的服务器有什么优势[对]具有严格安全策略的[在]公共子网中的服务器?- abhillman 2014年6月24日23:45

想象一下,您正在使用VPC,并为所有EC2实例分配公共IP地址.不要担心,这并不意味着它们必须通过互联网访问,因为您使用安全组来限制访问,其方式与使用EC2 classic的方式完全相同.通过使用公共IP地址,您可以轻松地将某些服务暴露给有限的受众,而无需使用像ELB这样的东西.这使您无需设置NAT实例或NAT网关.由于您需要一半的子网,您可以选择为您的VPC使用较小的CIDR分配,或者您可以使用相同大小的VPC制作更大的子网.更少的子网意味着您将为AZ之间的流量支付更少的费用.

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

亚马逊网络服务提供的公共IPv4地址有限,因为整个互联网的公共IPv4地址供应有限.使用私有IP地址符合他们的最佳利益,这些私有IP地址实际上是无限制的,而不是过度消耗稀缺的公共IPv4地址.您可以在AWS价格弹性IP的方式中看到一些证据; 附加到实例的EIP是免费的,但未使用的EIP需要花钱.

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

将公共IP地址附加到VPC中的EC2实例的方法只有两种.

1.关联公共IP地址

启动新的EC2实例时,可以请求公共IP地址.此选项在控制台中显示为复选框,在使用aws-cli时显示为--associate-public-ip-address标志,在使用CloudFormation时显示为嵌入式网络接口对象上的AssociatePublicIpAddress标志.在任何情况下,公共IP地址都分配给eth0(DeviceIndex = 0).您只能在启动新实例时使用此方法.然而,这带来一些缺点.

缺点是更改正在使用嵌入式网络接口对象的实例的安全组将强制立即替换实例,至少在您使用CloudFormation时是这样.

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

2.弹性IP

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

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

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

  • 对于具有非EIP公共IP的计算机,您无法动态更改安全组的想法在哪里?这根本不是真的! (4认同)
  • [EIP的默认限制实际上是每个地区5个](http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_vpc),而不是20.*"毕竟,我的申请是特殊的"*这句话应该得到自己的支持. (3认同)