当前位置: 首页 > 知识库问答 >
问题:

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

包翔
2023-03-14

AWS VPC配置有4种场景。但让我们看看这两个:

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

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

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

共有3个答案

经骁
2023-03-14

我没有在迈克尔的回答中添加评论的名声,因此添加了我的评论作为回答。

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

托管NAT实例每月成本=33.48美元/月(0.045美元/小时*每月744小时)4.5美元(每处理GB数据0.045美元*100GB)10美元(通过NAT网关传输的所有数据的0.1美元/GB标准AWS数据搬迁费用)=47.98美元

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

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

庄星汉
2023-03-14

我建议使用另一种策略——“私有”子网和NAT实例/网关。它们不是必需的。如果你不想从互联网上访问机器,不要把它放在允许这样访问的安全组中。

通过抛弃NAT实例/网关,您消除了实例/网关的运行成本,并且消除了速度限制(无论是250兆位还是10千兆位)。

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

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

彭华皓
2023-03-14

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

新的托管 NAT 服务不会从根本上更改以下信息的适用性,但以下内容中未解决此选项。仍然可以按说明使用 NAT 实例,也可以改为预配托管 NAT 网关服务。本答案的扩展版本将集成有关 NAT 网关及其与 NAT 实例的比较的更多信息,因为这些都与 VPC 中的私有/公有子网范例相关。

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

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

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

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

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

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

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

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

专用子网上的机器可以访问互联网,因为专用子网上的默认路由不是VPC“互联网网关”对象,而是配置为NAT实例的EC2实例。

NAT实例是公共子网上具有公共IP和特定配置的实例。有一些AMI是预先构建好的,您也可以构建自己的AMI。

当专用寻址的机器向外发送流量时,流量由VPC发送到NAT实例,NAT实例将数据包上的源IP地址(专用机器的专用IP地址)替换为自己的公共IP地址,将流量发送到Internet,接受响应数据包,并将它们转发回发起机器的专用地址。(它也可以重写源端口,无论如何,它会记住映射,以便知道哪个内部机器应该接收响应数据包)。NAT实例不允许任何“意外”的入站流量到达专用实例,除非它被专门配置为这样做。

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

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

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

那么,从本质上来说,“私有”和“公共”的名称并不真的与互联网的可访问性或不可访问性有关。它们是关于将被分配给该子网上的实例的地址的种类,这是相关的,因为需要转换-或避免转换-那些用于互联网交互的IP地址。

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

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

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

< sup>2正如文档中提到的,这里实际讨论的是端口和网络地址转换。将组合操作称为“NAT”是很常见的,尽管从技术上来说有点不精确这有点类似于我们很多人倾向于说“SSL”,而实际上我们指的是“TLS”。我们知道我们在谈论什么,但我们没有用最正确的词来描述它。请注意,我们在本文档中使用术语NAT是为了遵循常见的IT惯例,尽管NAT设备的实际作用是地址转换和端口地址转换(PAT)

 类似资料:
  • 以我的拙见,关于“什么是单子”这个著名问题的答案,尤其是投票最多的答案,试图解释什么是单子,而没有明确解释为什么单子是真正必要的。它们能被解释为一个问题的解决方案吗?

  • 问题内容: 我不知道为什么我们需要在报表。我认为,此代码块 使用以下命令与此相同: 我想念什么吗? 问题答案: 如果您提早返回,将会有所不同: 比较一下: 可能导致差异的其他情况: 如果在except块内引发异常。 如果引发异常,但不是。 其他控制流语句,例如和语句。

  • 问题内容: Angular应用使用属性而不是事件。 为什么是这样? 问题答案: ng-click包含一个角度表达式。Angular表达式是在Angular 范围的上下文中求值的,该范围绑定到具有ng- click属性的元素或该元素的祖先。 Angular表达式语言不包含流控制语句,也不能声明变量或定义函数。这些限制意味着模板只能访问由控制器或指令提供的变量和运行功能。

  • 为什么我们需要字典? 计算机最适合使用数字,而人类最适合使用姓名。我们创建了DNS以便记住主机名而不是IP地址。字典以相同的方式使用,因此我们可以记住AVP名称而不是类型编号。当FreeRADIUS解析请求或生成响应时,会查阅字典。 但是,字典与DNS不同,因为RADIUS客户端不知道FreeRADIUS使用的这些“友好”名称。永远不会在RADIUS客户端和RADIUS服务器之间交换AVP名称。

  • 问题内容: 我将稍微解释一下我的脚本,以便您可以理解我的问题。 基本上我做了一个脚本来检查SOCKS5是还是。 当我在上面测试我的脚本时,它运行良好,但是当我在Windows上对其进行测试时,直到我将以下行添加到: 谁能向我解释为什么我在Windows中需要此行,而在Linux服务器上却不需要? 问题答案: SSL证书上的此cURL手册页介绍了连接到SSL / TLS受保护主机时 证书验证 的过程

  • 问题内容: 我开始使用RxJS,但我不明白为什么在此示例中我们需要使用类似or 的函数;数组的数组在哪里? 如果有人可以直观地解释正在发生的事情,那将非常有帮助。 问题答案: 当您有一个Observable的结果是更多Observable时,可以使用flatMap。 如果您有一个由另一个可观察对象产生的可观察对象,则您不能直接过滤,缩小或映射它,因为您有一个可观察对象而不是数据。如果您生成一个可观