CIDR(无类别域间路由,Classless Inter-Domain Routing)是一种分配 IP 地址并路由 Internet Protocol 数据包的方法,它使用以前缀长度表示的可变长子网掩码,比最初的有类别寻址方式高效得多。它由 Internet Engineering Task Force(IETF)于 1993 年提出,用于应对 IPv4 地址迅速枯竭和路由表不断膨胀的问题。
走向 CIDR 的演进
在 CIDR 出现之前,IPv4 地址被划分为固定的“类别”(A、B、C、D、E)。每一类都有预先规定的网络部分和主机部分,导致地址利用率低下。例如,一个 B 类网络可提供 65,534 个主机地址,往往远超单个组织的实际需求,造成 IP 空间浪费;而 C 类网络只有 254 个主机地址,又常常不够用。
有类别路由还意味着互联网骨干网上的路由表迅速膨胀,因为每个 A、B 或 C 类网络都需要单独的一条表项,无论它与其他网络之间存在怎样的层级关系。
理解 CIDR 表示法
CIDR 摒弃了固定类别的概念,允许 IP 地址的网络部分为任意长度。该长度通过附加在 IP 地址后的 /prefix_length 后缀表示。
IPv4 地址是一个 32 位数字。prefix_length 指明最左侧有多少位构成地址的网络部分,其余各位则表示主机部分。
示例: 192.168.1.0/24
* 192.168.1.0 是 IP 地址。
* /24 表示前 24 位是网络部分。
与子网掩码的对应关系
prefix_length 与传统的点分十进制子网掩码直接对应。子网掩码的构成方式是:前 prefix_length 位置为 1,其余各位置为 0。
| CIDR 前缀 | 子网掩码 | 二进制子网掩码(前 16 位) |
|---|---|---|
| /8 | 255.0.0.0 | 11111111.00000000.00000000.00000000 |
| /16 | 255.255.0.0 | 11111111.11111111.00000000.00000000 |
| /24 | 255.255.255.0 | 11111111.11111111.11111111.00000000 |
| /27 | 255.255.255.224 | 11111111.11111111.11111111.11100000 |
| /30 | 255.255.255.252 | 11111111.11111111.11111111.11111100 |
CIDR 的工作原理:地址计算
要确定某个 CIDR 块的网络地址、广播地址和可用主机范围,需要进行特定的计算。
网络地址
网络地址(或称网络 ID)是 CIDR 块中的第一个地址。它通过将块内任意一个 IP 地址与子网掩码做按位与(AND)运算得到。网络地址中的所有主机位均为 0。
广播地址
广播地址是 CIDR 块中的最后一个地址。它通过把网络地址的所有主机位置为 1 得到。发往该地址的数据包会被送达该网段内的所有主机。
可用主机范围
可用主机范围是指介于网络地址与广播地址之间的所有 IP 地址(不含这两个地址本身)。这些地址可以分配给网络中的设备。
主机数量
CIDR 块内可用 IP 地址的数量按 2^(32 - prefix_length) 计算。可用主机地址的数量为 2^(32 - prefix_length) - 2(减去网络地址和广播地址)。
示例:192.168.10.64/27
下面来拆解 CIDR 块 192.168.10.64/27。
- 前缀长度:
/27 - 子网掩码: 前 27 位为
1,后 5 位为0。
11111111.11111111.11111111.11100000(二进制)
255.255.255.224(点分十进制) - IP 地址的二进制形式:
192.168.10.64=11000000.10101000.00001010.01000000 - 网络地址: 与子网掩码做按位与运算。
11000000.10101000.00001010.01000000(IP)
11111111.11111111.11111111.11100000(掩码)
-----------------------------------
11000000.10101000.00001010.01000000(网络 ID)
192.168.10.64
(注意:给定的 IP 192.168.10.64 本身就是该 /27 块的网络地址) - 广播地址: 把网络地址的主机位(后 5 位)全部置为
1。
网络 ID:11000000.10101000.00001010.01000000
广播地址:11000000.10101000.00001010.01011111
192.168.10.95 - 可用主机范围:
- 第一个可用 IP:
192.168.10.65 - 最后一个可用 IP:
192.168.10.94
- 第一个可用 IP:
- 主机数量:
32 - 27 = 5位主机位。
2^5 = 32个地址总数。
32 - 2 = 30个可用主机地址。
CIDR 的优势
高效的 IP 地址分配
CIDR 支持灵活的子网划分,管理员可以选择与某个网段所需主机数量精确匹配的前缀长度。相比有类别寻址,这能把 IP 地址的浪费降到最低。
路由聚合(超网划分)
CIDR 允许把多个较小的网络合并为一个更大的网络块用于路由。例如,某个 ISP 可能被分配到 203.0.113.0/20,随后再把它细分为 /24 或 /27 等更小的块分配给客户。从整个互联网的视角看,只需通告一条 /20 路由,从而显著缩减全球路由表的规模。这一过程称为路由聚合或超网划分。
缩减路由表规模
通过实现路由聚合,CIDR 减少了骨干路由器路由表中的条目数量。这提升了路由效率,也降低了路由器对内存和处理能力的要求。
分层路由
CIDR 促成了分层的路由结构:较大的 CIDR 块分配给大型 ISP 或区域互联网注册机构,它们再把这些块细分为更小的块分配给客户。由此形成更有条理、更具扩展性的互联网路由架构。
代理服务中的 CIDR
代理服务在诸多功能上都高度依赖 CIDR:
访问控制列表(ACL)
代理在 ACL 中使用 CIDR 块,来定义哪些客户端 IP 地址或地址段被允许或拒绝访问代理,以及通过代理访问特定资源。
# 允许特定 CIDR 段的 Nginx 代理示例
http {
server {
listen 80;
server_name example.com;
location / {
# 默认拒绝
deny all;
# 允许特定 IP 地址
allow 192.168.1.10;
allow 10.0.0.0/8; # 允许整个 A 类私有地址段
allow 172.16.0.0/12; # 允许整个 B 类私有地址段
allow 192.168.0.0/16; # 允许整个 C 类私有地址段
# 允许特定的公网 IP 段
allow 203.0.113.0/24;
proxy_pass http://backend_server;
}
}
}
地理定位与区域路由
代理服务常用 CIDR 块来判断客户端 IP 地址的地理来源。该信息可用于:
* 内容本地化: 投放符合特定地区的内容。
* 地域封锁: 根据客户端所在国家或地区限制内容访问。
* 优化路由: 把流量导向离客户端更近的代理服务器,以降低延迟。
负载均衡
在负载均衡场景中,可以用 CIDR 把来自特定 IP 段的客户端流量导向特定的后端服务器池或代理实例,从而实现资源的最优利用,或满足区域数据驻留方面的合规要求。
IP 白名单/黑名单
代理防火墙及其安全功能利用 CIDR 将可信网络加入白名单、把已知的恶意 IP 段列入黑名单,通过在代理层过滤流量来增强安全性。
私有网络访问
对于运行在企业网络内的代理而言,CIDR 是定义可经代理访问的内部网络地址段、或区分内部与外部客户端的关键。
CIDR 与 IPv6
CIDR 的原理同样是 IPv6 寻址的基础,只不过地址长度为 128 位。IPv6 地址始终以 CIDR 表示法书写,例如 2001:0db8::/32。IPv6 中前缀长度的作用与 IPv4 完全一致:界定地址的网络部分与主机部分,实现高效的分配与路由。
结论
CIDR 是现代互联网基础设施中不可或缺的组成部分,对于高效的 IP 地址管理和可扩展的路由至关重要。对代理服务来说,透彻理解 CIDR 是配置健壮访问控制、优化流量走向以及落实安全策略的关键。
