共享地址空间的来历
100.64.0.0/10 是 RFC 6598 专门划给运营商做 CGNAT 的地址块,范围是 100.64.0.0 到 100.127.255.255,共 4194304 个地址。运营商在用户侧先给家宽路由器分配这段地址,再在其出口做一次转换,从而让大量用户共用数量有限的公网地址。它不属于 RFC1918 私网,但同样禁止出现在公网路由中。
与私网的区别
虽然行为相似,但性质不同:RFC1918 三段是给「任意私有网络」自由复用的,而 100.64/10 是给运营商网络内部使用的共享空间,规范明确要求设备默认不路由它。工程上的直接后果是:在企业内网规划里使用 100.64/10 会与运营商网络或组网工具冲突,而且因为缺乏「私网」的默认信任假设,排查时容易走偏。
组网工具的复用地
一些基于 WireGuard 的 Mesh 组网工具默认在 100.64.0.0/10 内给节点分配虚拟地址(典型是 100.x.y.z),与运营商 CGNAT 使用同一段但相互独立。因此看到 100 开头的地址时,先判断它是运营商 WAN 地址、还是组网工具的虚拟地址,两者的处理方式完全不同。
基本信息
| 地址段 | 100.64.0.0/10 |
|---|---|
| 范围 | 100.64.0.0 – 100.127.255.255 |
| 总量 | 4194304 个地址 |
| 用途 | CGNAT、运营商内部互联 |
| 性质 | 共享地址空间,非 RFC1918 私网 |
| 规范 | RFC 6598 |
典型使用场景
- 家宽 WAN 口出现 100.64.x.x,说明位于运营商大内网之后
- 运营商内部设备互联与管理网
- Mesh 组网工具(如基于 WireGuard 的方案)分配虚拟节点地址
- 日志分析:识别来自运营商 NAT 后的真实来源
- 安全策略评估:判断按 IP 封禁是否会产生误伤
Python 判定与核对
Python 判定与核对
import ipaddress as ip
print(ip.ip_address('100.64.0.1').is_private) # False:不属于私网定义
print(ip.ip_network('100.64.0.0/10').is_global) # False:不可全球路由
print(ip.ip_network('100.64.0.0/10').num_addresses) # 4194304
print(ip.ip_address('100.64.0.1') in ip.ip_network('100.64.0.0/10')) # True三段私网与共享空间的对照
| 地址段 | 类别 | 可用规模 | 在企业内网可否使用 |
|---|---|---|---|
| 10.0.0.0/8 | RFC1918 私网 | 16777214 | 可以,大型网络首选 |
| 172.16.0.0/12 | RFC1918 私网 | 1048574 | 可以,中型网络 |
| 192.168.0.0/16 | RFC1918 私网 | 65534 | 可以,家庭与小办公 |
| 100.64.0.0/10 | RFC6598 共享空间 | 4194302 | 不建议:与运营商/组网工具冲突 |
在部分系统上,is_private 对 100.64/10 的判定与 RFC 定义并不完全一致:不同语言与版本的实现口径有差异。编写判定逻辑时最好同时检查 is_global 与具体前缀,而不是只依赖单一属性。
把访问日志里的 100.64.x.x 当成客户端公网 IP 是常见误判:那是 CGNAT 的中间地址,必须结合运营商日志或应用层的转发头(如 X-Forwarded-For)才能定位真实用户。