Networking

IPv6 Addressing Explained: Address Types and EUI-64

IPv6 exists because the 32-bit IPv4 address space ran out: roughly 4.3 billion addresses was never going to cover the modern internet. IPv6 uses 128-bit addresses, which is an almost unimaginably larger pool, but the size is not the part that trips people up. What trips people up is the five address types that all look similar and the EUI-64 math that turns a MAC address into an interface ID. This guide covers the address format, how to identify any address by type, what each type is for, the EUI-64 process worked out against real router output, and how to configure IPv6 on a Cisco router.

Original content from computingforgeeks.com - post 169051

The behavior and command output described here were checked on a Cisco IOS router (a GNS3 c7200) in June 2026. It assumes you are comfortable with IPv4 addressing and prefix notation; if not, the subnetting primer covers the /n prefix idea that carries straight over to IPv6.

What an IPv6 address looks like

An IPv6 address is 128 bits, written as eight groups of four hexadecimal digits separated by colons. Written in full, an address is long, so two abbreviation rules shorten it. First, drop the leading zeros in any group. Second, replace the single longest run of consecutive all-zero groups with a double colon (::), which may appear only once in an address. The key insight is that :: can appear once because a parser fills it back out by counting the groups on either side; allow it twice and the length becomes ambiguous.

Here is the same address written long and short:

FormAddress
Full2001:0DB8:0000:0001:0000:0000:0000:0001
Leading zeros dropped2001:DB8:0:1:0:0:0:1
Longest zero run as ::2001:DB8:0:1::1

Prefix length works exactly as in IPv4: a /n after the address marks how many leading bits are the network portion. For LAN subnets that value is almost always /64, which splits the address into a 64-bit network half and a 64-bit host (interface) half.

How to identify an IPv6 address by its first digits

The type of an IPv6 address is decided by its first digit or two, so identification is a lookup, not a calculation. This is the table worth keeping in your head:

First digitsAddress typeRoutabilityNotes
2 or 3Global unicastInternet-routableAssigned by an ISP or RIR (2000::/3)
FDUnique localSite only, not on the internetThe RFC 1918 of IPv6
FE80Link-localOne link only, never forwardedAuto-generated on every interface
FFMulticastScope-dependentReplaces broadcast; no unicast use
FCUnique local (reserved)None todayOfficially reserved, not deployed

Anycast is the exception: it has no prefix of its own. An anycast address looks identical to a global unicast or unique local address, and the only difference is administrative, covered below.

Global unicast addresses

A global unicast address (GUA) is the IPv6 equivalent of a public IPv4 address: globally unique and routable on the internet. It starts with a 2 or 3 (the 2000::/3 block). What’s actually happening inside a GUA is a three-part split. The first 48 bits are the Global Routing Prefix your ISP or regional registry assigns. The next 16 bits are a Subnet ID you control, enough for 65,536 subnets. The last 64 bits are the Interface ID, the host part.

IPv6 global unicast address structure showing the 48-bit routing prefix, 16-bit subnet ID, and 64-bit interface ID

The 64-bit boundary matters because it is where the host part begins, and it is the line that EUI-64 and stateless autoconfiguration both work against. A site that receives a /48 from its ISP has 16 subnet bits to carve /64 networks from, which is the standard enterprise layout. The carving is the same binary exercise as variable-length subnetting in IPv4, only with so many bits that you rarely subnet below /64.

Unique local addresses

Unique local addresses (ULAs) are the RFC 1918 of IPv6: usable inside a site, never routed on the public internet. In practice they always begin with FD. The standard reserves the wider FC00::/7 block, but RFC 4193 requires a bit that forces the second hex digit to D, so a real ULA is always FD; FC is reserved and unused. After the FD comes a 40-bit Global ID that you are meant to generate randomly, which is what keeps two organizations from colliding when they merge networks that both use internal IPv6. A ULA looks like FD00:1234:5678:1::1/64, and you configure it exactly like a GUA.

Every IPv6-enabled interface gets a link-local address automatically, with no configuration, the moment IPv6 is active on it. Link-local addresses always begin FE80 and are never forwarded past the local link. They are not a curiosity: the mechanism that discovers a neighbor’s MAC (NDP, the IPv6 replacement for ARP) runs over link-local, routing protocols form neighbor adjacencies over link-local, and the next hop in an IPv6 routing table is a link-local address, not a global one. That last point surprises people the first time they read show ipv6 route: the next hop they expected to be a global address is an FE80 one, because link-local addresses never change even when the global prefix does.

Cisco IOS builds the interface ID for that link-local address with modified EUI-64, a four-step process that turns a 48-bit MAC into a 64-bit interface ID. Worked out against the lab router’s MAC of 0201.ABCD.0001:

StepActionResult
1Start with the 48-bit MAC (12 hex digits)0201.ABCD.0001
2Split it into two 24-bit halves0201AB and CD0001
3Insert FFFE between the halves0201:ABFF:FECD:0001
4Flip the 7th bit of the first byte (02 becomes 00)0001:ABFF:FECD:0001

The interface ID is 0001:ABFF:FECD:0001, so the link-local address is FE80::1:ABFF:FECD:1. The two giveaways that an address came from EUI-64 are the FF:FE sitting in the middle and the flipped 7th bit. The router output confirms the math exactly, on both the link-local and the EUI-64 global address:

Cisco show ipv6 interface output with the EUI-64 global unicast address and joined multicast groups FF02::1 FF02::2

Multicast addresses

IPv6 has no broadcast. Multicast does that job, and every multicast address begins with FF. The fourth hex digit encodes scope, which is how far the packet travels: FF02 is link-local scope (stays on the link), while FF0E is global. A handful of link-local multicast groups appear constantly and are worth memorizing.

AddressGroup
FF02::1All nodes on the link
FF02::2All routers on the link
FF02::5All OSPFv3 routers
FF02::6All OSPFv3 designated routers

These are not theoretical. The show ipv6 interface capture above lists FF02::1 and FF02::2 under “Joined group address(es)”, alongside a solicited-node address (FF02::1:FFCD:1) that NDP derives from the interface’s own address to do efficient neighbor discovery.

Anycast addresses

An anycast address is one address assigned to several interfaces, usually on several routers. The network delivers a packet sent to that address to whichever holder is topologically nearest. There is no special prefix; an anycast address is drawn from the global unicast or unique local range and configured with an anycast keyword so the device knows not to treat duplicates as a conflict. For CCNA the requirement is the concept, not deep configuration: same address, nearest node answers.

Configuring IPv6 on a Cisco router

The one command people forget is the first one. IPv6 routing is off by default on a Cisco router, the opposite of IPv4. A router with addresses configured still drops any IPv6 packet not destined to itself until you enable routing globally:

enable
configure terminal
ipv6 unicast-routing
interface GigabitEthernet0/0
ipv6 address 2001:DB8:CAFE:2::/64 eui-64
no shutdown
end

The eui-64 keyword tells IOS to build the interface ID from the MAC, as worked out above. To set the whole address by hand instead, give the full address and prefix: ipv6 address 2001:DB8:CAFE:1::1/64. Verify both forms with show ipv6 interface brief, which lists each interface with its automatic link-local address and its configured global address:

Cisco show ipv6 interface brief output showing link-local and EUI-64 global unicast addresses

Each interface shows two addresses: the FE80 link-local that IOS generated on its own, and the global address you configured. That pairing, one automatic link-local and one routable global address per interface, is the normal IPv6 state, and it is the same workflow as the rest of the base device configuration.

Enabling routing also populates the routing table. Running show ipv6 route connected on the lab router lists each configured /64 as a directly connected route, the 2001:DB8:CAFE:1::/64 and 2001:DB8:CAFE:2::/64 prefixes that the router can now forward between. Without ipv6 unicast-routing, those addresses still exist on the interfaces, but the router refuses to forward anything between them, which is the gotcha worth burning into memory.

Practice IPv6 addressing

Drill the address types, the first-digit identifiers, and the EUI-64 steps with the flashcards, then test yourself on the quiz. The deck is a downloadable Anki package for spaced repetition.

Loading flashcards...

Now check what stuck:

Loading quiz...

Common IPv6 addressing misconceptions

Four ideas that carry over wrongly from IPv4 or from a quick skim of the address types.

Link-local addresses are not throwaway. An FE80 address looks like noise, but it is what neighbor discovery, routing adjacencies, and routing-table next hops actually use. You never configure it, and you never ignore it either.

The private prefix is FD, not FC. The standard reserves FC00::/7, so it is tempting to write a private address starting with FC. Real unique local addresses always start with FD; FC is reserved and not in use.

IPv6 does not need NAT to function. Unique local addresses give you private addressing, but the design intent is that every device can hold a real global address. NAT was an IPv4 workaround for scarcity, and IPv6 has no scarcity to work around.

The double colon is a one-time tool. :: compresses one run of zero groups per address. Using it twice makes the address ambiguous, so a parser rejects it. When two zero runs are equal length, compress the first. Get the address format and the five type prefixes solid, and the rest of IPv6 on the CCNA reads as routing and services layered on top of these same addresses. The CCNA 200-301 roadmap shows what comes next.

Keep reading

Configure Samba File Share on Debian 13 / 12 Debian Configure Samba File Share on Debian 13 / 12 Setup WireGuard VPN on Ubuntu 24.04 / Debian 13 / Rocky Linux 10 Debian Setup WireGuard VPN on Ubuntu 24.04 / Debian 13 / Rocky Linux 10 Use NetworkManager nmcli on Ubuntu and Debian Debian Use NetworkManager nmcli on Ubuntu and Debian TCP vs UDP Explained: Handshake, Windowing, and Ports Networking TCP vs UDP Explained: Handshake, Windowing, and Ports OSI Model Explained: 7 Layers, TCP/IP Mapping & Encapsulation Networking OSI Model Explained: 7 Layers, TCP/IP Mapping & Encapsulation Configure PF Firewall on FreeBSD 15: NAT, Queues, Load Balancing FreeBSD Configure PF Firewall on FreeBSD 15: NAT, Queues, Load Balancing

Leave a Comment

Press ESC to close