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 位隨機數才格外重要——統計意義上的唯一性是避免重疊的唯一保障。