IPv6 ULA 生成器

生成唯一的本地 IPv6 地址(fd00::/8),带随机 40 位全局 ID,并查看站点的 /48 前缀。

无需公网也能有私有 IPv6。 在 fd00::/8 范围内创建唯一本地地址。随机的 40 位全局 ID 保证各站点前缀不冲突,再用 64 位接口 ID 补足。本地使用密码学随机生成。

站点 /48 前缀

唯一本地地址的实际用法

fd00::/8 是做什么的

唯一本地地址(ULA)是 IPv6 版的 RFC 1918 私有地址:可以在自己网络内部路由,但没有任何运营商会把它转发到公网。RFC 4193 为此保留了 fc00::/7,并划分为两半。目前只有 fd00::/8 被定义为通用用途,其中 40 位全局 ID 由需要该前缀的人自行随机选取。另一半 fc00::/8 原本预留给某个集中分配机构,但该注册机构从未建立,因此实际见到的 ULA 都以 fd 开头。

结构是固定的:8 位 fd,接 40 位全局 ID,再接 16 位子网 ID,最后是 64 位接口标识符。前 48 位合起来就是你这个站点拥有的前缀,这也是 ULA 生成器给出的是一个 /48 而不是单个地址的原因。

全局 ID 为什么必须随机

那 40 个随机位是防止冲突的全部机制。如果你挑一个好记的前缀,比如 fd00:1::fd12:3456:789a::,那么别人同样会觉得它好记——一旦你需要合并网络、与合作方建立 VPN,或者并购一家公司,冲突风险就不再是理论问题。在 2^40 种可能中做一次真正随机的选择,两个站点撞车的概率可以忽略不计。

本生成器的 40 位来自浏览器的密码学随机源,因此结果不可预测且属于你自己。注意地址本身并不是秘密——随机性的目的是避免冲突,而不是隐藏什么。

在 /48 内部规划子网

16 位子网 ID 给你 65536 个 /64 网络。在 IPv6 中,/64 是单个局域网段的标准尺寸,不应再往下细分;SLAAC、隐私地址等多种机制都假定主机位是 64 位。这里不要试图省着用。IPv6 的地址空间足够充裕,把子网 ID 映射到有意义的维度上——每个 VLAN 一个、每个站点一个、每个环境一个——远比节省一辈子也用不完的地址空间更有价值。

最后,ULA 并不能取代全局地址。通行做法是让它与全局可路由地址并存,这样即使 ISP 分配的前缀发生变化,内部服务的编址依然稳定。

开源说明:使用 crypto.getRandomValues 与原生 JavaScript 实现,不依赖第三方库。

常见问题

ULA 有什么用?
唯一本地地址是 IPv6 中对应 RFC 1918 私有网段的概念。它可以在你自己的网络内部路由,但永远不会被公网路由。
为什么前缀是 /48?
RFC 4193 把前 8 位固定为 fd,接下来的 40 位填入随机全局 ID。这 48 位就是你的站点前缀,余下 16 位用于划分子网,64 位用于接口标识。
全局 ID 真的必须随机吗?
必须。随机性正是两个网络将来合并时不发生冲突的保障。像 fd00::/48 这种顺序或好记的取值会让整个设计失去意义。
fc00::/8 和 fd00::/8 有什么区别?
fd00::/8 用于本地自行分配的前缀,也就是你应该生成的那一类。fc00::/8 原本预留给集中分配的前缀,但相应的注册机构从未建立。
可以同时使用 ULA 和全局前缀吗?
可以。接口通常会同时配置两者:ULA 提供稳定的内部地址,即使运营商更换前缀也不受影响;全局地址则负责对外流量。
生成的前缀需要到哪里注册吗?
不需要,也没有任何注册机构。正因如此,那 40 位随机数才格外重要——统计意义上的唯一性是避免重叠的唯一保障。