CIDR 网络地址速查表 - 子网掩码与 IP 地址大全
CIDR 运算的麻烦在于它错了不会报错。一个 /23 被当成 /24 写进防火墙规则,服务照常启动,只是多出来的地址悄悄对全网可达;反过来把 /8 缩成 /16,容量需求一个季度后才暴露。所以这张表的价值在于把心算过程摊开:主机位数等于 32 减前缀,可用地址是 2 的主机位次方减 2(网络地址和广播地址各占一个),点对点链路的 /31 是个例外,没有广播地址,四个地址全可用。表内按子网掩码对照表、常用子网规模、私有地址段、特殊用途地址、计算工具与示例分组。什么时候该翻它:分配 VPC 网段、核对 NAT 与安全组白名单、判断一台机器该配 /24 还是 /16,或者看到一个陌生网段要立刻知道它是不是私有地址。特别地址段是另一个判断依据:169.254 段出现说明 DHCP 或云元数据服务没通,127 段出现说明配置里把回环写进了对外地址。
CIDR 表示法基础 5
192.168.1.0/24IP/前缀/24主机位数 = 32 - 前缀子网掩码子网掩码对照表 6
/32 = 255.255.255.255 = 1 个 IP/24 = 255.255.255.0 = 256 个 IP/23 = 255.255.254.0 = 512 个 IP/16 = 255.255.0.0 = 65,536 个 IP/8 = 255.0.0.0 = 16,777,216 个 IP/0 = 0.0.0.0 = 全部 IP常用子网规模 7
/30 = 4 IP(2 可用)/29 = 8 IP(6 可用)/28 = 16 IP(14 可用)/27 = 32 IP(30 可用)/26 = 64 IP(62 可用)/25 = 128 IP(126 可用)/24 = 256 IP(254 可用)私有 IP 地址范围 5
10.0.0.0/8172.16.0.0/12192.168.0.0/16100.64.0.0/10169.254.0.0/16特殊用途地址 5
0.0.0.0/0127.0.0.0/8224.0.0.0/4240.0.0.0/4255.255.255.255计算工具与示例 6
ipcalc 192.168.1.0/24sipcalc 10.0.0.0/16ipaddress.ip_network("192.168.1.0/28")网络地址 = IP & 子网掩码广播地址 = 网络地址 | ~掩码可用 IP = 2^(32-前缀) - 2命令示例
用 node 一行算出掩码、网络地址、广播地址与可用数
node -e "
function calc(cidr) {
const [ip, p] = cidr.split('/')
const bits = p | 0
const ipn = ip.split('.').map(Number).reduce((a, b) => ((a << 8) + b) >>> 0, 0)
const m = (0xFFFFFFFF << (32 - bits)) >>> 0
const net = ipn & m
const bc = (net | (~m >>> 0)) >>> 0
const size = 2 ** (32 - bits)
const f = (n) => [24, 16, 8, 0].map((s) => (n >>> s) & 255).join('.')
console.log(cidr, 'mask', f(m), 'net', f(net), 'bcast', f(bc), 'total', size, 'usable', bits >= 31 ? size : size - 2)
}
;['10.0.0.0/8', '172.16.0.0/12', '100.64.0.0/10', '0.0.0.0/0'].forEach(calc)
"脚本把本表两条公式直接编码:掩码 = 前缀位全 1(0xFFFFFFFF 左移),网络地址 = IP 与掩码按位与,广播地址 = 网络地址或上掩码按位非,可用数 = 2 的主机位次方减 2,并且对 /31 及以上特判不减 2。/0 的 total 是 4294967296,掩码显示为 255.255.255.255 只是掩码取反位运算的直接结果,不要当成写错。
输出
10.0.0.0/8 mask 255.0.0.0 net 10.0.0.0 bcast 10.255.255.255 total 16777216 usable 16777214 172.16.0.0/12 mask 255.240.0.0 net 172.16.0.0 bcast 172.31.255.255 total 1048576 usable 1048574 100.64.0.0/10 mask 255.192.0.0 net 100.64.0.0 bcast 100.127.255.255 total 4194304 usable 4194302 0.0.0.0/0 mask 255.255.255.255 net 0.0.0.0 bcast 0.0.0.0 total 4294967296 usable 4294967294
用 Python 标准库一次取出 /28 的网络地址、掩码、广播与可用数
python -c "
from ipaddress import ip_network
n = ip_network('192.168.1.0/28')
print(n.network_address, n.netmask, n.broadcast_address, n.num_addresses, n.num_addresses - 2)
"本表把 /28 标为 VLAN 常用规模,16 个地址、14 个可用。写校验脚本时用 ip_network 代替手算,可以同时拿到网络地址(分配时必须跳过)、广播地址(不能配给主机)和可用数三组值,避免只算出总数就把 16 个地址全部分下去。传 strict=False 还能容忍你手上拿着的是网段里的某个主机地址而非网络地址。
输出
192.168.1.0 255.255.255.240 192.168.1.15 16 14
对比 /31 与 /30 的 hosts 列表,看点对点链路的例外
python -c "
from ipaddress import ip_network
print(list(ip_network('10.0.0.0/31').hosts()))
print(list(ip_network('10.0.0.0/30').hosts()))
"/31 的两个地址都被列为 host,因为点对点链路没有广播地址这个概念;/30 则按传统规则丢掉网络地址与广播地址,只剩中间两个。审查别人提交的网段规划时,把 /31 误套 -2 公式算成 0 个可用地址是最常见的评审错误,用这个对照一眼就能看出来。
输出
[IPv4Address('10.0.0.0'), IPv4Address('10.0.0.1')]
[IPv4Address('10.0.0.1'), IPv4Address('10.0.0.2')]批量判定一组地址里哪些落在私有段
python -c "
from ipaddress import ip_address
for s in ['10.1.2.3', '172.32.0.1', '192.168.5.5', '100.64.0.1', '169.254.1.1', '127.0.0.1']:
a = ip_address(s)
print(s, a.is_private)
"两个 False 最值得看:172.32.0.1 刚过 172.16.0.0/12 的上界,100.64.0.1 属于运营商级 NAT 段 100.64.0.0/10,标准库都不把它们算作 RFC1918 私有地址,但云上环境常常仍按内网路由,判断可达性时要单独看。169.254 与 127 被判为 True 是因为它们确实不来自公网,但这两个 True 出现在对外配置里同样是配置错误。
输出
10.1.2.3 True 172.32.0.1 False 192.168.5.5 True 100.64.0.1 False 169.254.1.1 True 127.0.0.1 True
常见坑与注意事项
- CIDR 写错不会报错。/23 被当成 /24 填进防火墙规则时服务照常启动,多出的地址静默对网内可达,只能靠逐条核对前缀与地址数发现。
- 172.16.0.0/12 的上界是 172.31.255.255,172.32.0.0 已经在私有段之外。凭「172 开头就是内网」的印象放行会把公网地址暴露出去。
- 100.64.0.0/10 是运营商级 NAT 段,标准库不判为私有地址但在云上常按内网路由,公网服务直接写这段地址通常连不通。
- 可用 IP = 2^(32-前缀) - 2 只在 /30 到 /24 一类常规规模成立。/31 没有广播地址,套减 2 会算出 0 个可用地址。
- 240.0.0.0/4 是 Class E 保留段、0.0.0.0/0 是默认路由、127.0.0.0/8 是回环、169.254.0.0/16 是链路本地,这些出现在对外地址或安全组白名单里基本都是配错,不要作为特例直接放行。
提示
- 可用 IP 数 = 2^(32-前缀) - 2(减去网络地址和广播地址)。
- Docker 默认网桥使用 172.17.0.0/16,Kubernetes Pod 网段常用 10.244.0.0/16。
- 子网划分时,/24 是最常用的,适合小型局域网。
- ipcalc 或 sipcalc 命令行工具可以快速计算 CIDR 信息。
- /31 子网(2 个 IP)专用于点对点链路(RFC 3021),不需要广播地址。
100.64.0.0/10是 CGNAT 段(运营商给家宽设备用),公网服务误用这段在云上会路由不通。- Python 里
ipaddress.ip_network("192.168.1.0/28")可直接取网络/可用主机/广播,写校验脚本不必手算。 240.0.0.0/4保留段一旦出现在路由表里通常是配错而非特例,不要直接放行。
常见问题
看到 192.168.1.0/24,怎么立刻算出它有多少个可用地址?
两步:主机位数 = 32 - 24 = 8;地址总数 = 2^8 = 256,其中网络地址 192.168.1.0 与广播地址 192.168.1.255 各占一个,可用 254 个。写脚本时不要心算,用 Python 标准库的 ipaddress.ip_network("192.168.1.0/24"),取 num_addresses 得总数、取 num_addresses - 2 得可用数,两个数一起打印就不会把网络地址误分配出去。
/31 为什么可用地址不是 0 个?
因为 /31 是点对点链路的专用规模。全宽前缀下总共 2 个地址,传统规则会把它们当作网络地址与广播地址各占一个,可用数为 0;但 RFC 3021 明确规定 /31 不存在广播地址,两个地址都可用。所以本表的「可用 IP = 2^(32-前缀) - 2」在 /31 要特判,Python 的 ip_network("10.0.0.0/31").hosts() 会把 10.0.0.0 与 10.0.0.1 都列出来。对照 /30 就是常规形态:4 个地址、2 个可用。
一个陌生网段,怎么快速判断它是不是私有地址?
对照本表私有地址段三条:10.0.0.0/8 覆盖 10.0.0.0 到 10.255.255.255;172.16.0.0/12 覆盖 172.16.0.0 到 172.31.255.255,注意是 172.16 到 172.31,172.32 已经出了私有段;192.168.0.0/16 覆盖整个 192.168.x.x。另有 100.64.0.0/10 是运营商级 NAT 保留段,169.254.0.0/16 是链路本地段,二者都不是 RFC1918 私有段但在云上也常被当作内网处理。判定别靠肉眼,交给 ip_address(s).is_private 或直接做与运算比对网段。
子网掩码和前缀长度换算时,为什么掩码里 1 和 0 的排列不能自定义?
子网掩码由前缀位全 1 加主机位全 0 得到,顺序固定为网络位在前、主机位在后,这是 CIDR 与 IP 整数字面量的唯一约定。前缀 16 得到 255.255.0.0,前缀 12 得到 255.240.0.0——位数从高位往低位填满,填到 12 位就停手,所以 /12 的第三个字节是 11110000 即 240。掩码写成 0.0.255.255(主机位在前)虽然数值相同,但所有按位运算工具与路由协议都会得到相反的网络地址,配置一定错。
169.254 开头的地址和 127 开头的地址出现在配置里,通常说明什么?
两个都指向本机或链路,但成因不同。169.254.0.0/16 属于链路本地地址,通常是 DHCP 请求没得到响应、云上元数据服务(常见于 169.254.169.254)不通时的自我兜底,它本不该出现在配置的目标地址里。127.0.0.0/8 是回环地址,说明把本机地址误当成对外地址写进了白名单或监听配置,对外调用会直接打回自己。两者出现都不是特例用法,应当回到 DHCP 配置或地址填写处修正。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。