IPv6 ULA generator

Generate a random IPv6 ULA /48 prefix

All computation runs locally in your browser

Last updated: February 8, 2026
Frank Zhao - Creator
CreatorFrank Zhao

Info

This tool uses the first method suggested by IETF using the current timestamp plus the MAC address, SHA1 hashed, and the lower 40 bits to generate your random ULA.

IPv6 ULA:
First routable block:
Last routable block:

Introduction / overview

The IPv6 ULA Generator produces a random IPv6 Unique Local Address prefix you can use inside a private network. The main output is a prefix like fdxx:xxxx:xxxx::/48fdxx:xxxx:xxxx::/48. From that /48/48 you can create up to 2162^{16} distinct/64/64 subnets (one per VLAN, site, or segment).

Who is this for?

  • Homelab and self-hosters designing stable internal IPv6 addressing.
  • Network engineers creating an internal /48/48 for sites and VLANs.
  • Developers spinning up private environments (VPNs, overlays, CI labs) with predictable routing.

Reliability note: this calculator follows an IETF-referenced approach that combines a timestamp and a MAC address, hashes with SHA1\mathrm{SHA1}, and uses the lower 4040 bits to form the Global ID portion of a ULA prefix.

If you’re also working with IPv4 subnetting, our IPv4 Subnet Calculator can help you keep your dual-stack plans consistent.

How to use / quick start

  1. 1Enter a MAC address in the input field (for example, from a NIC label, router UI, or `ip link`).
  2. 2If the MAC is valid, the tool instantly generates an IPv6 ULA prefix and two example /64 blocks.
  3. 3Click the copy button next to any field to paste it into your router, firewall, or documentation.
  4. 4Optional: use the Share button to send a link to your team (you can include the MAC in the link if you want reproducibility for the same input state).

Worked example (conceptual)

Suppose the tool reads a timestamp tt and a MAC addressMAC="20:37:06:12:34:56"\mathrm{MAC}=\text{"20:37:06:12:34:56"}. It hashes the concatenated message and keeps the last 4040 bits.

hh==SHA1(tMAC)\mathrm{SHA1}(\,t\Vert \mathrm{MAC}\,)\RightarrowGlobalID=LSB40(h)\mathrm{GlobalID}=\mathrm{LSB}_{40}(h)

The resulting prefix is formatted as fdGlobalID::/48fd\,\mathrm{GlobalID}::/48, then the calculator shows:

  • The base ULA prefix ::/48::/48 for your site
  • A first example subnet :0::/64:0::/64
  • A last example subnet :ffff::/64:ffff::/64

Real-world examples / use cases

Homelab addressing plan

Background: you want stable internal IPv6 addresses for servers, NAS, and IoT. Input: a router MAC like "20:37:06:12:34:56"\text{"20:37:06:12:34:56"}. Result: a ULA prefix fdxx:xxxx:xxxx::/48fdxx:xxxx:xxxx::/48.

How to use it: allocate /64/64 per VLAN (e.g., users, servers, IoT). The number of possible subnets is 216=655362^{16}=65536.

Site-to-site VPN / overlay network

Background: you connect two locations with a VPN and want non-overlapping private IPv6. Input: the VPN gateway MAC. Result: a /48/48 that you can subnet into /64/64 per site.

Tip: if you also need IPv4 planning, pair this with our IPv4 Subnet Calculator.

Lab environment for testing

Background: a CI lab or staging cluster needs predictable addressing that won’t collide with other teams. Input: any stable MAC from your environment. Result: a unique internal prefix for your lab.

Application: document the prefix and use deterministic subnet numbering to avoid surprises.

Security segmentation

Background: you separate networks by trust level (guest, prod, mgmt). Input: a firewall MAC. Result: a ULA /48/48 with plenty of room for segmented /64/64 blocks.

How to apply it: write firewall rules per /64/64 instead of per-host.

Documentation and team handoff

Background: you need a clean prefix to put in runbooks and diagrams. Input: a device MAC. Result: a shareable ULA plan you can copy-paste.

Use the Share button to send the calculator link to teammates when reviewing network changes.

Common scenarios / when to use

You need a private IPv6 plan for a small org

Pick a ULA /48, then subnet by department or site with /64 blocks.

You want a stable IPv6 lab for development

