IP 的 CIDR 表示法详解

2021-01-15 Linux 运维

前言

CIDR(Classless Inter-Domain Routing,无类别域间路由)是现代网络中表示 IP 地址范围的标准方法。无论是配置服务器、设置防火墙规则,还是规划网络架构,理解 CIDR 表示法都是网络管理的基础技能。本文将详细介绍 CIDR 语法、子网掩码对照表、可用 IP 计算方法,以及 ipcalc 工具的使用。

1. CIDR 基础概念

1.1 什么是 CIDR

CIDR 是一种用于分配 IP 地址和进行 IP 路由的方法,于 1993 年引入以替代传统的 A/B/C 类网络分类。

CIDR 表示法格式:

IP地址/前缀长度

示例:

  • 192.168.1.0/24
  • 10.0.0.0/8
  • 172.16.0.0/12

1.2 CIDR 表示法结构

192.168.1.0/24
└─────┬─────┘ └┬┘
  网络地址   前缀长度
  • 网络地址:表示网络的起始地址
  • 前缀长度:表示网络部分占用的位数(子网掩码中连续 1 的个数)

1.3 为什么需要 CIDR

传统分类网络的问题:

  • A 类网络过大(1600 万台主机),浪费严重
  • B 类网络也过大(65534 台主机)
  • C 类网络过小(254 台主机),不够用

CIDR 的优势:

  • 灵活分配 IP 地址
  • 减少路由表条目
  • 提高 IP 地址利用率

2. 子网掩码详解

2.1 子网掩码的作用

子网掩码用于区分 IP 地址中的网络部分和主机部分。

IP 地址:     192.168.1.100  = 11000000.10101000.00000001.01100100
子网掩码:    255.255.255.0   = 11111111.11111111.11111111.00000000
               └──── 网络部分 ┘   └── 主机部分 ┘

2.2 二进制与十进制的转换

IP 地址和子网掩码都是 32 位二进制数,每 8 位用一个十进制数表示(点分十进制)。

前缀长度 子网掩码 二进制掩码
/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
/32 255.255.255.255 11111111.11111111.11111111.11111111

2.3 完整 CIDR 前缀对照表

前缀 子网掩码 可用主机数 说明
/1 128.0.0.0 2,147,483,646 超大网络
/2 192.0.0.0 1,073,741,822
/3 224.0.0.0 536,870,910
/4 240.0.0.0 268,435,454
/5 248.0.0.0 134,217,726
/6 252.0.0.0 67,108,862
/7 254.0.0.0 33,554,430
/8 255.0.0.0 16,777,214 A 类默认
/9 255.128.0.0 8,388,606
/10 255.192.0.0 4,194,302
/11 255.224.0.0 2,097,150
/12 255.240.0.0 1,048,574
/13 255.248.0.0 524,286
/14 255.252.0.0 262,142
/15 255.254.0.0 131,070
/16 255.255.0.0 65,534 B 类默认
/17 255.255.128.0 32,766
/18 255.255.192.0 16,382
/19 255.255.224.0 8,190
/20 255.255.240.0 4,094
/21 255.255.248.0 2,046
/22 255.255.252.0 1,022
/23 255.255.254.0 510
/24 255.255.255.0 254 C 类默认
/25 255.255.255.128 126
/26 255.255.255.192 62
/27 255.255.255.224 30
/28 255.255.255.240 14
/29 255.255.255.248 6 点对点链路
/30 255.255.255.252 2 点对点链路
/31 255.255.255.254 0* 特殊用途
/32 255.255.255.255 1 单个主机

*注:/31 在 RFC 3021 中定义,可用于点对点链路(只有 2 个地址,网络地址和广播地址都被用作主机地址)。

3. 可用 IP 地址计算

3.1 计算公式

可用主机数 = 2^(32 - 前缀长度) - 2

其中减去的 2 是:

  • 网络地址(全 0):192.168.1.0
  • 广播地址(全 1):192.168.1.255

3.2 计算示例

示例 1:计算 192.168.1.0/24 的可用 IP

前缀长度 = 24
主机位 = 32 - 24 = 8 位
总地址数 = 2^8 = 256
可用主机数 = 256 - 2 = 254

