亚马逊网络服务 VPC 设置

Amazon Web Services VPC setup

我对上面的设置有点困惑。据我了解,在 public 子网内,有四个实例(3 个网络服务器 + 1 个 NAT)。为什么他们都有 public(弹性)IP 地址?为什么网络服务器会有 public 个 IP 地址?他们不应该通过 NAT 实例访问吗?我的意思是一切(入站或出站)都应该通过 NAT 实例,对吗?这是否意味着网络服务器与外界之间存在绕过 NAT 的直接路径?我在这里错过了什么? "Router" 和 "Internet Gateway" 也是 EC2 实例吗?

public 子网的主要思想是应该可以从外部世界访问。如果你想拥有一个网络服务器并提供流量 - 你应该将它放在 public 子网中并附加一个白色 (public) IP。 (在 AWS 中你也可以使用弹性负载均衡器)

NAT 代表网络地址转换。如果您希望您的服务器具有 Internet 连接(例如为了下载软件更新)而不暴露于外部世界,即私有实例,则这是必需的。

所有这些概念都在 "Multitier architecture" 方法中进行了描述。 看看这篇文章,以使事情更清楚: https://en.wikipedia.org/wiki/Multitier_architecture

互联网网关

互联网网关不是 EC2 实例。它是您添加到 VPC 的组件。

http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Internet_Gateway.html

其功能是为 VPC public 子网提供 to/from 互联网访问。

路由器

您不会为此找到实际的组件。它只是图表中用来表示您可以创建的各种路由表的假项目。

Public 子网

public 子网是一个直接连接有 Internet 网关的子网。基本上,这意味着它可以直接连接到互联网。

位于 public 子网内的任何 EC2 实例将能够:

  1. 与互联网建立传出连接,并且
  2. 接收来自 Internet 的传入连接。

但是为了执行其中任何一个,它必须有一个 public IP 地址。这可以是自动分配的 public IP 地址或弹性 IP 地址。

NAT

这可以是 NAT 实例(您 运行 的 EC2 实例),或 NAT 网关(AWS 提供的组件)。

NAT 有点类似于 Internet 网关,只是它们不提供入站连接。

NAT 的目的是为私有子网提供出站互联网访问。它帮助私有子网访问互联网,但 NAT 本身必须驻留在 public 子网中(因此它自己可以使用互联网网关访问互联网)。

私有子网

私有子网是不能直接访问互联网的 VPC 子网。它用于保护组件免受外界影响。可以放在私有子网中的项目包括(但不限于):

  • 数据库
  • 工作者实例
  • 使用其他组件将流量定向到它们的网络服务器(例如弹性负载均衡器)
  • 其他私服

在您的图表中,如果数据库服务器需要与 Internet 建立出站连接,则这些连接将通过 NAT 发送。

最后的笔记

直接回答您的问题:

How come they all have public (elastic) IP addresses?

因为在这种情况下,他们都需要直接访问互联网。

Shouldn't they be accessible via the NAT instance?

没有。与 Web 服务器的传入连接将通过 Internet 网关进行。 NAT 纯粹是为了私有子网的利益。

I mean everything (inbound or outbound) should go via the NAT instance, right?

没有。只有来自私有子网的出站连接才会使用 NAT。没有别的。

Does it mean there is a direct path between the webservers and the outside world bypassing the NAT?

是的。

Is the the "Router" and "Internet Gateway" also EC2 instances?

没有。

路由器代表使用您的 VPC 的路由表在 AWS 内部发生的事情。除了路由表之外,没有用于此的组件。

Internet 网关是您添加到 VPC 的 AWS 组件。

如果您是 AWS 的新手,情况就很模糊了。除了@Matt Houser 的回答,我将添加更多信息。这种图的主要原因是因为VPC内部有一个限制导致这个。

您必须知道这一点:AWS VPC 不是您可以自由移动、更改 IP 地址、资源地址等的典型实体设置。

  • 您想将网络服务器服务流量与 NAT gateway/NAT 实例流量隔离。
  • AWS NAT 网关不是免费的。但是设置起来要容易得多。它将按活动连接小时数和每 GB 流量收费。一旦配置,您不能临时关闭它们以节省成本。一旦你终止它,路由 table 设置就消失了,你需要创建一个脚本来重建它。 (其实不是很复杂)
  • AWS NAT 实例也不是免费的。它是加载了 NAT 配置的设备,运行 在 EC2 实例下(典型的 EC2 费用)。虽然您可以将其关闭,并且在不使用时只需支付很少的 EBS 费用。
  • 由于 NAT 实例的配置方式(如上所述,这不是您的典型网络),与 NAT 实例共享同一子网的服务器无法使用它连接到互联网。除非 1. 使用另一个 EC2 构建您自己的 NAT 服务器或 2. 创建另一个 public 子网,将 NAT 实例放在那里,因此私有和网络 public 子网路由 table 都可以指向 NAT 实例 ID。
  • 1个VPC限制为5个EIP(您可以要求增加限制),如果EIP耗尽,AWS建议您对私有子网使用NAT。

A public 子网将有路由 table 指向互联网网关,即。 0.0.0.0/0 -> igw-id

私有子网是没有上述条目的东西。

(更新)@Micahael - sqlbot 指出了我的错误,我只是混淆了 NAT 网关和 NAT 实例。它们是不同的,但路由 table 限制仍然适用。这是修改后的信息:

因此,如果您想通过 AWS NAT 连接您的私有子网(比如子网 X),您需要创建 NAT 网关或 NAT 实例。

在子网X关联路由table(route table X),使默认路由指向这样。
0.0.0.0/0 -> NAT-gateway-ID/NAT-intance-ID

但是 NAT 网关必须找到连接到互联网的方法,所以它必须驻留在具有路由 table(路由 table Y)的 public 子网(子网 Y)中,例如这个 0.0.0.0/0 -> NAT-gateway-ID/NAT-intance-ID

如您所见,当 EC2 与 NAT 网关位于同一子网时,无法将路由 table Y 更改为一些 "creative route" : 这行不通 0.0.0.0/0 -> Internet Gateway-ID 0.0.0.0/0 -> NAT-gateway-ID/NAT-intance-ID

并且您不能对路线 table Y 执行此操作。 NAT-gateway-ID/NAT-intance-ID -> Internet Gateway-ID 0.0.0.0 -> NAT-gateway-ID/NAT-intance-ID

因此,那些 EC2 实例只能使用 EIP(除了流量隔离问题)

这里是NAT网关和NAT实例的参考 http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html

使用哪一个?这完全取决于使用情况、维护难易程度和成本。 VPC NAT 网关更容易设置,但对于不经常使用的人来说可能不划算。 对于per/GB流量费用,很难判断你是否应该获得NAT实例,因为高流量意味着你需要更好的EC2实例,成本最终可能更接近使用NAT网关。