Use a dedicated ULA prefix so internal services keep working even when upstream addressing changes.

You are merging two networks

Choose non-overlapping prefixes to reduce renumbering and routing confusion.

You are designing security zones

Reserve distinct /64 ranges per zone to simplify ACLs and monitoring.

You are setting up a VPN or overlay

Allocate /64 per tunnel or per site. Keep it consistent across documentation.

You are documenting infrastructure

Copy the ULA and example blocks directly into diagrams or runbooks.

When it may not be appropriate

If you need publicly routable IPv6 for the Internet, you should use a prefix delegated by your ISP or RIR. ULAs are meant for internal routing and private connectivity.

Tips & best practices

  • Treat the output /48/48 as your “site prefix” and allocate/64/64 per segment. Avoid using smaller than /64/64 for LANs.
  • Keep a simple subnet numbering convention (for example, 00000000 users,01000100 servers, 02000200 IoT).
  • Document the prefix in one place (diagram + config repo + runbook) so future changes don’t drift.
  • Prefer ULAs for internal-only traffic. For Internet-facing services, use your ISP/RIR global unicast prefix.

If you want to sanity-check other pieces of your network tooling, you may also find our MAC address lookup useful for confirming OUIs when you’re inventorying devices.

Calculation method / formula explanation

The generator uses a straightforward “hash then format” approach. In words: concatenate the timestamp and the MAC string, compute a SHA1 hash, then take the last 40 bits as the Global ID.

ULA prefix=fd00::/8 with a 40-bit Global ID\text{ULA prefix} = fd00::/8\ \text{with a 40-bit Global ID}
mm==tMACt\Vert \mathrm{MAC},,hh==SHA1(m)\mathrm{SHA1}(m),,GlobalID\mathrm{GlobalID}==LSB40(h)\mathrm{LSB}_{40}(h)

Because the Global ID is 4040 bits, the number of possible prefixes is2402^{40} (about one trillion). That makes accidental collisions very unlikely in practice.

Output formatting

The tool prints the /48/48 and two example /64/64 ranges:

  • fdxx:xxxx:xxxx::/48fdxx:xxxx:xxxx::/48
  • fdxx:xxxx:xxxx:0::/64fdxx:xxxx:xxxx:0::/64
  • fdxx:xxxx:xxxx:ffff::/64fdxx:xxxx:xxxx:ffff::/64

Related concepts / background info

Key terms

ULA\text{ULA}: Unique Local Address space intended for internal routing.

/48/48: common “site prefix” size used to create many /64/64 subnets.

/64/64: standard LAN subnet size in IPv6 for SLAAC and typical host addressing.

A practical way to think about it: choose one stable /48/48 for your environment, then never reuse it elsewhere. Inside that, assign /64/64 blocks for everything you might want to route.

Frequently asked questions (FAQs)

Do ULAs work on the public Internet?

No. ULAs are intended for internal routing. For public reachability, use global unicast prefixes delegated by your ISP or RIR.

Why does the tool show a /48 and then /64 blocks?

A /48/48 is a convenient site prefix, and IPv6 networks typically use /64/64 for LAN subnets. From a single /48/48, you can allocate 2162^{16} different /64/64 subnets.

Will I get the same prefix every time?

Not necessarily. The method uses the current timestamp, so generating again later can produce a different result even with the same MAC. If you need a stable prefix, generate once and store it in your configuration.

Is it safe to share my MAC address?

A MAC address can be considered identifying device information in many contexts. Use the Share option without results if you don’t want the MAC embedded.

Can I use any MAC format?

The input accepts common formats like "AA:BB:CC:DD:EE:FF"\text{"AA:BB:CC:DD:EE:FF"} or "AA-BB-CC-DD-EE-FF"\text{"AA-BB-CC-DD-EE-FF"}. If you get an “Invalid MAC address” message, adjust separators or ensure the bytes are complete.

Limitations / disclaimers

Important notes

  • This calculator helps generate a private IPv6 prefix. It does not validate your full network design or routing.
  • Do not use ULAs as a substitute for ISP/RIR allocated prefixes when you need global reachability.
  • The generated prefix can change across runs due to the timestamp component. Save the prefix you choose.

External references / sources

For deeper background, these references are a good place to start: