AWS 网络基础设施可能会变得复杂。

不同技术之间也存在一些重叠,这使得更难理解什么是做什么的。

我听到最多的一些问题是关于 AWS VPC、弹性网络接口、弹性 IP 以及密切相关的安全组和 ACL 之间的交集。这是我试图用实际术语澄清这些技术之间的区别。

如果您渴望查看备忘单,请向下滚动到底部。

AWS VPC

历史 - VPC 是事后的想法

在 AWS 的早期,当 EC2 提供午餐时,所有客户的所有实例都可以相互通信。如果 Alice 在她的账户中启动了一个实例,而 Bob 启动了另一个实例是他的账户,那么这两个实例能够开箱即用地相互通信。

为了防止这种情况发生,Alice(或 Bob)需要设置一个安全组,只允许来自选定 ip 或使用相同安全组启动的实例的流量。

安全组的问题是它很容易搞砸,从而允许其他 AWS 账户破坏实例。这种操作模式称为 EC2-classic 以区别于配置 EC2 实例的新方式。

在这种新模式下,EC2 实例始终在具有默认安全组的 VPC(称为默认 VPC)中启动。不同 VPC 中的实例不会相互通信,除非它们是对等的。

当然,您也可以创建自己的 VPC 并在其中启动实例。

今天,EC2-classic 仅出于遗留原因而存在,这与一旦启动服务就收回服务的挑战有关。

什么是 VPC?

了解了历史,什么是 VPC? 它是 AWS 云的一个独立部分。在 VPC 中启动的实例无法从同一账户或其他 AWS 账户中的其他 VPC 访问。

它的主要属性是 CIDR 块,它是分配给在 VPC 中启动的实例的 IPv4 地址范围。

撇开安全组和 ACL(稍后讨论),在同一 VPC 中创建的所有实例都可以相互通信,就像在私有 LAN 中一样

创建 VPC 后,您可以通过划分分配给 VPC 的 IP 地址范围来添加其他子网。

安全组

什么是安全组?

安全组充当控制进出网络接口的流量的虚拟防火墙。

启动实例时,您将获得一个默认网络接口 (eth0)。

一个 EC2 实例可以有多个网络接口,并且每个网络接口可以有不同的安全组

稍后我将讨论如何将其他网络接口附加到实例。

