AWS 网络备忘单 - EIP、ENI、VPC 等

2025-05-25

AWS 网络备忘单 - EIP、ENI、VPC 等

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 中启动的实例无法被同一账户下的其他 VPC 或其他 AWS 账户访问。
它的主要属性是 CIDR 块,即分配给 VPC 中启动的实例的 IPv4 地址范围。
除了安全组和 ACL(稍后讨论)之外,在同一 VPC 中创建的所有实例都可以像在私有局域网中一样相互通信

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

安全组

什么是安全组?

安全充当虚拟防火墙,控制往返网络接口的流量。
启动实例时,您会获得一个默认网络接口 (eth0)。
一个 EC2 实例可以拥有多个网络接口,每个网络接口可以属于不同的安全组
稍后我将讨论如何将其他网络接口连接到实例。

多个网络接口

令人困惑的术语

安全组连接到网络接口,而不是实例。启动实例时,它会收到一个默认网络接口 (eth0)。安全组将连接到该默认网络接口。
别误会,每次为 AWS 服务指定安全组时,背后都有一个网络接口。
我们以 AWS Elastic File System 为例。创建文件系统时,您需要指定安全组。这是否意味着安全组控制对文件系统的访问?从某种意义上来说,是的。但从技术上讲,安全组将连接到 EFS 为您创建的弹性网络接口 (ENI)。

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

更加令人困惑

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

子网还具有一个名为“自动分配公有 IPv4 地址”的属性,这意味着该子网中的新网络接口除了私有 IP 地址外,还会自动分配一个公有 IPv4 或 IPv6 地址。对于安全组,此设置定义了 EC2 在该子网中启动实例时将使用的默认值。例如,假设我们使用以下命令启动一个实例:



aws ec2 run-instances \
  --subnet-id subnet-10000000 \
  --image-id resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2


Enter fullscreen mode Exit fullscreen mode

subnet-10000000如果“自动分配公网 IPv4 地址”设置为 true,则启动的实例将自动分配一个 IP 地址。但是,正如我提到的,这只是默认设置,我们可以使用--associate-public-ip-address--no-associate-public-ip-address标志来覆盖此行为。例如,如果我们运行以下命令:



aws ec2 run-instances \
  --subnet-id subnet-10000000 \
  --image-id resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
  --associate-public-ip-address 


Enter fullscreen mode Exit fullscreen mode

无论我们是否在子网上设置了“自动分配公共 IPv4 地址”,实例都会获得一个公共 IP subnet-10000000

子网隔离

创建 VPC 后,您可以将其划分为子网。在 AWS VPC 中,子网并非隔离边界,而是路由策略的容器。子网之间的隔离是通过将安全组附加到 EC2 实例来实现的。

例如,假设 VPC 中有两个子网:子网 A 的地址为 10.0.0.0/25,子网 B 的地址为 10.0.0.128/25。为了隔离它们,请为 SGSubnetA 创建一个安全组,允许所有 CIDR 10.0.0.0/25 的流量,并为 SGSubnetB 创建一个安全组,允许所有 CIDR 10.0.0.128/25 的流量。
将 SGSubnetA 连接到子网 A 中启动的实例,将 SGSubnetB 连接到子网 B 中启动的实例。
结果:只有子网中的实例可以相互通信,但子网 A 中的实例无法与子网 B 中的实例通信,反之亦然。

VPC ACL

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

弹性知识产权

弹性 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 实例(实例 A 和实例 B)、一个 ENI 和一个公网 EIP。EIP 连接到 ENI,ENI 连接到实例 A。两个 EC2 实例都运行着 Web 服务器。

让我们想象一下:

EC2 实例 A

图中,客户端向 EIP 发送一个 http 请求。EC2-A 将返回一个 HTML 页面。现在,如果我们将 ENI 从 EC2-A 移动到 EC2-B(从 EC2-A 分离并连接到 EC2-B),那么来自客户端的下一个请求将由 EC2-B 处理。
这是构建主故障转移策略的基本构建块。
注意:我不想混淆视听,所以就不讨论其他主故障转移解决方案了。需要说明的是,切换 ENI 只是在系统中构建主故障转移机制的可能解决方案之一——负载均衡器或共识组也是其他选择。

EC2 实例 B

您还可以使用它为您的 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 组件,用于支持 VPC 中的实例与互联网之间的通信。
为了使您的实例能够连接到互联网或从互联网访问,VPC 需要具备互联网网关。请记住,这是必需组件,但并非充分条件,这意味着您还需要其他组件来实现互联网连接。“从 EC2 连接到互联网”“从互联网连接到 EC2”部分将对此进行讨论。

路由表