网络地址: 192.168.1.0
广播地址: 192.168.1.255
可用范围: 192.168.1.1 - 192.168.1.254

示例 2:计算 10.0.0.0/8 的可用 IP

前缀长度 = 8
主机位 = 32 - 8 = 24 位
总地址数 = 2^24 = 16,777,216
可用主机数 = 16,777,216 - 2 = 16,777,214

网络地址: 10.0.0.0
广播地址: 10.255.255.255
可用范围: 10.0.0.1 - 10.255.255.254

示例 3:计算 172.16.0.0/12 的可用 IP

前缀长度 = 12
主机位 = 32 - 12 = 20 位
总地址数 = 2^20 = 1,048,576
可用主机数 = 1,048,576 - 2 = 1,048,574

网络地址: 172.16.0.0
广播地址: 172.31.255.255
可用范围: 172.16.0.1 - 172.31.255.254

3.3 手工计算步骤

以 192.168.100.0/26 为例:

步骤 1:确定子网掩码

/26 = 26 个连续 1
11111111.11111111.11111111.11000000
= 255.255.255.192

步骤 2:计算块大小(Block Size)

块大小 = 256 - 最后一个非零的掩码字节
= 256 - 192 = 64

步骤 3:确定子网

子网: 0, 64, 128, 192
192.168.100.0/26 属于第一个子网

步骤 4:确定可用范围

网络地址: 192.168.100.0
广播地址: 192.168.100.63
可用范围: 192.168.100.1 - 192.168.100.62
可用主机数: 62

4. 特殊 IP 地址范围

4.1 私有 IP 地址(RFC 1918)

范围 CIDR 说明
10.0.0.0 - 10.255.255.255 10.0.0.0/8 A 类私有地址
172.16.0.0 - 172.31.255.255 172.16.0.0/12 B 类私有地址
192.168.0.0 - 192.168.255.255 192.168.0.0/16 C 类私有地址

4.2 其他特殊范围

范围 CIDR 说明
127.0.0.0 - 127.255.255.255 127.0.0.0/8 回环地址
169.254.0.0 - 169.254.255.255 169.254.0.0/16 链路本地地址
224.0.0.0 - 239.255.255.255 224.0.0.0/4 组播地址
240.0.0.0 - 255.255.255.255 240.0.0.0/4 保留地址

5. ipcalc 工具使用

ipcalc 是一个强大的 IP 地址计算工具,可以快速计算 CIDR 网络的详细信息。

5.1 安装 ipcalc

# Ubuntu / Debian
apt install ipcalc

# CentOS / RHEL / Rocky
yum install ipcalc
dnf install ipcalc

# 或使用更强大的 ipcalc-ng
apt install ipcalc-ng   # Ubuntu/Debian

5.2 基本用法

# 计算单个网络
ipcalc 192.168.1.0/24

# 输出示例:
Address:   192.168.1.0          11000000.10101000.00000001. 00000000
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.1.0/24       11000000.10101000.00000001. 00000000
HostMin:   192.168.1.1          11000000.10101000.00000001. 00000001
HostMax:   192.168.1.254        11000000.10101000.00000001. 11111110
Broadcast: 192.168.1.255        11000000.10101000.00000001. 11111111
Hosts/Net: 254                   Class C, Private Internet

5.3 实用参数

# 只显示网络地址
ipcalc -n 192.168.1.100/24

# 只显示广播地址
ipcalc -b 192.168.1.100/24

# 只显示子网掩码
ipcalc -m 192.168.1.100/24

# 显示可用主机范围
ipcalc -n -b 192.168.1.0/24

# 检查 IP 是否在某网络内
ipcalc -c 192.168.1.100 192.168.1.0/24

5.4 批量计算

# 计算多个子网
for prefix in 24 25 26 27 28; do
  echo "/$prefix:"
  ipcalc 192.168.1.0/$prefix | grep -E "Hosts|Network|HostMin|HostMax"
  echo ""
done

5.5 使用 Python 计算(无 ipcalc 时)

import ipaddress

# 计算网络信息
network = ipaddress.IPv4Network('192.168.1.0/24', strict=False)
print(f"网络地址: {network.network_address}")
print(f"广播地址: {network.broadcast_address}")
print(f"子网掩码: {network.netmask}")
print(f"可用主机数: {network.num_addresses - 2}")
print(f"可用范围: {list(network.hosts())[0]} - {list(network.hosts())[-1]}")

