IPv6 DHCPv6 — Stateful & Stateless (SLAAC)
IPv4 has one way to assign addresses dynamically — DHCP. IPv6 has three. A host joining an IPv6 network can receive its address through SLAAC (Stateless Address Autoconfiguration), Stateless DHCPv6, or Stateful DHCPv6 — and the router controls which method clients use entirely through flags in a single message: the Router Advertisement (RA). Understanding which method to deploy, how to configure each one on a Cisco router, and how to verify client addressing is essential for both the CCNA exam and any real IPv6 deployment.
The three methods are not mutually exclusive — they are layered. SLAAC always provides the IPv6 address itself. Stateless DHCPv6 adds configuration parameters (DNS, domain name) without tracking addresses. Stateful DHCPv6 does everything — assigns addresses, tracks bindings, and delivers configuration — exactly like IPv4 DHCP. The RA message is the signalling mechanism that tells clients which combination to use.
Before starting, ensure you understand IPv6 addressing fundamentals from IPv6 Addressing and the difference between link-local and global unicast addresses from IPv6 Link-Local vs Global Unicast. For IPv4 DHCP context, review DHCP Server Configuration and DHCP Relay Agent — DHCPv6 relay uses a similar concept with different syntax. IPv6 routing must be enabled before any of these methods work — this is covered in Basic Interface Configuration.
1. IPv6 Address Assignment — Core Concepts
The Three IPv6 Address Assignment Methods
| Method | Address Source | Other Config (DNS etc.) | Server Tracks Bindings | Best For |
|---|---|---|---|---|
| SLAAC | Client generates its own from the prefix in the RA | No — client gets nothing else | No | Simple networks, IoT, where DNS is not needed from the network |
| Stateless DHCPv6 | Client generates its own from the RA prefix (SLAAC) | Yes — DHCPv6 server provides DNS, domain name, NTP etc. | No — no address bindings stored | Most enterprise LANs — clients self-address but get DNS from a server |
| Stateful DHCPv6 | DHCPv6 server assigns a specific address from a pool | Yes — full configuration delivered | Yes — binding table maintained per client | Environments needing address tracking, fixed assignments, or audit trails |
Router Advertisement Flags — The Control Signals
The router sends periodic Router Advertisement (RA) messages to the all-nodes multicast address (FF02::1). Three flags in the RA header control exactly which addressing method clients must use. These flags are set on the router's interface:
RA Flag Summary:
Flag Name Meaning When SET (1)
─────────────────────────────────────────────────────────────────────
A Autonomous Client SHOULD use SLAAC to self-generate address
(in Prefix Info option) Set by default when a prefix is in the RA
M Managed address config Client MUST get address from DHCPv6 server (Stateful)
(in RA header) When M=1, client ignores A flag for addressing
O Other config Client SHOULD get OTHER config (DNS, NTP) from DHCPv6
(in RA header) When O=1 with M=0 → Stateless DHCPv6
When M=1, O is implied (M covers everything)
─────────────────────────────────────────────────────────────────────
Resulting method combinations:
M=0 O=0 A=1 → Pure SLAAC only (client self-addresses, no DHCPv6)
M=0 O=1 A=1 → SLAAC + Stateless DHCP (self-address + get DNS from server)
M=1 O=0 A=0 → Stateful DHCPv6 only (server assigns address + config)
M=1 O=1 A=0 → Stateful DHCPv6 only (M=1 implies O — explicit is fine)
─────────────────────────────────────────────────────────────────────
How SLAAC Generates an Address (EUI-64)
When a client receives an RA with a /64 prefix and the A flag set, it generates the host portion of its address using EUI-64 — a method that derives a 64-bit interface ID from the device's 48-bit MAC address:
EUI-64 Interface ID Generation:
MAC address: a4:b1:c2:d3:e4:f5
─────┬───── ─────┬─────
OUI (24 bit) Device ID (24 bit)
Step 1: Split MAC in half → a4:b1:c2 | d3:e4:f5
Step 2: Insert FFFE in the middle → a4:b1:c2:FF:FE:d3:e4:f5
Step 3: Flip the 7th bit (Universal/Local bit) of the first byte
a4 = 1010 0100 → flip bit 7 → 1010 0110 = a6
Result: a6b1:c2ff:fed3:e4f5
Final IPv6 address (with prefix 2001:db8:1::/64):
2001:db8:1::a6b1:c2ff:fed3:e4f5
Note: Many modern OSes (Windows 10+, iOS, Android) use
privacy extensions (RFC 4941) to generate RANDOM interface IDs
instead of EUI-64 — preventing device tracking by MAC.
The network admin cannot predict or control these addresses,
which is why stateful DHCPv6 is preferred when tracking matters.
IPv6 Neighbour Discovery — RS and RA Messages
| Message | Type | Sent By | Destination | Purpose |
|---|---|---|---|---|
| RS (Router Solicitation) | ICMPv6 Type 133 | Client (host) | FF02::2 (all-routers) | Host asks: "Is there a router here? Send me your RA immediately" |
| RA (Router Advertisement) | ICMPv6 Type 134 | Router | FF02::1 (all-nodes) | Router announces: prefix, flags (M/O/A), default gateway, MTU, lifetime |
| DHCPv6 Solicit | DHCPv6 | Client | FF02::1:2 (all-DHCPv6-servers) | Client requests DHCPv6 service after seeing M=1 or O=1 in RA |
| DHCPv6 Advertise | DHCPv6 | DHCPv6 Server | Client link-local | Server responds with available address or configuration |
2. Lab Topology & Scenario
This lab uses NetsTuts_R1 as both the IPv6 router and DHCPv6 server across three LAN segments — one for each addressing method. This allows direct comparison of all three methods on the same device. NetsTuts_R2 acts as an upstream router to demonstrate prefix delegation.
NetsTuts_R1
┌────────────────────────────────────────┐
│ │
[Host-A] ───┤ Gi0/0 SLAAC only │
│ 2001:db8:1::1/64 │
│ M=0 O=0 A=1 │
│ │
[Host-B] ───┤ Gi0/1 SLAAC + Stateless DHCPv6 │
│ 2001:db8:2::1/64 │
│ M=0 O=1 A=1 │
│ │
[Host-C] ───┤ Gi0/2 Stateful DHCPv6 │
│ 2001:db8:3::1/64 Pool: ::10–::ff │
│ M=1 O=0 A=0 │
│ │
│ Gi0/3 ─────────────────────────────────┼── NetsTuts_R2
│ 2001:db8:ff::1/64 (WAN / upstream) │ 2001:db8:ff::2/64
└────────────────────────────────────────┘
Lab Objectives:
1. Enable IPv6 routing and configure interface addresses
2. Configure pure SLAAC on Gi0/0 — clients self-address, no DHCPv6
3. Configure stateless DHCPv6 on Gi0/1 — SLAAC + DNS from server
4. Configure stateful DHCPv6 on Gi0/2 — server assigns all addressing
5. Verify each method with show ipv6 dhcp binding and RA inspection
6. Configure a DHCPv6 relay for remote segments
| Interface | IPv6 Address | Method | M Flag | O Flag | A Flag |
|---|---|---|---|---|---|
| Gi0/0 | 2001:db8:1::1/64 | SLAAC only | 0 | 0 | 1 (default) |
| Gi0/1 | 2001:db8:2::1/64 | SLAAC + Stateless DHCPv6 | 0 | 1 | 1 (default) |
| Gi0/2 | 2001:db8:3::1/64 | Stateful DHCPv6 | 1 | 0 | 0 |
| Gi0/3 | 2001:db8:ff::1/64 | WAN (static) | — | — | — |
3. Step 1 — Enable IPv6 Routing & Configure Interfaces
IPv6 unicast routing is disabled by default on Cisco IOS routers. It must be enabled globally before any IPv6 routing or RA generation works. Without this command the router will not send Router Advertisements and clients will not be able to autoconfigure:
NetsTuts_R1>en NetsTuts_R1#conf t Enter configuration commands, one per line. End with CNTL/Z. ! ── Enable IPv6 unicast routing globally ───────────────── NetsTuts_R1(config)#ipv6 unicast-routing ! ── SLAAC-only segment (Gi0/0) ─────────────────────────── NetsTuts_R1(config)#interface GigabitEthernet0/0 NetsTuts_R1(config-if)#description SLAAC-Only-Segment NetsTuts_R1(config-if)#ipv6 address 2001:db8:1::1/64 NetsTuts_R1(config-if)#ipv6 nd prefix 2001:db8:1::/64 NetsTuts_R1(config-if)#no shutdown NetsTuts_R1(config-if)#exit ! ── Stateless DHCPv6 segment (Gi0/1) ───────────────────── NetsTuts_R1(config)#interface GigabitEthernet0/1 NetsTuts_R1(config-if)#description Stateless-DHCPv6-Segment NetsTuts_R1(config-if)#ipv6 address 2001:db8:2::1/64 NetsTuts_R1(config-if)#no shutdown NetsTuts_R1(config-if)#exit ! ── Stateful DHCPv6 segment (Gi0/2) ───────────────────── NetsTuts_R1(config)#interface GigabitEthernet0/2 NetsTuts_R1(config-if)#description Stateful-DHCPv6-Segment NetsTuts_R1(config-if)#ipv6 address 2001:db8:3::1/64 NetsTuts_R1(config-if)#no shutdown NetsTuts_R1(config-if)#exit ! ── WAN interface (Gi0/3) ──────────────────────────────── NetsTuts_R1(config)#interface GigabitEthernet0/3 NetsTuts_R1(config-if)#description WAN-to-R2 NetsTuts_R1(config-if)#ipv6 address 2001:db8:ff::1/64 NetsTuts_R1(config-if)#no shutdown NetsTuts_R1(config-if)#exit
ipv6 unicast-routing does three things: enables IPv6
packet forwarding between interfaces, causes the router to generate
Router Advertisements on all IPv6-enabled interfaces, and allows
the router to act as a default gateway for IPv6 hosts. Without it,
the router behaves as an IPv6 host — it can have IPv6 addresses but
will not route packets or send RAs. Assigning a global unicast
address with ipv6 address also automatically creates
a link-local address on the interface (fe80::/10 range).
Verify Interface IPv6 Addresses
NetsTuts_R1#show ipv6 interface brief
GigabitEthernet0/0 [up/up]
FE80::1 (link-local — auto-generated)
2001:DB8:1::1
GigabitEthernet0/1 [up/up]
FE80::1
2001:DB8:2::1
GigabitEthernet0/2 [up/up]
FE80::1
2001:DB8:3::1
GigabitEthernet0/3 [up/up]
FE80::1
2001:DB8:FF::1
4. Step 2 — Pure SLAAC (No DHCPv6)
SLAAC is the default IPv6 behaviour when ipv6 unicast-routing
is enabled. The router automatically sends RAs containing the interface
prefix with the A flag set. No additional configuration is needed for
pure SLAAC — but understanding how to verify and control the RA
content is important:
! ── Gi0/0 is already sending RAs with default flags ────── ! ── Default: M=0, O=0, A=1 (pure SLAAC) ───────────────── ! ── No additional commands needed for basic SLAAC ──────── ! ── Optionally set explicit RA interval and lifetime ───── NetsTuts_R1(config)#interface GigabitEthernet0/0 NetsTuts_R1(config-if)#ipv6 nd ra-interval 30 NetsTuts_R1(config-if)#ipv6 nd ra-lifetime 180 NetsTuts_R1(config-if)#exit
ipv6 nd ra-interval 30 sets the router to send an
unsolicited RA every 30 seconds (default is 200 seconds). The
ra-lifetime tells clients how long to treat this
router as a valid default gateway — if the router stops sending RAs,
clients remove it as a default gateway after this timer expires.
Setting ra-lifetime to 0 tells clients "do not use me as a default
gateway" — useful on non-default-gateway routers that still send
prefix information.
Verify RA Content on Gi0/0
NetsTuts_R1#show ipv6 interface GigabitEthernet0/0
GigabitEthernet0/0 is up, line protocol is up
IPv6 is enabled, link-local address is FE80::1
Global unicast address(es):
2001:DB8:1::1, subnet is 2001:DB8:1::/64
Joined group address(es):
FF02::1 (all-nodes multicast)
FF02::2 (all-routers multicast)
FF02::1:FF00:1 (solicited-node multicast)
ND DAD is enabled, number of DAD attempts: 1
ND reachable time is 30000 milliseconds
ND advertised reachable time is 0 (unspecified)
ND advertised retransmit interval is 0 (unspecified)
ND router advertisements are sent every 30 seconds
ND router advertisements live for 180 seconds
ND advertised default router preference is Medium
Hosts use stateless autoconfig for addresses.
Suppress RAs on an Interface (Security)
! ── Stop sending RAs on an interface where no clients exist ! ── e.g., WAN link — prevents hosts on that segment from ! ── using this router as a default gateway unintentionally NetsTuts_R1(config)#interface GigabitEthernet0/3 NetsTuts_R1(config-if)#ipv6 nd ra suppress all NetsTuts_R1(config-if)#exit
all keyword suppresses both periodic and
solicited RAs. For individual hosts that need the gateway, static
IPv6 configuration is used instead.
5. Step 3 — Stateless DHCPv6 (SLAAC + DNS)
Stateless DHCPv6 combines SLAAC address generation with a DHCPv6 server providing configuration parameters. The router sets O=1 in the RA — clients self-generate their address from the RA prefix, then separately contact the DHCPv6 server to retrieve DNS servers, domain name, and other options. The DHCPv6 server tracks no address bindings — hence "stateless":
Create the Stateless DHCPv6 Pool
! ── DHCPv6 pool for stateless service on Gi0/1 ─────────── ! ── No address range — stateless pools provide config only NetsTuts_R1(config)#ipv6 dhcp pool STATELESS-POOL NetsTuts_R1(config-dhcpv6)#dns-server 2001:db8::53 NetsTuts_R1(config-dhcpv6)#dns-server 2001:4860:4860::8888 NetsTuts_R1(config-dhcpv6)#domain-name netstuts.com NetsTuts_R1(config-dhcpv6)#exit
Apply the Pool and Set the O Flag on Gi0/1
NetsTuts_R1(config)#interface GigabitEthernet0/1 ! ── Bind the DHCPv6 pool to this interface ─────────────── NetsTuts_R1(config-if)#ipv6 dhcp server STATELESS-POOL ! ── Set O=1: tell clients to get OTHER config from DHCPv6 ─ NetsTuts_R1(config-if)#ipv6 nd other-config-flag ! ── M flag stays 0 (default) — clients still use SLAAC ─── NetsTuts_R1(config-if)#exit
ipv6 nd other-config-flag sets the O bit in the RA to
1. Clients receiving this RA will: (1) use SLAAC to generate their
own IPv6 address from the 2001:db8:2::/64 prefix (A=1, M=0), then
(2) send a DHCPv6 Information-Request to FF02::1:2 to retrieve DNS
and domain name. The DHCPv6 server responds with the pool contents
but does not record the client's address — there is no binding table
entry for stateless clients.
Verify Stateless Configuration
NetsTuts_R1#show ipv6 interface GigabitEthernet0/1
GigabitEthernet0/1 is up, line protocol is up
IPv6 is enabled, link-local address is FE80::1
Global unicast address(es):
2001:DB8:2::1, subnet is 2001:DB8:2::/64
...
ND router advertisements are sent every 200 seconds
ND router advertisements live for 1800 seconds
Hosts use stateless autoconfig for addresses.
Hosts use DHCP to get other configuration parameters.
NetsTuts_R1#show ipv6 dhcp pool STATELESS-POOL DHCPv6 pool: STATELESS-POOL DNS server: 2001:DB8::53 DNS server: 2001:4860:4860::8888 Domain name: netstuts.com Active clients: 0
6. Step 4 — Stateful DHCPv6 (Full Address Assignment)
Stateful DHCPv6 mirrors IPv4 DHCP behaviour — the server assigns a specific IPv6 address to each client from a configured pool, maintains a binding table with client DUID, assigned address, and lease time, and delivers full configuration parameters. The router sets M=1 and suppresses the A flag — clients must not use SLAAC for their address:
Create the Stateful DHCPv6 Pool
! ── DHCPv6 pool for stateful service on Gi0/2 ─────────── NetsTuts_R1(config)#ipv6 dhcp pool STATEFUL-POOL ! ── Define the address range to assign from ───────────── NetsTuts_R1(config-dhcpv6)#address prefix 2001:db8:3::/64 lifetime 86400 3600 ! ── DNS and domain configuration ──────────────────────── NetsTuts_R1(config-dhcpv6)#dns-server 2001:db8::53 NetsTuts_R1(config-dhcpv6)#domain-name netstuts.com NetsTuts_R1(config-dhcpv6)#exit
address prefix command is what distinguishes a
stateful pool from a stateless one. It defines the prefix from
which addresses are allocated. The lifetime values
set the valid lifetime (86400 seconds = 24 hours
— how long the address is valid) and the preferred
lifetime (3600 seconds = 1 hour — after this, the client
should seek renewal but can still use the address). Clients are
assigned addresses sequentially from the pool — the server picks
the next available address within the /64 prefix.
Exclude Addresses from the Stateful Pool
! ── Exclude the router's own address and reserved addresses ! ── from being assigned to clients ────────────────────── NetsTuts_R1(config)#ipv6 dhcp pool STATEFUL-POOL NetsTuts_R1(config-dhcpv6)#address prefix 2001:db8:3::/64 lifetime 86400 3600 exclude 2001:db8:3::1 NetsTuts_R1(config-dhcpv6)#exit
ip dhcp excluded-address), DHCPv6 on IOS uses the
exclude keyword within the address prefix
command to specify individual addresses or ranges to skip. Always
exclude the router's own interface address (::1) and any other
static addresses in the prefix.
Apply the Pool and Set the M Flag on Gi0/2
NetsTuts_R1(config)#interface GigabitEthernet0/2 ! ── Bind the stateful DHCPv6 pool ──────────────────────── NetsTuts_R1(config-if)#ipv6 dhcp server STATEFUL-POOL ! ── Set M=1: clients MUST get address from DHCPv6 ──────── NetsTuts_R1(config-if)#ipv6 nd managed-config-flag ! ── Set A=0: suppress the prefix in RA ─────────────────── ! ── Clients should NOT use SLAAC for this segment ──────── NetsTuts_R1(config-if)#ipv6 nd prefix 2001:db8:3::/64 no-autoconfig NetsTuts_R1(config-if)#exit NetsTuts_R1(config)#end NetsTuts_R1#wr Building configuration... [OK]
ipv6 dhcp server STATEFUL-POOL binds
the pool to this interface.
ipv6 nd managed-config-flag sets M=1
in the RA — clients receiving this RA know they must request an
address from a DHCPv6 server.
ipv6 nd prefix 2001:db8:3::/64 no-autoconfig
sets A=0 for this prefix in the RA — clients will not attempt to
self-generate an address from this prefix using SLAAC. Without
the no-autoconfig flag, clients would receive both a
DHCPv6-assigned address AND a SLAAC-generated address — resulting
in dual addressing which is undesirable in controlled environments.
Verify Stateful DHCPv6 Configuration
NetsTuts_R1#show ipv6 interface GigabitEthernet0/2
GigabitEthernet0/2 is up, line protocol is up
IPv6 is enabled, link-local address is FE80::1
Global unicast address(es):
2001:DB8:3::1, subnet is 2001:DB8:3::/64
...
ND router advertisements are sent every 200 seconds
ND router advertisements live for 1800 seconds
Hosts use DHCP to get their addresses and configuration.
7. Step 5 — Verifying DHCPv6 Bindings and Client Addressing
show ipv6 dhcp binding — Stateful Clients
NetsTuts_R1#show ipv6 dhcp binding
Client: FE80::A6B1:C2FF:FED3:E4F5
DUID: 00030001A4B1C2D3E4F5
Username : unassigned
VRF : default
Interface : GigabitEthernet0/2
IA NA: IA ID 0x00000001, T1 43200, T2 69120
Address: 2001:DB8:3::10
preferred lifetime 3600, valid lifetime 86400
expires at Mar 08 2026 08:14:33 (86021 seconds)
Client: FE80::B7C2:D3FF:FEE4:F506
DUID: 00030001B8C3D4E5F607
Username : unassigned
VRF : default
Interface : GigabitEthernet0/2
IA NA: IA ID 0x00000002, T1 43200, T2 69120
Address: 2001:DB8:3::11
preferred lifetime 3600, valid lifetime 86400
expires at Mar 08 2026 08:15:01 (86049 seconds)
show ipv6 dhcp pool — Pool Statistics
NetsTuts_R1#show ipv6 dhcp pool
DHCPv6 pool: STATELESS-POOL
DNS server: 2001:DB8::53
DNS server: 2001:4860:4860::8888
Domain name: netstuts.com
Active clients: 0
DHCPv6 pool: STATEFUL-POOL
Address allocation prefix: 2001:DB8:3::/64
(excluded: 2001:DB8:3::1)
valid lifetime 86400 preferred lifetime 3600
DNS server: 2001:DB8::53
Domain name: netstuts.com
Active clients: 2
show ipv6 dhcp interface — Per-Interface DHCPv6 Status
NetsTuts_R1#show ipv6 dhcp interface GigabitEthernet0/1 is in server mode Using pool: STATELESS-POOL Preference value: 0 Hint from client: ignored Rapid-Commit: disabled GigabitEthernet0/2 is in server mode Using pool: STATEFUL-POOL Preference value: 0 Hint from client: ignored Rapid-Commit: disabled
show ipv6 dhcp binding — Verify No Stateless Bindings
! ── Stateless clients are NOT in the binding table ─────── ! ── Only stateful (Gi0/2) clients appear here ──────────── NetsTuts_R1#show ipv6 dhcp binding | count Client 2
Verify RA Flags with debug ipv6 nd
NetsTuts_R1#debug ipv6 nd
ICMPv6-ND: Sending RA to FF02::1 on GigabitEthernet0/0
flags: M=0 O=0
prefix 2001:DB8:1::/64 flags A=1 valid 2592000 preferred 604800
ICMPv6-ND: Sending RA to FF02::1 on GigabitEthernet0/1
flags: M=0 O=1
prefix 2001:DB8:2::/64 flags A=1 valid 2592000 preferred 604800
ICMPv6-ND: Sending RA to FF02::1 on GigabitEthernet0/2
flags: M=1 O=0
prefix 2001:DB8:3::/64 flags A=0 valid 2592000 preferred 604800
NetsTuts_R1#undebug all
undebug all
immediately after to stop the debug output.
8. Step 6 — DHCPv6 Relay Agent
DHCPv6 clients send their Solicit messages to the link-local
multicast address FF02::1:2. This multicast cannot cross router
boundaries — if the DHCPv6 server is on a different subnet from the
clients, a DHCPv6 relay agent must forward the
messages. This is the IPv6 equivalent of the IPv4
ip helper-address command:
! ── Scenario: Clients on Gi0/2 need to reach a centralised ! ── DHCPv6 server at 2001:db8:ff::10 (on the WAN segment) ! ── instead of using the local pool on R1 ! ── Remove the local server binding first ───────────────── NetsTuts_R1(config)#interface GigabitEthernet0/2 NetsTuts_R1(config-if)#no ipv6 dhcp server STATEFUL-POOL ! ── Configure DHCPv6 relay on Gi0/2 pointing to the ────── ! ── centralised DHCPv6 server ──────────────────────────── NetsTuts_R1(config-if)#ipv6 dhcp relay destination 2001:db8:ff::10 NetsTuts_R1(config-if)#exit
ipv6 dhcp relay destination [server-IPv6-address] is
the complete DHCPv6 relay configuration. When a client on Gi0/2
sends a DHCPv6 Solicit to FF02::1:2, R1 intercepts it and forwards
a unicast Relay-Forward message to 2001:db8:ff::10. The server
responds with a Relay-Reply, which R1 unwraps and delivers back
to the client. The M and O flags on the interface remain in effect —
the relay just changes where the DHCPv6 requests are forwarded,
not how clients decide to use DHCPv6.
Verify Relay Configuration
NetsTuts_R1#show ipv6 dhcp interface GigabitEthernet0/2
GigabitEthernet0/2 is in relay mode
Relay destinations:
2001:DB8:FF::10
ipv6 dhcp relay destination commands.
9. Side-by-Side Method Comparison
| Characteristic | SLAAC Only | Stateless DHCPv6 | Stateful DHCPv6 |
|---|---|---|---|
| RA M flag | 0 | 0 | 1 |
| RA O flag | 0 | 1 | 0 (or 1) |
| RA A flag | 1 | 1 | 0 (use no-autoconfig) |
| Address source | Client generates (EUI-64 or random) | Client generates (EUI-64 or random) | DHCPv6 server assigns |
| DNS delivered | No | Yes — via DHCPv6 | Yes — via DHCPv6 |
| Default gateway | Router link-local (from RA) | Router link-local (from RA) | Router link-local (from RA) |
| Server tracks bindings | No server involved | No — stateless | Yes — full binding table |
| Address predictability | Unpredictable (EUI-64/random) | Unpredictable (EUI-64/random) | Controlled — server assigns specific addresses |
| Router config needed | None beyond interface + unicast-routing | DHCPv6 pool (no prefix) + O flag | DHCPv6 pool (with prefix) + M flag + no-autoconfig |
| IOS verification | show ipv6 interface |
show ipv6 dhcp pool (shows 0 clients) |
show ipv6 dhcp binding (shows all clients) |
10. Verification Command Summary
| Command | What It Shows | Primary Use |
|---|---|---|
show ipv6 dhcp binding |
All active stateful DHCPv6 leases — client DUID, link-local, assigned address, lifetimes, interface | Primary verification for stateful DHCPv6 — confirm clients received addresses and see lease expiry |
show ipv6 dhcp pool |
All DHCPv6 pools — configuration (DNS, prefix, lifetime) and active client count | Confirm pool config is correct — stateless shows 0 clients, stateful shows active lease count |
show ipv6 dhcp interface |
Per-interface DHCPv6 mode (server or relay), pool name, rapid-commit status | Confirm each interface is bound to the correct pool and operating in the right mode |
show ipv6 interface [int] |
Full IPv6 interface detail — addresses, ND settings, RA interval/lifetime, M/O/A flag summary line | Verify RA flags — the last line confirms "stateless autoconfig", "DHCP other config", or "DHCP addresses" |
show ipv6 interface brief |
All IPv6 interfaces — status and addresses (link-local and global) | Quick check that all interfaces have the correct IPv6 addresses and are up |
show ipv6 neighbors |
IPv6 neighbour cache — equivalent of show ip arp for IPv6. See IPv6 Neighbour Discovery |
Confirm clients are reachable at Layer 3 — shows client link-locals and global addresses learned via NDP |
show ipv6 routers |
Router entries learned from RAs (run on a host or another router) | Verify RA is being received correctly — shows prefix, lifetime, and flags as seen by receiving device |
debug ipv6 nd |
Live RA send/receive events — shows M, O, A flag values and prefix info in each RA | Confirm exact RA content being sent — use briefly and always follow with undebug all |
debug ipv6 dhcp |
Live DHCPv6 message exchange — Solicit, Advertise, Request, Reply, Information-Request | Trace the full DHCPv6 handshake — see exactly what messages are sent and received per client |
show ipv6 route |
IPv6 routing table — confirms routes for each prefix are present | Verify IPv6 prefixes are in the routing table and reachable before troubleshooting DHCPv6 |
11. Troubleshooting DHCPv6 and SLAAC Issues
| Problem | Symptom | Cause | Fix |
|---|---|---|---|
| Clients not getting any IPv6 address | Hosts on the segment have only a link-local address — no global unicast. No DHCPv6 bindings | ipv6 unicast-routing is not enabled — the router is not sending RAs, so clients never learn the prefix or flags |
Verify with show run | include unicast-routing. If missing, add ipv6 unicast-routing in global config. Confirm RAs are being sent with debug ipv6 nd |
| Clients get SLAAC address but no DNS | Hosts have a global IPv6 address (SLAAC working) but cannot resolve hostnames — no DNS server configured | The O flag is not set — clients are not being told to contact DHCPv6 for additional configuration. Pure SLAAC (M=0, O=0) does not deliver DNS | Add ipv6 nd other-config-flag on the interface and create a stateless DHCPv6 pool with dns-server. Bind the pool to the interface with ipv6 dhcp server [pool-name] |
| Stateful clients also get a SLAAC address | Hosts on the stateful DHCPv6 segment have two global addresses — one from DHCPv6 and one self-generated | M=1 was set but no-autoconfig was not applied to the prefix in the RA. Clients see M=1 (get address from DHCPv6) and A=1 (also do SLAAC) — both succeed |
Add ipv6 nd prefix 2001:db8:3::/64 no-autoconfig on the Gi0/2 interface to set A=0 for that prefix. Clients will then only use the DHCPv6-assigned address |
| No bindings in show ipv6 dhcp binding | Stateful DHCPv6 configured but show ipv6 dhcp binding shows no entries even with active clients |
Most common causes: (1) the DHCPv6 pool is not bound to the interface with ipv6 dhcp server, (2) M flag is not set so clients never sent Solicit messages, (3) pool address prefix does not match the interface prefix |
Verify with show ipv6 dhcp interface [int] — confirms pool binding and mode. Check M flag with show ipv6 interface [int] last line. Use debug ipv6 dhcp to see if Solicit messages are arriving |
| DHCPv6 relay not working | Clients on a relayed segment get no address — show ipv6 dhcp interface shows relay mode but clients fail |
The relay destination is unreachable — no route to the DHCPv6 server's address, or the server does not have a pool for this prefix. The relay uses unicast to forward to the server, so routing must work | Verify the relay destination is reachable: ping ipv6 [server-address]. Confirm the DHCPv6 server has a pool covering the client's prefix. Check debug ipv6 dhcp on R1 to see if Relay-Forward is being sent and Relay-Reply is returning |
| Clients ignoring M=1 flag | M flag confirmed set in RA debug but Windows/Linux clients still use SLAAC only | Some client OS implementations (notably some Linux distributions with NetworkManager) do not fully honour the M flag and continue to use SLAAC unless explicitly configured otherwise. This is a client-side behaviour, not a router misconfiguration | Verify the client OS IPv6 stack behaviour. On Linux: check NetworkManager or systemd-networkd DHCPv6 client setting. On Windows: netsh interface ipv6 show interface. As a workaround, suppress SLAAC on the router with no-autoconfig so clients have no choice but to use DHCPv6 |
Key Points & Exam Tips
- IPv6 has three address assignment methods: SLAAC (client self-generates from RA prefix using EUI-64 or privacy extensions), Stateless DHCPv6 (SLAAC for address + DHCPv6 for DNS/options), and Stateful DHCPv6 (server assigns address and all config). The RA flags control which method clients use.
- The three RA flags: M (Managed) = client must get address from DHCPv6; O (Other) = client must get other config (DNS) from DHCPv6; A (Autonomous) = client may use SLAAC. Pure SLAAC: M=0, O=0, A=1. Stateless DHCPv6: M=0, O=1, A=1. Stateful DHCPv6: M=1, O=0, A=0.
ipv6 unicast-routingmust be enabled globally before any RA is sent. Without it, the router will not send Router Advertisements and clients cannot autoconfigure. This is the first thing to check when clients get no IPv6 address.- IOS commands to set RA flags:
ipv6 nd managed-config-flag(sets M=1),ipv6 nd other-config-flag(sets O=1),ipv6 nd prefix [prefix] no-autoconfig(sets A=0 for that prefix). These are entered in interface configuration mode. - A stateless DHCPv6 pool has no
address prefixcommand — it only contains DNS servers, domain names, and other options. A stateful pool hasaddress prefix [prefix/len] lifetime [valid] [preferred]. This is the key syntax difference between the two pool types. show ipv6 dhcp bindingonly shows stateful clients — stateless DHCPv6 clients are invisible in this table by design. If you need to know a host's IPv6 address, only stateful DHCPv6 provides that visibility from the router. SLAAC and stateless clients must be discovered viashow ipv6 neighbors.- IPv6 default gateway is always the router's link-local address — not the global unicast address — regardless of which addressing method is used. The client learns this from the RA source address (the router's link-local). There is no DHCPv6 option for default gateway — this is intentional by design in IPv6.
- DHCPv6 relay uses
ipv6 dhcp relay destination [server-address]on the interface facing clients. This is the IPv6 equivalent of IPv4'sip helper-address. The relay forwards DHCPv6 Solicit messages to the server as unicast Relay-Forward messages. - For stateful DHCPv6, always use
ipv6 nd prefix [prefix] no-autoconfigto suppress SLAAC on the same segment. Without it, clients receive M=1 (use DHCPv6) but A=1 is still set, causing dual-addressing where the client has both a DHCPv6-assigned and a SLAAC-generated address. - On the CCNA exam: know the M and O flag meanings, the three method combinations, the difference between stateless and stateful pool configurations (the
address prefixcommand), that DHCPv6 does not provide the default gateway (RA does), and the commands to verify:show ipv6 dhcp binding,show ipv6 dhcp pool, andshow ipv6 interface.