[多个网络接口](https://res.cloudinary.com/practicaldev/image/fetch/s--uxMjtFVi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/b888o6cvdolifqjncpjq.png)

令人困惑的术语

安全组附加到网络接口,而不是实例。当您启动一个实例时,它会收到一个默认网络接口 (eth0)。安全组将附加到该默认网络接口。

不要上当,每次为 AWS 服务指定安全组时,背后都有一个网络接口。

让我们以 AWS 弹性文件系统为例。创建文件系统时,您将指定安全组。这是否意味着安全组控制对文件系统的访问?嗯,在某种意义上是的。但从技术上讲,安全组将附加到 EFS 代表您创建的弹性网络接口 (ENI)。

稍后我将讨论 ENI,这里的要点是:安全组与网络接口(弹性或非弹性)相关联,它们充当虚拟防火墙,控制来自/到网络接口的流量。

更混乱

VPC 中的子网可以有一个默认的安全组。这是否意味着安全组可以附加到网络接口和子网?嗯,不是真的。通过为子网定义默认安全组,您已通知 EC2 下次在该子网中启动实例时,它需要将该安全组附加到实例的网络接口。也就是说,除非您在启动实例 api 调用中覆盖安全组。

子网隔离

创建 VPC 后,将其划分为子网。在 AWS VPC 中,子网不是隔离边界。相反,它们是路由策略的容器。 子网之间的隔离是通过将安全组附加到 EC2 实例来实现的。

例如,假设我们在 VPC 中有两个子网:SubnetA 是 10.0.0.0/25,SubnetB 是 10.0.0.128/25。要隔离它们,请为允许 CIDR 10.0.0.0/25 的所有流量的 SGSubnetA 和允许 CIDR 10.0.0.128/25 的流量的另一个 SGSubnetB 创建一个安全组。

将 SGSubnetA 附加到在 SubnetA 中启动的实例,为 SubnetB 中的实例附加 SGSubnetB。

结果:只有子网中的实例可以相互通信,但来自 SubnetA 的实例不能与来自 SubnetB 的实例通信,反之亦然。

VPC ACL

网络访问控制列表 (ACL) 是网络防火墙。 使用安全组,您可以控制进出实例的内容,使用 VPC ACL,您可以控制进出 VPC 的内容。

EIP

弹性 IP 地址 (EIP) 是 AWS 提供的静态 IPv4 地址。

您将 EIP 关联到网络接口。文档在这一点上有点混乱,因为它说您可以将 EIP 附加到正在运行的实例或 ENI。它没有说的是,通过将 EIP 附加到实例,您实际上是将其附加到实例的默认网络接口 (eth0)。

您可以通过附加附加 ENI 将附加网络接口附加到实例。

为什么你甚至需要 EIP?它们与公共 IP 不同吗?

公共 IP 地址是动态的,一旦使用它的 EC2 实例停止或终止,它们的值就会丢失。

弹性 IP 是静态的,它们可以在实例停止/启动周期中存活。

埃尼

弹性网络接口 (ENI) 是实例的网络堆栈。

每个 ENI 都位于 VPC 的特定子网中,并具有以下属性(非详尽列表):

  • 私有IP地址

  • 公共 IP 地址

  • 弹性IP地址

  • 子网

  • MAC地址

  • 安全组

这种新模型的一个非常重要的后果是,在特定 VPC 子网中启动 EC2 实例的想法实际上已经过时了。单个 EC2 实例可以连接到两个 ENI,每个 ENI 位于不同的子网上。 ENI(不是实例)现在与子网关联。

这启用了两个强大的用例:

假设我们创建了两个 EC2 实例(Instance-A 和 Instance-B),一个 ENI 和一个公共 EIP。 EIP 连接到 ENI,而 ENI 连接到实例 A。两个 EC2 实例都运行一个 Web 服务器。

让我们想象一下:

[EC2 实例 A](https://res.cloudinary.com/practicaldev/image/fetch/s--7CRiIB80--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/rgduorqe5dgzr9tztzjq.png)

图中,Client 向 EIP 发送 http 请求。 EC2-A 将响应一个 html 页面。现在,如果我们将 ENI 从 EC2-A 移动到 EC2-B(从 EC2-A 分离并附加到 EC2-B),来自客户端的下一个请求将是 EC2-B 的服务器。

这是允许构建主故障转移策略的基本构建块。

注意:我不想把水弄得一团糟,所以我不会讨论其他的 Primary-Failover 解决方案。请注意,ENI 切换只是在系统中构建主故障转移机制的可能解决方案之一 - 负载均衡器或共识组是其他选项。

[EC2 实例 B](https://res.cloudinary.com/practicaldev/image/fetch/s--D07_BFBH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/smeb70759zer94jigep5.png)

您还可以使用它为您的 Web、应用程序和数据库服务器构建双宿主环境。实例的第一个 ENI 将附加到公共子网,将 0.0.0.0/0(所有流量)路由到 VPC 的 Internet 网关。实例的第二个 ENI 将附加到一个私有子网,其中 0.0.0.0 路由到连接到您公司网络的 VPN 网关。您将使用专用网络进行 SSH 访问、管理、日志记录等。您可以为每个 ENI 应用不同的安全组,以便允许流量端口 80 通过第一个 ENI,并允许来自端口 22 上的私有子网的流量通过第二个 ENI。

注意:创建子网时,您可以指定一些默认选项,这些选项将应用于与该子网关联的所有 ENI。最值得注意的是,您可以选择为与该子网关联的所有 ENI 提供公共 ip。

互联网网关

允许您的 VPC 中的实例与 Internet 之间进行通信的 VPC 组件。

要让您的实例连接到 Internet 或从 Internet 访问,VPC 需要具有 Internet 网关。请记住,这是一个必要的组件,但还不够,这意味着您还需要其他东西来启用互联网连接。这将在_“从 EC2 连接到 Internet”_ 和 “从 Internet 连接到 EC2” 部分中讨论。

路由表

路由表定义了流量如何从一个子网流向另一个子网。

创建 VPC 时会自动创建一个路由表,其中仅包含一条规则,该规则允许 VPC 中的所有实例相互通信(该规则称为“从子网 CIDR 到本地”)。

该规则无法修改或删除,这意味着同一 VPC 中的实例始终可以相互通信,您无法使用路由表进行限制。您需要为此使用安全组:请参阅“Subnets Isolation”部分。

私有 VS 公有子网

私有和公有是子网的一个紧急属性,这意味着子网变为公有或私有取决于子网的设置方式。它们在 AWS 控制台中标识一个概念,而不是实际的实体。

公共子网

如果子网的流量被路由到 Internet 网关,则该子网称为公共子网。

私有子网

如果子网没有到 Internet 网关的路由,则该子网称为私有子网。

从EC2连接到互联网

要连接到 Internet,您有两种选择:

  1. 公共子网。在 VPC 中创建一个 Internet 网关,并为 EC2 机器网络接口分配一个公共地址(或公共 EIP)。同样的配置也允许从 Internet 到 EC2 的流量。需要将分配给网络的路由表设置为将 Internet 流量 (0.0.0.0/0) 转发到 Internet 网关

  2. 私有子网。创建两个子网(SubPublic 和 SubPrivate)和一个 Internet 网关。在 SubPublic 中创建一个 NAT 网关。创建两个路由表,一个用于 SubPublic,一个用于 SubPrivate。在 SubPublic 的 RouteTable 中,定义将所有 Internet 流量 (0.0.0.0/0) 转发到 Internet 网关的规则。在 SubPrivate 中定义将 Internet 流量 (0.0.0.0/0) 转发到 NAT 网关的规则

在我告诉你我会推荐哪一个之前,让我离题一点。

如果你一直跟着你,你可能会问自己一些常见的问题。

关于第一个选项,一个常见的问题是:为什么 Internet 网关不足以连接到 Internet?为什么 EC2 实例需要公共地址?

答案是互联网网关不执行完整的 NAT(就像我们家的路由器一样),它只对映射到实例的公共 IP 执行 1 对 1 的 NAT。这意味着呼叫不能使用私有地址退出 Internet 网关,因为网关不知道如何在返回的路上将答案映射到当前实例。

实际上,它不做 NAT

关于第二个选项,一个问题是为什么我们需要两个子网、两个路由表等。

可以想象,拥有一个子网并在其中创建一个 NAT。为 VPC 创建一个 Internet 网关,仅此而已。答案是你不能这样做,我不确定为什么。您需要有两个子网。

看起来像是 AWS 做出的设计决定。

我们应该选择哪种方法?

使用第一种方法(公共子网)的缺点是,我们不仅创建了从 EC2 实例到 Internet 的通道,而且反之亦然。这意味着 Internet 上的任何人都可以尝试访问您的 EC2 实例。

从技术上讲,没有什么可以阻止您使用这种方法,毕竟您可以使用拒绝入站连接的安全组。但是,通过使用私有子网,即使您不小心打开了安全组,也无法从 AWS 外部直接访问该子网,因此它是一个额外的保护层。

最后一点使私有子网成为我的默认方法

从 Internet 连接到 EC2

要从 Internet 访问机器,您需要一个 Internet 网关和一个公共 IP(或附加到实例的公共 EIP)。这是我们在上一节中看到的公共子网方法。

VPC 终端节点

VPC 终端节点允许 VPC 中的实例与受支持的 AWS 服务(S3、Dynamo 等)进行通信,而无需 Internet 网关或 NAT 网关。用例:EC2 实例需要能够访问其他 AWS 服务,但您不希望允许任何其他出站流量到 Internet。

您可以通过附加一个仅允许与 AWS 服务的出站连接的安全组来获得相同的结果,但这会带来意外更改安全组以允许访问 Internet 的风险。 VPC 端点解决了这个问题。

在 EC2 中获取 Shell

忘记 SSH,使用 AWS SSM 连接到实例。或者,如果您想使用 SSH,请使用 SSM over SSH。

管理大量 SSH 密钥或堡垒主机很快就会被遗忘。

如果 EC2 实例不需要面向客户(私有子网),请考虑为 SSM 使用 VPC 端点,它允许连接到实例,同时互联网上的任何人都完全无法访问。

AWS SSM 预装在 Amazon Linux 2 实例上 - 也就是说,您可以开箱即用地开始使用它来连接您的 EC2 实例。无论如何,作为实例引导程序的一部分,在用户数据中的实例上安装 SSM 非常容易。

结论

我已经介绍了一大堆 AWS 网络,但不是全部。接下来您可能想要阅读的内容包括:VPN、中转网关、VPC 对等互连、私有链接、Route53 私有托管区域等。

备忘单

AWS 资源

定义

专有网络

AWS 云网络的隔离部分

安全组

安全组与网络接口(弹性或非弹性)相关联,它们充当虚拟防火墙,控制进出网络接口的流量

子网隔离

子网不是隔离边界。相反,它们是路由策略的容器。要将一个子网与另一个子网隔离,请将一个安全组附加到每个子网中启动的实例

访问控制列表

ACL 是网络防火墙。使用安全组,您可以控制进出实例的内容,使用 VPC ACL,您可以控制进出 VPC 的内容

生态工业园

静态 IPv4 地址(可以是私有的或公共的)

埃尼

可以附加到 EC2 实例的网络接口

互联网网关

允许 VPC 中的实例连接到 Internet 的 VPC 组件。这是必要的,但还不够

公共子网

将流量路由到 Internet 网关的子网

私有子网

没有到 Internet 网关的路由的子网

从 EC2 连接到 Internet

要连接到 Internet,EC2 实例需要是:

- 在具有 Internet 网关的 VPC 中,并有一个公共地址(或公共 EIP)附加到其网络接口

- 在具有 Internet 网关和 NAT 网关的 VPC 中。路由表需要具有将流量(来自 EC2 实例并定向到 Internet 流量)转发到 NAT 网关的规则

从 Internet 连接到 EC2

要从 Internet 连接到 EC2 实例,您需要有一个带有 Internet 网关的 VPC 并在其网络接口上附加一个公共地址(或公共 EIP)

VPC 终端节点

VPC 终端节点允许 VPC 中的实例与支持的 AWS 服务(S3、Dynamo 等)进行通信,而无需 Internet 网关或 NAT 网关

在 EC2 中获取 Shell

SSM 或 SSM + VPC 端点


在Twitter上关注我,在您的提要中获取新帖子。

封面图片归功于GraphicMama-team

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