VPC 默认 CIDR /16 为什么是 /16 - IP 地址设计的趣闻与陷阱

解析 VPC 默认 CIDR 设为 /16 的原因、RFC 1918 私有地址空间的历史、子网中不可用的 5 个 IP 地址以及 CIDR 设计的常见失败模式。

RFC 1918 与私有 IP 地址的历史

要理解 VPC 的 CIDR 设计,首先需要了解 RFC 1918 的历史。1996 年发布的 RFC 1918 为不直接连接互联网的私有网络预留了 3 个地址范围:10.0.0.0/8(约 1,677 万个地址)、172.16.0.0/12(约 104 万个地址)、192.168.0.0/16(约 6.5 万个地址)。这 3 个范围被预留的背景是 1990 年代互联网的快速增长。IPv4 的地址空间仅有约 43 亿个,为所有设备分配全局 IP 地址在物理上不可能,因此需要在组织内部网络中使用不在互联网上路由的私有地址。

为什么是 /16 - 不大不小的绝妙尺寸

/16 的 CIDR 块包含 65,536 个 IP 地址。AWS 选择 /16 作为默认值的原因在于,它为大多数工作负载提供了充足的 IP 地址空间,同时在 10.0.0.0/8 范围内可以切出 256 个 /16 块的良好平衡。VPC 的 CIDR 可指定 /16 到 /28。/28 是 16 个地址(其中可用 11 个),是最小的 VPC。/16 是 65,536 个地址,是默认的最大尺寸。实际上,/16 在很多情况下是过剩的。如果只运行 100 台 EC2 实例,/24(256 个地址)就足够了。

子网中不可用的 5 个 IP 地址

在 VPC 的子网中,每个子网的前 4 个和最后 1 个,共 5 个 IP 地址被 AWS 预留,无法分配给 EC2 实例等。以 /24 子网(10.0.1.0/24)为例,10.0.1.0 是网络地址,10.0.1.1 用于 VPC 路由器,10.0.1.2 用于 DNS 服务器,10.0.1.3 由 AWS 为将来使用而预留,10.0.1.255 是广播地址。也就是说,/24 子网的 256 个地址中,实际可用的是 251 个。这「5 个预留」在设计小型子网时影响很大。/28 子网只有 16 个地址,减去 5 个预留后仅剩 11 个可用地址。

CIDR 设计的失败模式

VPC 的 CIDR 设计中最常见的失败是 CIDR 重叠。通过 VPC Peering 或 Transit Gateway 连接 VPC 时,如果连接的 VPC 的 CIDR 重叠则无法路由。如果所有 VPC 都使用默认的 10.0.0.0/16,则 VPC 间完全无法连接。与本地网络的连接(Direct Connect、Site-to-Site VPN)也会出现同样的问题。如果本地网络使用 10.0.0.0/8,VPC 的 CIDR 在 10.x.x.x 范围内就会与本地网络冲突。

IPv6 与 VPC 的未来

AWS 从 2016 年开始支持 VPC 中的 IPv6。IPv6 的 VPC CIDR 为 /56,由 AWS 自动分配。IPv6 的地址空间为 2^128(约 340 涧),事实上无限,因此不存在 IPv4 那样的 CIDR 设计烦恼。然而,完全迁移到 IPv6 还为时尚早。许多企业的本地网络仅支持 IPv4,部分 AWS 服务也未完全支持 IPv6。现实的方法是以双栈(IPv4 + IPv6)配置 VPC,从新工作负载开始逐步采用 IPv6。