IPv6 ULA Generator

Generate RFC 4193 Unique Local Addresses. Create /48 prefixes, enumerate /64 subnets, and validate ULA addresses. 100% client-side.

Raw Output
Click Generate Prefix to create a new RFC 4193 ULA prefix.

How to Use the IPv6 ULA Generator

  1. Generate mode — click Generate Prefix to create a new cryptographically random /48 ULA prefix compliant with RFC 4193. The tool displays the compressed and expanded address forms, a bit-level breakdown, and an optional example host address within the prefix.
  2. Subnet mode — paste a /48 prefix and choose how many /64 subnets to enumerate, with a configurable start offset. This is useful for documenting your subnet allocation or planning VLAN assignments.
  3. Validate mode — enter any IPv6 address or prefix to check whether it is a valid ULA, determine which sub-range it belongs to, and see its expanded and compressed canonical forms.

What Is an IPv6 ULA?

An IPv6 Unique Local Address (ULA) is the IPv6 equivalent of IPv4 private address space (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16). Defined in RFC 4193, ULAs occupy the fc00::/7 block and are not routable on the global internet. They are designed for use within private networks — home labs, corporate LANs, container networks, and virtual machines — where global reachability is not needed. Their key property is that the 40-bit Global ID is generated randomly, making the probability of two independent sites choosing the same prefix negligibly small (approximately 1 in 10^12).

ULA Address Structure

A ULA address has four parts:

  • Prefix (8 bits) — always fd for locally generated addresses. This marks the address as a ULA within the fc00::/7 block with the Local (L) bit set to 1.
  • Global ID (40 bits) — five random bytes generated using a cryptographically strong RNG. These 40 bits are the key to uniqueness across different networks.
  • Subnet ID (16 bits) — 16 bits that identify individual /64 subnets within your /48 prefix. With 16 bits you have 65,536 subnets to allocate.
  • Interface ID (64 bits) — identifies a specific host within a /64 subnet. Commonly set using EUI-64 (derived from a MAC address) or generated randomly per RFC 7217.

ULA vs. Link-Local vs. Global Unicast

IPv6 defines several address scopes. Link-local addresses (fe80::/10) are auto-configured on every interface but cannot cross routers — they are strictly for on-link communication. ULA addresses (fc00::/7) can be routed within a private network, making them suitable for multi-site VPN topologies or internal service meshes. Global unicast addresses (2000::/3) are publicly routable and allocated by IANA through RIRs. For private infrastructure that should never reach the internet, ULAs are the correct choice.

Why Not Use fc00::/8?

The fc00::/8 block is reserved for centrally assigned Global IDs — an assignment mechanism that has never been implemented by any authority. In practice, every ULA deployment uses the fd00::/8 block with a locally generated Global ID. The IETF has discussed deprecating fc00::/8 in favor of expanding the locally assigned range, but for now simply always use fd as your prefix byte. This tool generates only fd-prefixed ULAs, in line with all current guidance.

RFC 4193 Generation Algorithm

The RFC recommends generating the 40-bit Global ID from a SHA-1 hash of the current time and MAC address. In practice, a cryptographically secure random number generator (such as crypto.getRandomValues() in the browser or /dev/urandom on Linux) is equally valid and simpler. This tool uses crypto.getRandomValues() to generate 5 random bytes, which are then formatted as the five groups after the fd prefix byte. For other random generation tools, see our UUID Generator and Random Port Generator.

Practical Uses of ULA Addresses

  • Home lab networks — assign stable internal addresses to servers and VMs without depending on a router's prefix delegation.
  • Docker and Kubernetes — use ULA prefixes for pod and service networks in IPv6-enabled container environments.
  • VPN meshes — connect multiple sites with WireGuard or OpenVPN using ULA addresses that do not collide with any public space.
  • Testing and CI/CD — generate deterministic or random ULA prefixes for isolated test network namespaces.
  • IoT networks — give each device a stable ULA address that persists regardless of ISP prefix changes (ISPs may renumber your global prefix; your ULA never changes).

Frequently Asked Questions

A ULA (Unique Local Address) is an IPv6 address in the fc00::/7 block defined by RFC 4193. ULAs are the IPv6 equivalent of IPv4 private addresses (192.168.x.x, 10.x.x.x). They are not routable on the public internet and are intended for local network communication within a site or organization. The 'fd' prefix variant uses a locally assigned random Global ID, making collisions between different networks extremely unlikely.
A ULA address has the structure: 8 bits prefix (fd = 11111101) + 40 bits Global ID (random) + 16 bits Subnet ID + 64 bits Interface ID. The /48 prefix (prefix + global ID) identifies the network. The /64 subnet breaks that prefix into up to 65,536 individual subnets. The last 64 bits are the interface (host) identifier, often derived from a MAC address via EUI-64 or generated randomly.
Both are part of the fc00::/7 ULA block. The fc00::/8 range is reserved for centrally assigned Global IDs (not yet allocated by any authority), while the fd00::/8 range is for locally assigned Global IDs — meaning you generate the 40-bit Global ID yourself using a random number generator. For all practical purposes, every site generating its own ULA prefix should use the fd prefix.
No. Link-local addresses (fe80::/10) are automatically configured on every IPv6 interface and are only valid on a single network link — packets with link-local source or destination addresses are never forwarded by routers. ULA addresses are routable within a private network (site or organization) but not on the public internet. ULAs need manual or DHCPv6 configuration, while link-local addresses are automatic.
A /48 prefix leaves 16 bits for the Subnet ID, which gives 2^16 = 65,536 individual /64 subnets. Each /64 subnet can hold 2^64 (about 18.4 quintillion) host addresses. This means a single ULA /48 allocation is enough for virtually any organization — even large enterprises rarely need more than a few hundred subnets.