IPv6 has more flavors of address than IPv4. Where IPv4 had “public” and “private” and that was mostly it, IPv6 introduces explicit scopes — global, link-local, unique local, multicast — each with a different range and a different purpose. Understanding these scopes is essential to making sense of any ifconfig output on a modern host.
This post covers the main IPv6 address types: what each looks like, where it’s used, and how they fit into IPv6 deployment.
The Big Picture
Every IPv6 interface typically has multiple addresses — at minimum a link-local address (automatic) and often a global unicast address (from a router announcement or DHCPv6). Larger deployments add unique-local addresses (for private use), multicast group memberships, and special-purpose addresses.
The address’s prefix indicates its type:
::1/128— loopback (one address).fe80::/10— link-local.fc00::/7— unique local (ULA), typicallyfd00::/8in practice.2000::/3— global unicast (the public internet).ff00::/8— multicast.
Global Unicast
These are the “real” internet addresses — globally routable, like IPv4 public addresses.
The current allocated range is 2000::/3, which means addresses starting with binary 001. In practice, most assignments are within 2001::/16 or 2400::/16-2c00::/16.
A typical global unicast address:
2001:db8:1234:5678::1
- First 48-64 bits: the prefix (network).
- Last 64 bits: the host within the network.
This is what your laptop has when it’s on a public network. It’s what servers expose to the internet. It’s the only type of IPv6 address that’s globally routable.
For geolocation, global unicast IPv6 addresses are what you actually look up — the others have no meaningful geographic mapping.
Link-Local
Every IPv6 interface has at least one link-local address. They start with fe80::/10 and are automatically generated from the interface’s MAC address (or a randomized identifier in modern implementations).
fe80::1234:5678:9abc:def0
Link-local addresses:
- Are scope-limited to one network segment. Routers don’t forward them.
- Used for neighbor discovery, router advertisements, DHCPv6 client side.
- Don’t show up in DNS (typically).
- Persist as long as the interface is up.
The “zone identifier” syntax fe80::1234%eth0 specifies which interface — necessary because the same link-local address can exist on different interfaces.
For application code: you rarely use link-local addresses directly. The OS uses them under the hood for IPv6 plumbing. If you see fe80:: in your logs or ifconfig, that’s link-local.
Unique Local Addresses (ULA)
ULA is IPv6’s answer to RFC 1918 private addresses. Defined in RFC 4193, they’re for private networks that need IPv6 internally but don’t need internet-routable addresses.
The reserved range is fc00::/7, with fd00::/8 in practical use (the fc00::/8 half is reserved for future use cases that never quite materialized).
Generation rule: you take a /48 from fd00::/8 and add a random 40-bit identifier, so different organizations’ ULAs almost never collide.
fd12:3456:789a::/48 ← your random ULA
Anyone can generate their own ULA without coordination. There’s no central authority for ULAs.
Use cases:
- Internal IPv6 within an organization.
- Lab environments.
- Networks that may someday connect to other networks (random ULAs reduce collision risk).
ULAs aren’t internet-routable. They’re filtered at network borders like RFC 1918 in IPv4.
For more on private IP concepts generally, see private IP ranges RFC 1918.
Multicast
IPv6 multicast replaces IPv4 broadcast and significantly expands it. Range: ff00::/8.
Multicast addresses have flag bits and scope bits encoded in the prefix:
ff02::1 — all nodes on the local link
ff02::2 — all routers on the local link
ff05::1 — all nodes in the site
Scopes in IPv6 multicast:
ff01::/16— interface-localff02::/16— link-localff05::/16— site-localff08::/16— organization-localff0e::/16— global
Application code rarely manipulates multicast directly. It’s used by IPv6 infrastructure for neighbor discovery, router advertisements, and similar protocols.
Anycast
IPv6 supports anycast — many hosts sharing the same address, with traffic routed to the nearest. Unlike multicast, anycast addresses are syntactically indistinguishable from regular unicast; only the routing tells them apart.
For more on the concept, see anycast vs unicast. The IPv6 model is the same: announce the same prefix from many locations; BGP routes traffic to whichever instance is closest.
Loopback
::1 is IPv6’s equivalent of IPv4’s 127.0.0.1. Every host has it; it refers to the host itself.
Used for local-only communication. Like IPv4 loopback, never leaves the host.
Unspecified
:: (all zeros) is the IPv6 unspecified address — analogous to IPv4’s 0.0.0.0. Used for “no address” or “listen on all interfaces”:
listen [::]:8080 # listen on all IPv6 interfaces on port 8080
IPv4-Mapped
For dual-stack applications, IPv6 sockets can represent IPv4 addresses in a special form:
::ffff:192.0.2.1
This is a 96-bit prefix of zeros, then ffff, then the 32-bit IPv4 address. It lets IPv6 socket APIs handle IPv4 connections without separate code paths. When your IPv6 socket accepts a connection from 192.0.2.1, the OS may present it as ::ffff:192.0.2.1.
For validation and parsing, libraries handle this transparently — your code shouldn’t need to special-case it.
IPv4-Embedded (NAT64)
64:ff9b::/96 is reserved for NAT64. When an IPv6-only host wants to reach an IPv4 destination via a NAT64 gateway, DNS64 synthesizes an AAAA record by encoding the IPv4 address into this range:
192.0.2.5 → 64:ff9b::c000:0205 (c0.00.02.05 = 192.0.2.5 in hex)
The IPv6-only host sends to the synthesized address; the NAT64 gateway extracts the IPv4 destination and forwards via IPv4. Transparent to the application.
Special Reserved Ranges
A few more ranges to know:
::/128— Unspecified.::1/128— Loopback.64:ff9b::/96— IPv4-IPv6 translation (NAT64).2001::/32— Teredo (IPv4-encapsulated IPv6, mostly obsolete).2001:db8::/32— Documentation prefix (used in examples like this post).2002::/16— 6to4 (largely deprecated).fe80::/10— Link-local.fc00::/7— Unique local (ULA).ff00::/8— Multicast.
How a Modern Linux Host Looks
$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
inet6 ::1/128 scope host
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
inet6 2001:db8:1234:5678::1/64 scope global
inet6 fe80::5054:ff:fe12:3456/64 scope link
Interface eth0 has:
2001:db8:1234:5678::1— its global address.fe80::5054:ff:fe12:3456— its link-local address.
Both are real, simultaneous, in-use. Different scopes, different purposes.
Privacy Extensions
IPv6 addresses generated from MAC addresses (via SLAAC’s modified EUI-64) are stable identifiers — they reveal the device across networks.
Privacy extensions (RFC 4941, RFC 8981) generate random host identifiers that rotate periodically (typically daily). Modern OSes (Windows, macOS, Linux, iOS, Android) enable this by default for global unicast addresses.
Implications:
- The host’s global IPv6 address changes daily.
- The link-local address (often) doesn’t.
- Trackers can’t use the global IPv6 alone as a long-term ID.
For geolocation services, the prefix (first 48-64 bits) is stable; the host bits change. Geolocation works at the prefix level.
What This Means for Applications
For application developers:
- Prefer using hostnames over IPs in configuration. DNS resolves to the right address type.
- For listening, use
::(IPv6 wildcard) — it accepts both IPv6 and IPv4-mapped connections on most OSes. - For displaying IPs to users, accept any of the forms and consider canonicalization.
- For logging, store IPs as canonical strings; many addresses have multiple textual representations.
- For geolocation lookups, pass the address as you received it; the API normalizes.
The Ip2Geo API accepts IPv6 in any standard form and returns the same response shape as for IPv4.
TL;DR
- Global unicast (
2000::/3) — public internet addresses. - Link-local (
fe80::/10) — automatic, scope-limited to the local link. - ULA (
fc00::/7, practicallyfd00::/8) — IPv6’s equivalent of RFC 1918. - Multicast (
ff00::/8) — group communication; replaces IPv4 broadcast. - Loopback (
::1) — the host itself. - IPv4-mapped (
::ffff:x.x.x.x) — for dual-stack sockets. 2001:db8::/32is reserved for documentation; safe to use in examples.- Privacy extensions rotate the host identifier so global addresses change daily.
IPv6’s richer address taxonomy makes more sense once you internalize the scope concept: addresses have an explicit scope (interface, link, site, global) that determines where they’re valid. For the broader deployment context, see IPv6 deployment guide; for the transition story, IPv4 vs IPv6.