为什么在VPC中需要专用子网?


127

AWS VPC配置中有4个场景。但是,让我们看一下这两个:

  • 方案1:1个公共子网。
  • 方案2:1个公共子网和1个私有子网。

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

  • 为什么需要专用子网?
  • 私有子网和公共子网之间到底有什么区别?

4
即使在为其中的计算机分配了公共IP之后,私有子网仍然无法从公共Internet访问。我创建VPC设置,例如在公共子网中使用Web服务器,在私有子网中使用数据库后端。我可以与客户网关连接,以访问专用和公用子网上的计算机。
user602525 2014年

Answers:


239

更新: 2015年12月下旬,AWS 宣布了一项新功能,即用于VPC托管NAT网关。此可选服务为专用子网中的VPC实例访问Internet提供了一种替代机制,以前,通用解决方案是VPC内公共子网中的EC2实例,充当“ NAT实例”,提供网络地址转换(从技术上讲,是针对其他专用子网中的实例的端口地址转换),从而允许这些计算机将NAT实例的公共IP地址用于其出站Internet访问。

新的托管NAT服务不会从根本上更改以下信息的适用性,但在后续内容中未解决此选项。仍然可以按照说明使用NAT实例,或者可以提供托管的NAT网关服务。该答案的扩展版本将集成有关NAT网关以及如何与NAT实例进行比较的更多信息,因为它们都与VPC中的专用/公用子网范例有关。

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


要了解Amazon VPC中“私有”子网和“公共”子网之间的区别,需要了解IP路由和网络地址转换(NAT)的总体工作方式,以及它们如何在VPC中专门实现。

VPC路由表中该子网的默认路由定义了VPC中公共子网和私有子网之间的核心区别。

反过来,此配置指示在特定子网上的实例上使用或不使用公共IP地址的有效性。

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

  • 如果是“公共”子网,则是VPC的“ Internet网关”对象,或者
  • NAT设备-在“专用”子网的情况下,充当“ NAT实例”角色的NAT网关或EC2实例。

对于没有公共IP地址的实例,Internet网关不执行任何网络地址转换,因此没有公共IP地址的实例无法向外连接到Internet-做诸如下载软件更新或访问其他AWS资源(如S3 1和SQS)的操作-如果其VPC子网中的默认路由是Internet网关对象。因此,如果您是“公共”子网上的实例,那么您需要一个公共IP地址才能执行服务器通常需要执行的大量操作。

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

专用子网上的计算机可以访问Internet,因为专用子网上的默认路由不是 VPC“ Internet网关”对象-它是配置为NAT实例的EC2实例。

NAT实例是具有公共IP和特定配置的公共子网上的实例。有预先构建的AMI可以执行此操作,或者您可以构建自己的AMI。

当私有地址的计算机向外发送流量时,该流量将通过VPC发送到NAT实例,该实例将数据包上的源IP地址(私有计算机的私有IP地址)替换为其自己的公共IP地址,从而发送流量发送到Internet,接受响应数据包,并将其转发回原始计算机的专用地址。(它也可能重写源端口,并且在任何情况下,它都会记住映射,以便知道哪个内部计算机应接收响应数据包)。NAT实例不允许任何“意外”的入站流量到达私有实例,除非已对其进行了专门配置。

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

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

同样,您无法在私有子网上部署具有公共IP的实例。它不起作用,因为专用子网中的默认路由(按照定义)是NAT实例(对流量执行NAT),而不是Internet网关对象(不是)。来自Internet的入站流量会影响实例的公共IP,但答复将尝试通过NAT实例向外路由,这会丢弃流量(因为它将由对它不知道的连接的答复组成,所以它们会被认为是无效的),或者会重写回复流量以使用其自己的公共IP地址,这将无法正常工作,因为外部来源不接受来自IP地址(而不是他们尝试与之发起通信的IP地址)的回复。

因此,从本质上讲,“私有”和“公共”名称实际上与互联网的可访问性或不可访问性有关。它们与将分配给该子网上的实例的地址的种类有关,这是很重要的,因为需要转换(或避免转换)这些IP地址以进行Internet交互。

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

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


1.关于S3,特别是说始终需要Internet访问是一种过分简化,随着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设备的实际作用是地址转换和端口地址转换(PAT),但在本文档中我们使用术语NAT来遵循常见的IT惯例。”


16
详细的答案,但我仍然想知道。在具有NAT实例的专用子网上和具有严格的安全策略的服务器公用子网上的服务器有什么优势?
abhillman 2014年

13
@abhillman并不是真正的优势。这是关于VPC中网络工作的方式。给定子网上的所有实例都必须使用相同的默认网关,该默认网关将是“ Internet网关”虚拟对象(不执行NAT),或者是NAT实例(不执行“不” NAT) 。除非您所有的机器都有公共IP,或者没有一个,否则您将需要这两种类型的子网。当然,如果一切都是面向Internet的Web服务器,那么您可能只需要一个公共子网,并且具有正确的安全配置,就没有任何不利之处。
Michael-sqlbot

1
实际上,现在可以从VPC aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3中访问一些AWS资源,例如S3 。
avloss '16

2
@avloss感谢您将我的注意力带回到这一点及其与这个答案的相关性。已经进行了将近两年的编辑,而您却是对的-事情在不断发展。我将更新此内容以提及VPC端点。
Michael-sqlbot