路由表定义了流量如何从一个子网流向另一个子网。
创建 VPC 时会自动创建一个路由表,该表仅包含一条规则,允许 VPC 中的所有实例相互通信(该规则称为“从子网 CIDR 到本地”)。
该规则无法修改或删除,这意味着同一 VPC 中的实例始终可以相互通信,您无法使用路由表进行限制。您需要使用安全组来实现这一点:请参阅“子网隔离”部分。

私有子网 VS 公共子网

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

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

从 EC2 连接到 Internet

要连接到互联网,您有两种选择:

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

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

在告诉你我推荐哪一个之前,让我先稍微跑题一下。
如果你一直跟着我,你可能会问自己一些常见问题。
关于第一个选项,一个常见的问题是:为什么互联网网关不足以连接到互联网?为什么 EC2 实例需要公网地址?
答案是,互联网网关不执行完整的 NAT(就像我们家里的路由器一样),它只对映射到实例的公网 IP 执行 1 对 1 NAT。这意味着调用无法使用私有地址离开互联网网关,因为网关不知道在返回途中如何将答案映射到当前实例。
实际上,它不执行 NAT

关于第二种选择,一个问题是为什么我们需要两个子网、两个路由表等等。
可以设想,只有一个子网,然后在其中创建一个 NAT。为 VPC 创建一个 Internet 网关就足够了。答案是,你无法做到这一点,我也不太清楚为什么。你需要两个子网。
这看起来像是 AWS 的设计决策。

我们应该选择哪种方法?

第一种方法(公有子网)的缺点是,我们不仅创建了从 EC2 实例到互联网的通道,还创建了从互联网到 EC2 实例的通道。这意味着互联网上的任何人都可以尝试访问您的 EC2 实例。
从技术上讲,没有什么可以阻止您使用这种方法,毕竟您可以使用拒绝入站连接的安全组。但是,通过使用私有子网,即使您不小心打开了安全组,也无法从 AWS 外部直接访问该子网,因此它提供了额外的保护。
最后一点使私有子网成为我的默认方法

从 Internet 连接到 EC2

要从互联网访问一台机器,您需要一个互联网网关和一个公网 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 端点,这样可以连接到实例,同时保持 Internet 上的任何人都无法访问。

AWS SSM 已预装在 Amazon Linux 2 实例上,这意味着您可以开箱即用地连接到您的 EC2 实例。总之,在实例引导过程中,您可以非常轻松地在用户数据中安装 SSM。

结论

我已经介绍了 AWS 网络的大部分内容,但并非全部。接下来你可能想阅读的内容包括:VPN、Transit 网关、VPC 对等连接、私有链接、Route53 私有托管区域等等。

备忘单

AWS 资源 定义
专有网络 AWS 云网络的独立部分
安全组 安全组与网络接口(弹性或非弹性)相关联,它们充当虚拟防火墙,控制来自/到网络接口的流量
子网隔离 子网并非隔离边界,而是路由策略的容器。要隔离一个子网,请将安全组附加到每个子网中启动的实例。
访问控制列表 ACL 是一种网络防火墙。使用安全组,您可以控制实例的进出情况;使用 VPC ACL,您可以控制 VPC 的进出情况。
弹性知识产权 静态 IPv4 地址(可以是私有的或公共的)
埃尼 可以连接到 EC2 实例的网络接口
互联网网关 VPC 组件,允许 VPC 中的实例连接到互联网。它是必要的,但还不够。
公共子网 流量路由到 Internet 网关的子网
私有子网 没有通往互联网网关的路由的子网
从 EC2 连接到 Internet 要连接到互联网,EC2 实例需要满足以下任一条件:
- 位于具有互联网网关的 VPC 中,并在其网络接口上附加公网地址(或公网 EIP)
;- 位于具有互联网网关和 NAT 网关的 VPC 中。路由表需要包含一条规则,将流量(从 EC2 实例到互联网的流量)转发到 NAT 网关。
从 Internet 连接到 EC2 要从 Internet 连接到 EC2 实例,您需要拥有一个带有 Internet 网关的 VPC,并在其网络接口上附加一个公共地址(或公共 EIP)
VPC 终端节点 VPC 端点允许 VPC 中的实例与受支持的 AWS 服务(S3、Dynamo 等)进行通信,而无需 Internet 网关或 NAT 网关
在 EC2 中获取 Shell SSM 或 SSM + VPC 端点

在Twitter上关注我,即可在你的动态中获取新文章。
封面图片由GraphicMama 团队提供

文章来源:https://dev.to/napicella/aws-networking-cheat-sheet-eip-eni-vpc-etc-139m
PREV
何时、为何以及如何使用 Vuex
NEXT
停止使用加载微调器 开发 Skeleton 心智模型 添加 TypeScript 支持 使用 Artist 组件列表和占位符 奖励 TypeScript 实用程序 术语 带有 Suspense 的占位符 占位符文本 告诉我你的想法