通过子网的 CIDR 块后出现 'Must be valid Ipv4 CIDR' 错误

Getting 'Must be valid Ipv4 CIDR' error after passing subnet's CIDR block

我在 AWS 上创建了一个 VPC(public 和私有子网),IPV4 CIDR 块为 10.0.0.0/26(即它可以有 2^6 = 64 个 IP 地址以及一个子网地址和一个广播地址)。我想创建以下两个子网,但出现 Must be valid Ipv4 CIDR 错误:

  1. 具有 10.0.0.0/28 CIDR 块的 public 子网,并且
  2. 具有 10.0.0.8/28 CIDR 块的私有子网

如果我将子网掩码设为 /28 并且我想将地址分成两个子网,则地址将落在 10.0.0.0 [10.0.0.00000000] - 10.0.0.15 [10.0.0.00001111] 范围内。另一方面,如果我将 CIDR 块指定为 10.0.0.16/28,我不会收到任何错误。为什么 AWS 将 CIDR 块作为 10.0.0.8/28 给出 Must be valid Ipv4 CIDR 错误?

A /28 有 2^(32-28) = 2^4 = 16 个地址,所以块的全零地址的最后一个八位字节必须能被 16 整除(它的最低有效位必须是0 0 0 0)。 8 的 LSB 是 1 0 0 0.

10.0.0.8/28 是无效的 CIDR 块。 10.0.0.0 到 .15 在 CIDR 表示法中表示为 10.0.0.0/28。


按要求澄清被数字 16 整除的重要性,上面:

不完全是地址数可以被最后一个块整除,而是在 CIDR 表示法中 x.x.x.x/n 每个块的大小始终为 2^(32-n) 个地址,并且 x.x.x.x 必须在指定块时指定块中的 first 地址。

将 IPv4 地址 x.x.x.x 转换为二进制,您将得到一个 32 位数字。地址 x.x.x.x 的 (32-n) 个最低有效位必须为 0。这是块中的第一个(第 0)地址,也称为 "all-zeroes" 地址,因为未屏蔽的 bits——最后的32-n位——全为0。为子网指定CIDR块时,这是必须指定的地址。

在 /28 块的情况下,请注意 - 根据定义 - 任何以二进制表示的数字,其最低有效位 32-28 = 4 位为 0 0 0 0 也可以被 2^(32- 28) = 16,其他任何数字都不是。

对于大小为 /24 到 /32 的块,这个数学对人类来说更容易,因为你不需要在头脑中将整个 x.x.x.x 转换为二进制——你只需要四个八位字节的最后一个。

可以从 10.0.0.0/26 的超网派生的唯一可能的 /28 子网是:

10.0.0.0/28    .0 to .15
10.0.0.16/28  .16 to .31
10.0.0.32/28  .32 to .47
10.0.0.48/28  .48 to .63