4
@VirtualJasper你不应该使用所有公共地址。最佳做法是在可能的情况下使用专用IPv4地址。它减少了您的攻击面。它提供了更好的出口控制。IPv4地址空间非常稀缺,而且越来越多,从伦理上讲,消耗比您需要的资源更多的资源。似乎合乎逻辑的是,如果您继续要求AWS支持以增加允许的地址数量,那么他们有时会开始提出问题。VPC被设计为以这种方式工作。您可以降低系统成本并使用所有公共IP吗?是。这是个好主意吗?号
Michael-sqlbot

27

我建议使用另一种方法-抛弃“专用”子网和NAT实例/网关。它们不是必需的。如果您不希望通过互联网访问该计算机,请不要将其放入允许此类访问的安全组中。

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

如果您有一台不需要直接访问Internet的计算机(并且我会问您如何打补丁*),那么一定不要分配公共IP地址。

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


5
我完全同意。我处理的问题越多,对私有子网的使用就越少。从内部部署网络的外观看,它更像是一个遗物,它们的存在主要在于熟悉。我确定在某些情况下它们可能仍然有效,但总的来说,我说不要使用它们。该问题的最高答案(而且答案很长)不能解决实际问题,这表明它们是多余的。
卡尔,2016年

1
我完全同意这里的理论,但是实际上我发现AWS默认将您限制为每个区域20个EIP,并且我怀疑他们是否愿意增加该限制以允许数百个公共IPv4地址。它们是Internet上的稀缺资源。
Nic

1
@Nic您不需要EIP,请记住,这与放弃NAT有关-我们不在乎任何一台不露面计算机的公共IP,也不关心它是否发生了变化。
Phil

1
今天,AWS在全球范围内发布了IPv6。让IPv4消亡。:-)
Phil

3
脱离专用子网本质上是假设错误永远不会发生。它们之间交错着数十个实例和数百条安全规则,并且涉及维护的多名人员,因此不能忽视有人意外打开世界港口的可能性。防御态势通过设计将公共访问限制为需要的少数实例,是一种更好的安全性方法。对于那些绝对可靠的人,继续前进。对于我们其余的仅仅是凡人,在谨慎方面犯错误并不是一个可怕的主意。
Jim Walker

23

我没有在上述迈克尔的答案中添加评论的声誉,因此无法将我的评论添加为答案。

值得注意的是,与运行自己的实例相比,AWS托管网关的价格是最新价格的3倍。当然,这是假设您仅需要一个NAT实例(即,您没有为故障转移配置多个NAT实例等),这通常适用于大多数中小型用例场景。假设通过NAT网关每月进行100GB的数据传输,

托管NAT实例的每月费用=每月$ 33.48($ 0.045 /小时*每月744个小时)+ $ 4.50($ 0.045每处理的GB数据* 100GB)+ $ 10($ .10 / GB的标准AWS数据传输费用) 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结合在一起的想法。


4
同意-但是,与t2.nano实例相比,您将看到最大吞吐量约为250Mbit / sec,而NAT网关的峰值峰值为10 Gbit / sec。不要误会我的意思,我发现价格也有些陡峭,还有其他限制-我仍然在几乎所有地方都使用NAT实例...但是,公平地说,您为此付出了部分代价一些非常严重的原始数据包交换能力以及与网关的网络连接。
Michael-sqlbot

1
但是,为什么NA​​T网关如此昂贵?转换地址是否需要大量计算机资源?我可以理解,对于非常庞大的应用程序,NAT可以代理VPC发出的许多请求,但是如果我们谈论通常的中间业务和小型项目,则每小时$ 0.045,并且每个GB都被高估了。
谢尔盖·切列帕诺夫

15

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

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

设想一个使用VPC并将公共IP地址分配给所有EC2实例的方案。不用担心,这并不意味着它们一定可以通过Internet进行访问,因为您使用安全组来限制访问的方式与使用EC2 classic的方式完全相同。通过使用公共IP地址,您可以轻松地将某些服务提供给有限的受众,而无需使用ELB之类的好处。这使您无需设置NAT实例或NAT网关。并且由于您需要一半的子网,因此您可以选择为VPC使用较小的CIDR分配,或者可以使用相同大小的VPC制作较大的子网。更少的子网意味着您也将为AZ间流量支付更少的费用。

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

Amazon Web Services提供的公共IPv4地址数量有限,因为整个互联网提供的公共IPv4地址数量有限。使用您的私人IP地址实际上是无限的,而不是过度使用稀缺的公共IPv4地址,这对您来说是他们的最大利益。您可以在AWS如何为Elastic 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实例的风险,可以随时自由附加/分离Elastic IP,并且可以自由更改应用于EC2实例的安全组。

...但是,AWS将您限制为每个区域5个EIP。您可以请求更多,并且您的请求可能会被批准。但是,AWS很有可能根据我上面提到的推理拒绝该请求。因此,如果您计划将基础架构扩展到每个区域超过5个EC2实例,则可能不希望依赖EIP。

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


3
EIP默认限制实际上是每个区域5个,而不是20个。 “毕竟,我的应用程序很特殊。” 这句话应该得到自己的赞同。
Michael-sqlbot

4
对于具有非EIP的公共IP的计算机,您无法即时更改安全组的想法从何而来?根本不是真的!
Phil

1
@Phil正确。那句话是错误的。说您无法更改具有公共IP地址的实例的安全组,这会使他的整个答案无效。我知道这可能很苛刻,但是您怎么能以帖子的核心错误陈述误导读者。无论如何,我都同意Nic的观点,即您可以抛弃专用子网,而使用具有适当防火墙设置的公用子网,
Geo

1
现在,我删除了有关无法更改安全组的错误声明。
JP

其中一些陈述仍然存在;)
蒂姆·马隆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.