CIDR 转 IP 范围
把 CIDR 网段换算成地址范围,或把范围拆成刚好覆盖它的最小网段。
前缀表示有多少位是固定的,其后的每一位都会变化。
覆盖范围
10.0.0.0 – 10.0.3.255
共 1,024 个地址。
起始地址
10.0.0.0
结束地址
10.0.3.255
地址总数
1,024
子网掩码
255.255.252.0
可分配给主机
1,022
首尾两个分别是网络地址和广播地址。
下一个地址块起始于
10.0.4.0
把一个大块切成连续分配时很有用。
对齐规则,其余一切都由它解释
有一条约束统治着 CIDR:一个含 2ⁿ 个地址的块,必须从 2ⁿ 的整数倍处开始。/24 覆盖 256 个地址,所以它只能从最后一个八位组为 0 的地方开始。/26 覆盖 64 个,所以它只能从 .0、.64、.128 或 .192 开始。
这不是官僚主义。正是它让路由变得飞快:路由器决定一个包往哪儿走,靠的是把目的地址做掩码再比较,也就几条指令的事。而任意范围就得在每一个包上,把每个地址跟上下界各比一遍。
实际后果,正是这件工具存在的理由。人给出的范围不会顾及 2 的幂次边界,所以把一个范围转成 CIDR 通常会产出好几个块——两头参差处是小块,对齐的中段是大块。
一个实例
从 192.168.1.10 到 192.168.1.20 是十一个地址。十一不是 2 的幂,所以它不可能是一个块。贪心覆盖从 .10 开始往前推:
| 块 | 覆盖范围 | 为什么是这个大小 |
|---|---|---|
192.168.1.10/31 | .10 – .11 | .10 是偶数,所以一个 2 地址的块可以从这里开始;4 地址的就不行。 |
192.168.1.12/30 | .12 – .15 | .12 是 4 的倍数。 |
192.168.1.16/30 | .16 – .19 | .16 是 16 的倍数,但只剩 5 个地址,所以 4 是装得下的最大值。 |
192.168.1.20/32 | .20 | 只剩一个地址了。 |
十一个地址用了四个块。每个块都完整落在这个范围内,范围之外的地址一个也没被包含进来。
什么时候会遇到它
- 防火墙与安全组规则。 AWS、Azure 和 GCP 都用 CIDR 表达来源范围,所以一份写成「10.20.30.40 到 10.20.31.200」交给你的白名单,必须先转换才能填进去。
- 路由语句。 一条静态路由要的是前缀,不是范围。
- 读懂别人报给你的一个块。 主机商说你的分配是
203.0.113.64/29;本工具的第一个方向会告诉你那是 .64 到 .71,其中 .65 到 .70 可以分配。 - 检查两个块是否重叠。 把两个都转成范围再比数字——远比对着前缀推理来得容易。
值得写准确的记法
10.0.0.5/24 和 10.0.0.0/24 都合法,含义却不同。后者命名的是一个网络。前者命名的是那个网络里面的一台主机,也是接口配置的写法——一行同时带上地址和它所属的块。如果你把前者粘进一个期待网络地址的地方,多数工具会不声不响地把它掩码成 10.0.0.0/24,这通常正是你想要的,但偶尔不是。
0.0.0.0/0 就是整个互联网。它是书写默认路由的正确方式,也是一件留在入站防火墙规则里会很严重的东西。
相关
想看一个块的完整分解——网络地址、广播地址、主机范围、二进制——子网计算器才是那件工具。至于在 /24 和 255.255.255.0 之间转换,有一个附带完整对照表的专用转换器。
CIDR 相关问题
为什么我的地址范围需要好几个 CIDR 块,而不是一个?
因为 CIDR 块必须对齐:一个含 2ⁿ 个地址的块,起始地址必须是 2ⁿ 的整数倍。192.168.1.10 到 192.168.4.200 共 959 个地址,但它从 .10 开始,并不落在 2 的幂次边界上,结尾也停在块的中间,于是只能从两端往里用一层层变大的块去覆盖。能装下整个范围的最小单块是一个 /21,跨越 2,048 个地址——其中 1,089 个并不是你要的。
直接往上取一个更大的块不行吗?
那样确实更整齐,但通常是错的。人们把一个范围转成 CIDR,几乎总是为了写一条防火墙规则、一个安全组或一条路由语句,而向上取整会在无声无息中把访问权给到谁也没打算放行的地址。本工具生成的是精确覆盖:输出里的每一个地址都在你的范围内,你范围内的每一个地址也都在输出里。
斜杠后面的数字是什么意思?
表示从左边数有多少位是固定的。/24 固定了 32 位中的 24 位,留下 8 位自由,也就是 256 个地址。前缀每加一,块就减半:/25 是 128 个地址,/26 是 64 个。反过来算,用 32 减去前缀,再取 2 的那个次方即可。
10.0.0.5/24 是一个有效的 CIDR 块吗?
这个写法是有效的,而且随处可见,但它描述的并不是一个从 .5 开始的块——它描述的是块 10.0.0.0/24 里的主机 10.0.0.5。接口配置故意写成这样,因为一行就能同时带上地址和它所属的网络。如果你想表达的是一个块,地址部分必须是网络地址。
/0 有多大?
整个 IPv4 地址空间,全部 4,294,967,296 个地址。它一位都不固定。你会在默认路由里见到它——0.0.0.0/0 意思是「所有」,这既是它在路由表里作为兜底条目的原因,也是为什么一不小心把它敲进防火墙规则会很危险。
最后审校于 。发现有内容过时了? 告诉我们.