6. CIDR 在实际场景中的应用

6.1 防火墙规则配置

# iptables 允许特定 CIDR
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

# firewalld 允许特定 CIDR
firewall-cmd --add-source=192.168.1.0/24 --zone=trusted

# UFW 允许特定 CIDR
ufw allow from 192.168.1.0/24

6.2 云服务器安全组

主流云服务商都使用 CIDR 表示法配置安全组:

场景 CIDR 说明
允许所有 0.0.0.0/0 不建议生产环境使用
内网访问 10.0.0.0/8 只允许内网
特定网段 192.168.1.0/24 只允许特定子网
单个 IP 1.2.3.4/32 只允许特定主机

6.3 Docker 网络配置

# 创建自定义 Docker 网络
docker network create --subnet=172.18.0.0/16 mynetwork

# docker-compose 中指定网络
networks:
  mynet:
    ipam:
      config:
        - subnet: 172.20.0.0/24

6.4 Kubernetes Pod 网络

# Calico CNI 配置示例
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  cidr: 192.168.0.0/16
  ipipMode: Always
  natOutgoing: true

7. 常见错误和注意事项

7.1 常见错误

# 错误:混淆网络地址和主机地址
# 错误写法
192.168.1.1/24   # 虽然能用,但规范写法是 192.168.1.0/24

# 正确写法
192.168.1.0/24

7.2 边界计算错误

错误:认为 /24 有 256 个可用 IP
正确:/24 有 254 个可用 IP(减去网络和广播地址)

错误:认为 192.168.1.0/23 的范围是 192.168.1.1-192.168.1.254
正确:192.168.1.0/23 的范围是 192.168.0.1-192.168.1.254(跨越两个 C 段)

7.3 超网(Supernetting)和子网(Subnetting)

子网划分:将大网络分成小网络
例如:将 192.168.1.0/24 划分为 4 个子网
  - 192.168.1.0/26
  - 192.168.1.64/26
  - 192.168.1.128/26
  - 192.168.1.192/26

超网聚合:将小网络合并成大网络
例如:将以下网络聚合
  - 192.168.0.0/24
  - 192.168.1.0/24
  - 192.168.2.0/24
  - 192.168.3.0/24
  聚合后:192.168.0.0/22

8. 快速参考表

8.1 常用 CIDR 速查

CIDR 相当于 可用主机数 典型用途
/32 单个 IP 1 主机路由
/31 2 个 IP 2* 点对点链路
/30 4 个 IP 2 点对点链路
/29 8 个 IP 6 小型网络
/28 16 个 IP 14 小型网络
/27 32 个 IP 30 部门网络
/26 64 个 IP 62 部门网络
/24 256 个 IP 254 常见局域网
/16 65536 个 IP 65534 大企业内网
/8 16777216 个 IP 16777214 超大规模

8.2 二进制快速转换技巧

记住以下规律可以快速计算:
128 = 2^7
192 = 128 + 64 = 2^7 + 2^6
224 = 128 + 64 + 32 = 2^7 + 2^6 + 2^5
240 = 128 + 64 + 32 + 16
248 = 128 + 64 + 32 + 16 + 8
252 = 128 + 64 + 32 + 16 + 8 + 4
254 = 128 + 64 + 32 + 16 + 8 + 4 + 2
255 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1

9. 总结

CIDR 是现代网络管理的基础,本文详细介绍了:

  1. CIDR 语法:IP/前缀长度 表示法
  2. 子网掩码:完整的前缀长度对照表
  3. 可用 IP 计算:2^(32-前缀) - 2 公式及手工计算步骤
  4. ipcalc 工具:快速计算网络信息的命令行工具
  5. 实际场景:防火墙、云安全组、Docker、Kubernetes 中的应用

关键要点:

  • /24 是最常用的 CIDR,表示 254 个可用主机
  • 网络地址和广播地址不可分配给主机
  • 使用 ipcalc 工具可以快速验证计算结果
  • 配置防火墙和安全组时,务必确认 CIDR 范围正确

掌握 CIDR 计算,让你在网络规划、服务器配置、安全防护等方面更加得心应手。