Answers:
更新: 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地址的有效性。
每个子网只有一个默认路由,只能是以下两种情况之一:
对于没有公共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惯例。”
我建议使用另一种方法-抛弃“专用”子网和NAT实例/网关。它们不是必需的。如果您不希望通过互联网访问该计算机,请不要将其放入允许此类访问的安全组中。
通过放弃NAT实例/网关,您消除了实例/网关的运行成本,并且消除了速度限制(250mbit或10gbit)。
如果您有一台不需要直接访问Internet的计算机(并且我会问您如何打补丁*),那么一定不要分配公共IP地址。
*如果这里的答案是某种代理,那么您会产生开销,但每个开销都是他自己的。
我没有在上述迈克尔的答案中添加评论的声誉,因此无法将我的评论添加为答案。
值得注意的是,与运行自己的实例相比,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结合在一起的想法。
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地址,则会遇到管理或扩展方面的问题。希望这有助于说明和解释最佳实践为何如此。