← 返回博客

什么是 CIDR 地址块?记法详解

什么是 CIDR 地址块?记法详解

CIDR 地址块是以基地址加前缀长度表示的一段 IP 地址范围,例如 192.168.1.0/24,斜杠后的数字表示用于标识网络的高位比特有多少位是固定的。CIDR 是 Classless Inter-Domain Routing(无类别域间路由)的缩写,路由表、防火墙规则和云安全组都用它来描述网络。

如何读懂 CIDR 记法

IPv4 地址有 32 位。在 192.168.1.0/24 中,/24 表示前 24 位是网络部分,其余 8 位可自由用于标识其中的主机。这 8 个自由比特提供 2^8 = 256 个地址,范围从 192.168.1.0 到 192.168.1.255。该规则适用于任何前缀:地址块的大小是 2 的 (32 减去前缀长度) 次方。

  • /8 固定一个字节,包含 16,777,216 个地址,例如 10.0.0.0/8。
  • /16 固定两个字节,包含 65,536 个地址,例如 172.16.0.0/16。
  • /24 包含 256 个地址,而 /32 恰好是一个地址。
  • /0 是所有地址,你会在防火墙规则中看到 0.0.0.0/0,意为“任何地方”。

较早的子网掩码形式表达的是同样的意思。/24 等于 255.255.255.0,/16 等于 255.255.0.0,/20 等于 255.255.240.0。对于 IPv6,同样的思路适用于 128 位,因此 2001:db8::/32 固定前 32 位。

为什么 CIDR 取代了分类寻址

在 CIDR 之前,地址被划分为固定的类别:A、B 和 C,前缀分别为 /8、/16 和 /24。需要 2,000 个地址的组织,要么得拿下一个包含 65,536 个地址的 B 类而浪费大部分,要么拿下多个 C 类而使路由表膨胀。CIDR 允许任意前缀长度,因此可以精确分配一个 /21(2,048 个地址)。它还允许对相邻地址块进行汇总:两个在边界上对齐的相邻 /24 可以作为一个 /23 来通告,从而使全球路由表更小。

对齐与可用地址

地址块必须从与其大小相符的边界开始。/24 必须从最后一个字节为 0 的地址开始;/22 必须从第三个字节为 4 的倍数的位置开始,例如 10.0.4.0/22。这就是 10.0.3.0/22 无效的原因:它没有对齐,工具会拒绝它,或悄悄地将其规范化为真正的边界。在普通子网中,第一个地址标识网络,最后一个是广播地址,因此 /24 提供 254 个可用主机地址。云服务商通常会在每个子网中再多保留几个,所以在确定规模之前请查看他们的规则。

在实践中何处会遇到 CIDR

防火墙和允许列表是最常见的场景。允许 203.0.113.0/24 只需一条记录就可放行 256 个地址。危险在于范围过宽:本意是 /24 却写成了 /16,可能放行数万个不相关的主机。当你只知道单个 IP 时,找出其周围的地址块是一个研究步骤,其中一部分可以借助 ipto 完成。IP 地址段目录让你按 /8 和 /16 地址块浏览地址空间,并为每个块提供国家和 ASN 的分解。ASN 查询显示归属于某个网络的地址段,IP whois 查询则通过 RDAP 返回已注册的地址块,告诉你某个组织持有的确切范围。

保留地址段同样用 CIDR 表示。私有空间如 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16,环回 127.0.0.0/8 以及链路本地 169.254.0.0/16,绝不应作为公网源地址出现。bogon IP 检查器会告诉你某个地址是否落在其中,ipto 的 IP 查询也为同样的目的返回 bogon 和 bogon_type 字段。

汇总也可以反向进行:要判断两个地址段能否合并,需检查它们大小相同、相邻,并且第一个从合并后地址块的边界开始。只要有一个条件不满足,就需要两条记录而不是一条。

常见错误

  • 将基地址与主机混为一谈。192.168.1.0/24 描述的是网络,而不是设备。
  • 因为一个地址而封锁整个地址段。共享托管地址块中的一台滥用主机,并不会使周围的整个 /24 都有敌意,封锁它可能会误伤无辜的客户。
  • 忘记 IPv6。只针对 IPv4 地址段编写的规则,会让 IPv6 流量不受过滤。

想快速做个合理性检查,可以数一数主机位数,计算 2 的该次方,再与你的预期比较。API 文档介绍了如何以编程方式获取地址段数据。

直截了当的答案

/24 表示 IPv4 地址的前 24 位标识网络,剩下 8 位用于主机。这提供 256 个地址,例如 192.168.1.0 到 192.168.1.255。
对于 IPv4,用 32 减去前缀长度,然后计算 2 的该次方。/28 有 2^4 = 16 个地址,/20 有 2^12 = 4,096 个地址。
它们以不同形式描述同一个边界:CIDR 使用 /24 之类的前缀长度,而子网掩码写作 255.255.255.0。CIDR 记法更短,也适用于 IPv6。
← 返回博客