fc00::/7 是 IPv6 的「私有地址」,实际只用 fd00::/8。 和 IPv4 私网地址最大的不同是「中间 40 位随机」,所以合并网络不会撞。
4.3.8 讲了 IPv4 的私有地址,这里是 IPv6 的对应物。 4.6.5 的全局地址是「出门用」,ULA 是「家里用」。
一、它长什么样
前 8 位固定:fc00::/7 里的第 8 位是 1,所以实际用 fd00::/8。 剩下 120 位分三段:40 位全局 ID、16 位子网 ID、64 位接口标识。
| 部分 | 位数 | 谁定 |
|---|---|---|
| 前缀 | 8 位 | 协议规定 fd |
| 全局 ID | 40 位 | 自己随机抽 |
| 子网 ID | 16 位 | 自己划 |
| 接口标识 | 64 位 | 主机自己生成 |
第二行「40 位随机」是整个设计的核心: 2 的 40 次方约 1.1 万亿,所以「两家公司抽到同一个」的概率可以忽略。 这就是它叫「唯一本地」而不是「私有」的原因。 第三行「16 位子网」够划 65536 个网:大企业按楼层、按部门分都够用。
二、和 IPv4 私网地址的关键区别
表面看都是「内网用的地址」,但性质完全不同:
| 项 | IPv4 私网 | IPv6 ULA |
|---|---|---|
| 前缀来源 | RFC 固定三段 | 自己随机抽 |
| 会不会撞 | 一定会 | 几乎不会 |
| 合并网络 | 必须改地址 | 直接通 |
| 能否上网 | 要 NAT | 要 NAT 或代理 |
第三行是 ULA 真正的价值: 两家公司合并,各自的 10.0.0.0/8 都要重编——这是并购里最烦的活之一。 而 ULA 因为前缀不同,直接就能互访。 第四行要注意「不能直接上网」:ULA 地址不能在公网上路由, 所以要出门还是得有全局地址——常见做法是「内网 ULA、出口全局」,双栈并行。
三、什么时候该用
三种典型场景:
| 场景 | 用 ULA 的好处 | 注意 |
|---|---|---|
| 纯内网 | 不依赖运营商 | 换运营商不用重编 |
| 多园区互联 | 地址不冲突 | 要规划全局 ID |
| 过渡期双栈 | 内网先用起来 | 出口仍走 IPv4 |
第一行「不依赖运营商」很实际:全局地址是运营商给的,换一家就变;
内网如果用 ULA,换运营商时内网一行配置都不用改。
这是运维喜欢 ULA 的主要原因。
第二行「要规划全局 ID」是个提醒:别随手 fd00::/8 一刀切,
每个园区抽一个不同的 40 位,互联时才不会撞。
四、一个容易踩的坑
有些系统会把 ULA 当成「公网地址」处理:因为它不在 fe80 里,看起来像全球地址。 结果是「内网流量试图走默认路由出去」,然后被丢。 解决办法是「在边界路由器上明确不转发 ULA」:这条规则几乎所有 IPv6 的边界配置里都有。 另一个坑是「DNS 返回 AAAA 记录」: 如果内网服务只配了 ULA,而客户端拿到的是全局地址,就连不上。 所以双栈环境里,DNS 要按「客户端在哪儿」返回不同的记录——这一块比 IPv4 时代复杂。
五、动手 Demo:唯一本地地址,自己划一块内网
算一下 40 位随机能抽多少个全局 ID,再看每个全局 ID 之下有多少容量。 注意「一家撞上别人的概率」那一行:9.09e-06。
rand = 2 ** 40
n = 1000 * 10000
print(rand, rand / 1e12)
print('%.2e' % (n / rand))
print('%.1e' % (rand * 65536))
实跑输出:
--------------------------------------------------------------------
唯一本地地址,自己划一块内网
--------------------------------------------------------------------
**IPv6 里对应「私有地址」的是「唯一本地地址」(ULA)**:**fc00::/7,实际只用 fd00::/8。**
**它和 IPv4 私网地址的区别是:中间 40 位要随机,避免两家公司撞车。**
部分 取值 说明
-----------------------------------------------------
唯一本地地址总段 fc00::/7 1 位表示「本地」
实际可用 fd00::/8 第 8 位固定为 1
全局 ID 40 位随机 每家公司自己抽
子网 ID 16 位 能切 65536 个子网
**算一下「40 位随机够不够」**:
**1099511627776 个不同的全局 ID**(约 1.1 万亿)
**假设全球 1000 万家企业各抽一个,一家撞上别人的概率约 9.09e-06**
**这个概率低到「不用协调」**——**这就是 ULA 和 IPv4 私网地址最大的不同。**
**IPv4 的 10.0.0.0/8 是「全世界共用」,一合并网络就冲突**;**ULA 是「各抽各的」,基本不会撞。**
**每个全局 ID 之下的容量**:
**65536 个 /64,每个 /64 里 1.84e+19 个地址**——
**合计 7.2e+16 个 /64**
**有一点要注意**:**ULA 地址不能在公网上路由**,
**所以「内网用 ULA、出口用全局地址」是常见搭配**——
**和 IPv4 的「内网 192.168、出口公网 IP」是一个套路。**
1.1 万亿个全局 ID 这个数量级,足够「每家公司随便抽」:
就算全球有一千万家企业各抽一个,撞上的概率也只有百万分之一量级。
所以 ULA 不需要「统一分配机构」——这是它和 IPv4 私网地址的根本区别。
「合计 7.2e16 个 /64」这个数说明 ULA 的容量也大到用不完:
它不是为了「省」设计的,是为了「不冲突」设计的。
这一点和 IPv4 私网地址的思路完全相反。
实测一句:本机 ipconfig 里能看到 WLAN 的 fe80 地址,
但没有 fd 开头的地址——因为 Windows 默认不给网卡配 ULA,要手工加。
这也说明「ULA 是可选的」,不像 fe80 那样必需。
30 秒实验
- 算一下:一个 40 位全局 ID 之下能切多少个 /64?
- 想一下:为什么 ULA 不需要「统一的分配机构」?
- 想一下:双栈环境里 DNS 要注意什么?
常见误区
- 以为「ULA 就是 IPv6 的私有地址,一回事」。 机制不同,ULA 靠随机避免冲突, 私网地址靠约定然后忍受冲突。
- 以为「ULA 能直接上网」。 不能,公网不路由这个前缀。
- 以为「ULA 前缀随便写 fd00::/8 就行」。 多园区要各抽一段,否则互联时会撞。
自测三问(点开对答案)
1. 唯一本地地址的前缀是什么? —— **fc00::/7**,实际用 **fd00::/8**。 2. ULA 中间那 40 位是干什么的? —— **全局 ID,随机抽取**,用来避免不同组织的地址撞车。 3. ULA 和 IPv4 私网地址最大的区别是什么? —— **ULA 的前缀是随机抽的,合并网络不会冲突**; IPv4 私网地址是全世界共用同一段,一合并就要重编。下一节讲 IPv6 的分片:只有源端能分。
- ☐ (本节完,下一节 4.6.8 IPv6分段处理)