Troubleshooting DHCP — Clients Not Getting Addresses
A host that cannot obtain an IP address via DHCP is completely isolated from the network — it cannot reach its gateway, resolve DNS names, or communicate with any other device. DHCP failures are among the most common help-desk escalations in enterprise networks, yet the root causes are almost always one of a small set of well-understood faults: the DHCP server pool is exhausted, a critical address range was over-excluded, the ip helper-address is missing or points to the wrong server, or the DHCP server itself is misconfigured. The DORA handshake (Discover → Offer → Request → Acknowledge) breaks at a predictable point for each of these faults — knowing where it breaks tells you exactly what to fix.
The three primary diagnostic tools for DHCP troubleshooting are
show ip dhcp binding (who has been assigned what
address), show ip dhcp pool (pool utilisation and
available addresses), and debug ip dhcp server events
(live view of the DORA exchange as it happens). Together they
reveal whether the server is receiving Discovers, whether it has
addresses available to offer, whether Requests are completing into
bindings, and whether conflicts are being detected.
This guide assumes Layer 1, Layer 2, and Layer 3 are confirmed healthy. If a client cannot even reach the DHCP server due to a physical or routing fault, fix those first using Troubleshooting Layer 1, Troubleshooting Layer 2, and Troubleshooting Layer 3. For DHCP configuration context see DHCP Server Configuration and DHCP Relay Agent.
1. DHCP — Core Concepts & The DORA Process
The DORA Handshake — Step by Step
Every successful DHCP lease begins with a four-message exchange. Understanding each message's source, destination, and purpose allows you to identify exactly which step failed when a client receives no address:
CLIENT SERVER
│ │
│──── DHCPDISCOVER ────────────────────────────────────────►│
│ Src: 0.0.0.0:68 Dst: 255.255.255.255:67 │
│ Client has no IP — broadcasts to find any DHCP server │
│ │
│◄─── DHCPOFFER ────────────────────────────────────────────│
│ Src: 192.168.10.1:67 Dst: 255.255.255.255:68 │
│ Server offers an IP, subnet mask, gateway, DNS, lease │
│ │
│──── DHCPREQUEST ─────────────────────────────────────────►│
│ Src: 0.0.0.0:68 Dst: 255.255.255.255:67 │
│ Client formally requests the offered address │
│ (still broadcast — notifies other servers of choice) │
│ │
│◄─── DHCPACK ──────────────────────────────────────────────│
│ Src: 192.168.10.1:67 Dst: 255.255.255.255:68 │
│ Server acknowledges — lease is now active │
│ │
── Lease Active ─────────────────────────────────────────────────
│ │
│ At 50% of lease time: client sends unicast DHCPREQUEST │
│ to renew with the same server │
│ │
│ At 87.5% of lease: broadcast DHCPREQUEST to any server │
│ (rebind — original server unreachable) │
│ │
│ DHCPRELEASE: client voluntarily returns the address │
│ DHCPDECLINE: client detected the offered IP is in use │
│ (ARP probe conflict) — triggers conflict log│
DORA Failure Points — What Breaks at Each Step
| DORA Step | Failure Mode | Cause | Diagnostic |
|---|---|---|---|
| Discover never reaches server | Client broadcasts but server receives nothing — client stays at 169.254.x.x (APIPA) | Missing ip helper-address on the router interface facing the client's subnet. DHCP Discover is a broadcast — it cannot cross a router without relay |
show running-config interface [client-facing] — check for ip helper-address |
| Discover received — no Offer sent | Server receives Discover (visible in debug) but sends no Offer | Pool exhausted (no available addresses), all addresses excluded, wrong network statement in pool, or server is excluded from serving that subnet | show ip dhcp pool — check available addresses. debug ip dhcp server events |
| Offer sent — no Request follows | Server sends Offer but client does not Request — client stays at 169.254.x.x | Offer lost in transit (rare), multiple DHCP servers sending competing Offers, client rejects Offer due to wrong options — prevent rogue servers with DHCP Snooping | debug ip dhcp server events — look for OFFER then absence of REQUEST |
| Request received — NAK sent instead of ACK | Client receives a DHCPNAK — rejects its offered address and restarts DORA | Requested address is no longer available (another server ACKed it first), or client is requesting renewal for an address that expired | debug ip dhcp server events — look for DHCPNAK messages |
| ACK sent — client declines | Client sends DHCPDECLINE — address conflict detected | Client ARPs for the offered IP before using it and receives a reply — the address is already in use by a static host | show ip dhcp conflict — lists addresses that triggered DECLINE. show ip dhcp binding |
DHCP Diagnostic Command Reference
| Command | Purpose | Key Output Fields |
|---|---|---|
show ip dhcp binding |
Lists all active leases — IP address, MAC address, lease expiry, and binding type | IP Address, Hardware Address, Lease Expiration, Type (automatic/manual) |
show ip dhcp pool |
Shows pool configuration, total/leased/available address counts, and utilisation | Network, Available/Leased/Excluded counts, Current/Next index |
show ip dhcp conflict |
Lists IP addresses that triggered a DHCPDECLINE — the server will not re-offer these until cleared | IP Address, Detection Method (ping/gratuitous ARP), Detection Time |
show ip dhcp server statistics |
Counts of each message type sent and received — Discovers, Offers, Requests, ACKs, NAKs, Declines, Releases | Message counters — high NAK or Decline counts indicate address conflict issues |
debug ip dhcp server events |
Live event trace — shows each Discover received, Offer sent, Request received, ACK/NAK sent in real time | DHCPDISCOVER, DHCPOFFER, DHCPREQUEST, DHCPACK, DHCPNAK, DHCPDECLINE events with client MAC and offered IP |
debug ip dhcp server packet |
Full packet decode — more verbose than events, shows option fields | All DHCP option fields (option 53 type, option 54 server ID, option 51 lease time, option 3 gateway, option 6 DNS) |
show running-config | section dhcp |
Shows the complete DHCP server configuration — pools, excluded ranges, options | ip dhcp pool, network, default-router, dns-server, lease, domain-name statements |
2. Lab Topology & Scenario
This lab covers six DHCP fault scenarios across a two-site topology where NetsTuts_R1 acts as both the DHCP server for the local VLAN 10 segment and the DHCP relay agent for VLAN 20 and VLAN 30, which receive addresses from a centralised DHCP server (NetsTuts_SRV1):
VLAN 10 — 192.168.10.0/24 (R1 is DHCP server)
[PC1..PC30]──SW1──Gi0/1──NetsTuts_R1
│ Gi0/2
│──── VLAN 20 — 192.168.20.0/24
│ [PC31..PC60] — relay to SRV1
│ Gi0/3
│──── VLAN 30 — 192.168.30.0/24
│ [PC61..PC90] — relay to SRV1
│ Gi0/0
10.0.12.0/30 WAN link
│
NetsTuts_SRV1 (192.168.99.10)
DHCP Server for VLAN 20 and VLAN 30
R1 DHCP Pool (VLAN 10):
Network: 192.168.10.0/24
Excluded: 192.168.10.1 – 192.168.10.10 (routers, printers, servers)
Range: 192.168.10.11 – 192.168.10.254 (244 addresses)
Default router: 192.168.10.1
DNS: 8.8.8.8
Lease: 1 day
SRV1 DHCP Pool (VLAN 20):
Network: 192.168.20.0/24
Excluded: 192.168.20.1 – 192.168.20.20
Range: 192.168.20.21 – 192.168.20.254
SRV1 DHCP Pool (VLAN 30):
Network: 192.168.30.0/24
Excluded: 192.168.30.1 – 192.168.30.10
Range: 192.168.30.11 – 192.168.30.254
Fault Scenarios:
Scenario 1 — PC1 gets 169.254.x.x (VLAN 10 — helper-address not needed but pool misconfigured)
Scenario 2 — New clients in VLAN 10 get no address (pool exhausted)
Scenario 3 — Clients in VLAN 10 get wrong addresses (over-excluded range)
Scenario 4 — PC31 gets 169.254.x.x (VLAN 20 — ip helper-address missing on R1)
Scenario 5 — VLAN 30 clients get 169.254.x.x (helper-address points to wrong IP)
Scenario 6 — Clients repeatedly getting and losing addresses (DHCP conflicts)
| Scenario | Affected Subnet | Symptom | Root Cause |
|---|---|---|---|
| 1 | VLAN 10 | PC1 gets 169.254.x.x — no DHCP offer received | Pool network statement uses wrong subnet mask |
| 2 | VLAN 10 | New clients get no address after existing clients renew | Pool exhausted — all 244 addresses are leased |
| 3 | VLAN 10 | Only 4 addresses available despite /24 pool | Excluded range accidentally covers nearly the entire pool |
| 4 | VLAN 20 | All VLAN 20 clients get 169.254.x.x | ip helper-address missing on R1's VLAN 20 interface |
| 5 | VLAN 30 | All VLAN 30 clients get 169.254.x.x | ip helper-address points to 192.168.99.11 (wrong IP — SRV1 is .10) |
| 6 | VLAN 10 | Clients get addresses then immediately lose them — repeated DHCPDECLINE in debug | Static hosts using IPs inside the DHCP pool range cause address conflicts |
3. Scenario 1 — Pool Network Statement Misconfigured
PC1 in VLAN 10 shows a 169.254.x.x address — DHCP failed. R1 is the DHCP server for VLAN 10 and the client is on the same router interface (no relay needed). Layer 1 and 2 are confirmed healthy. The DHCP service is running on R1.
Step 1 — Confirm the Symptom and Check Bindings
NetsTuts_R1#show ip dhcp binding Bindings from all pools not associated with VRF: IP address Client-ID/ Hardware address Lease expiration Type ! ── Empty — no bindings at all ──────────────────────────────────
show ip dhcp binding when clients are
actively requesting addresses means the server is not completing
any DORA exchanges. This rules out pool exhaustion (which would
show many bindings) and points to a problem earlier in the DORA
process — either the server is not receiving Discovers, or it is
receiving them but cannot match them to a pool.
Step 2 — Check the Pool Configuration
NetsTuts_R1#show running-config | section dhcp ip dhcp excluded-address 192.168.10.1 192.168.10.10 ! ip dhcp pool VLAN10 network 192.168.10.0 255.255.0.0 default-router 192.168.10.1 dns-server 8.8.8.8 lease 1
network 192.168.10.0 255.255.0.0 — a /16 mask.
The actual subnet is 192.168.10.0/24, which requires
255.255.255.0. With a /16 mask, the pool covers
192.168.0.0 through 192.168.255.255. When R1 receives a DHCP
Discover from a client on 192.168.10.x, it looks for a pool
whose network statement matches the client's source subnet.
Because the Discover arrives on Gi0/1 (192.168.10.1/24), IOS
looks for a pool matching 192.168.10.0/24 — but the pool is
defined as 192.168.10.0/16. The mask mismatch means IOS cannot
correctly match the pool to the client's subnet, and no Offer
is sent.
Step 3 — Use debug to Confirm
NetsTuts_R1#debug ip dhcp server events DHCP server event debugging is on ! ── Trigger a DHCP request from PC1 (release/renew) ───────────── DHCPD: DHCPDISCOVER received from client 0063.6973.636f on interface Gi0/1 DHCPD: No subnet for 192.168.10.0 with mask 255.255.255.0 DHCPD: No pool configured for interface 192.168.10.1 DHCPD: Sending DHCPNAK to client 0063.6973.636f NetsTuts_R1#undebug all
No subnet for 192.168.10.0 with mask
255.255.255.0 is the exact confirmation — IOS is looking
for a pool matching /24 but the only pool defined uses /16. The
server cannot match the incoming Discover to any valid pool and
sends a DHCPNAK. Always run undebug all immediately
after capturing the needed output. On a busy router,
debug ip dhcp server events generates one line per
DHCP message — manageable. Avoid
debug ip dhcp server packet on production devices
as it is significantly more verbose.
Step 4 — Fix the Pool Network Statement
! ── Remove the existing pool and recreate with correct mask ────── NetsTuts_R1(config)#no ip dhcp pool VLAN10 NetsTuts_R1(config)#ip dhcp pool VLAN10 NetsTuts_R1(config-dhcp)#network 192.168.10.0 255.255.255.0 NetsTuts_R1(config-dhcp)#default-router 192.168.10.1 NetsTuts_R1(config-dhcp)#dns-server 8.8.8.8 NetsTuts_R1(config-dhcp)#lease 1 NetsTuts_R1(config-dhcp)#exit ! ── Verify pool is correctly defined ───────────────────────────── NetsTuts_R1#show ip dhcp pool Pool VLAN10 : Utilization mark (high/low) : 100 / 0 Subnet size (first/next) : 0 / 0 Total addresses : 254 Leased addresses : 0 Pending event : none 1 subnet is currently in the subnet pool Range of addresses : 192.168.10.1 – 192.168.10.254 Current index : 192.168.10.11
ipconfig /release then
ipconfig /renew on Windows.
4. Scenario 2 — Pool Exhaustion
The VLAN 10 network has been running for months without issues. Suddenly, new devices being connected to the network — a new batch of laptops — cannot obtain addresses. Existing devices retain their addresses. The pool configuration has not changed.
Step 1 — Check Pool Utilisation
NetsTuts_R1#show ip dhcp pool Pool VLAN10 : Utilization mark (high/low) : 100 / 0 Subnet size (first/next) : 0 / 0 Total addresses : 254 Leased addresses : 244 Pending event : none 1 subnet is currently in the subnet pool Range of addresses : 192.168.10.1 – 192.168.10.254 Current index : 192.168.10.255
Step 2 — Identify Who Has Leases
NetsTuts_R1#show ip dhcp binding | include 192.168.10 IP address Client-ID/ Hardware address Lease expiration Type 192.168.10.11 0100.1a2b.3c4d.5e Mar 08 2026 08:15 AM Automatic 192.168.10.12 0100.aabb.ccdd.ee12 Mar 08 2026 09:22 AM Automatic 192.168.10.13 0100.1234.5678.9abc Mar 08 2026 07:40 AM Automatic ... 192.168.10.254 0100.ffee.ddcc.bb11 Mar 08 2026 11:05 AM Automatic ! ── Count total bindings ───────────────────────────────────────── NetsTuts_R1#show ip dhcp binding | count 192.168.10 244
Step 3 — Immediate Relief and Long-Term Fix
! ── Option A: Clear stale bindings for specific offline hosts ──── NetsTuts_R1#clear ip dhcp binding 192.168.10.150 NetsTuts_R1#clear ip dhcp binding 192.168.10.151 ! ── Option B: Clear ALL bindings (use during maintenance only) ─── NetsTuts_R1#clear ip dhcp binding * ! ── Warning: This forces ALL clients to re-request addresses. ! Active sessions will drop briefly during DORA re-exchange. ! ── Long-term fix 1: Reduce lease time ────────────────────────── NetsTuts_R1(config)#ip dhcp pool VLAN10 NetsTuts_R1(config-dhcp)#lease 0 8 ! ^^^^ 0 days, 8 hours NetsTuts_R1(config-dhcp)#exit ! ── Long-term fix 2: Expand the pool (if subnet allows) ────────── ! ── e.g., use a /23 supernet to double available addresses ──────── ! ── Requires IP addressing plan change ─────────────────────────── ! ── Long-term fix 3: Add a second DHCP pool / subnet ───────────── ! ── Assign a new VLAN for overflow devices ──────────────────────── ! ── Verify addresses now available ─────────────────────────────── NetsTuts_R1#show ip dhcp pool Total addresses : 254 Leased addresses : 180 Pending event : none Current index : 192.168.10.191
show ip dhcp server statistics — Message Counter Analysis
NetsTuts_R1#show ip dhcp server statistics
Memory usage : 42389
Address pools : 1
Database agents : 0
Automatic bindings : 244
Manual bindings : 0
Expired bindings : 12
Malformed messages : 0
Received Sent
Messages
BOOTREQUEST 2891
DHCPDISCOVER 2891
DHCPOFFER 2647 ← Fewer Offers than Discovers
DHCPREQUEST 2647
DHCPACK 2647
DHCPNAK 244 ← NAKs sent when pool was full
DHCPDECLINE 0
DHCPRELEASE 388
DHCPINFORM 0
5. Scenario 3 — Over-Excluded Address Range
After a network audit, only four DHCP addresses appear to be available in the VLAN 10 pool despite it being a /24. All new clients beyond the existing four can receive addresses get 169.254.x.x. The router was recently reconfigured by a junior engineer who was asked to "reserve the first 250 addresses for static assignment."
Step 1 — Check the Exclusion Range
NetsTuts_R1#show running-config | section dhcp ip dhcp excluded-address 192.168.10.1 192.168.10.10 ip dhcp excluded-address 192.168.10.11 192.168.10.250 ! ip dhcp pool VLAN10 network 192.168.10.0 255.255.255.0 default-router 192.168.10.1 dns-server 8.8.8.8 lease 1
Step 2 — Confirm with show ip dhcp pool
NetsTuts_R1#show ip dhcp pool Pool VLAN10 : Total addresses : 254 Leased addresses : 4 Pending event : none Range of addresses : 192.168.10.1 – 192.168.10.254 Current index : 192.168.10.255
show ip dhcp pool does not explicitly
show the count of excluded addresses — the available count
must be calculated: total (254) minus excluded (250) minus
leased (4) = 0 remaining.
Step 3 — Fix the Exclusion Range
! ── Remove the overly broad exclusion ──────────────────────────── NetsTuts_R1(config)#no ip dhcp excluded-address 192.168.10.11 192.168.10.250 ! ── Add correct exclusion for static devices only ───────────────── ! ── Example: reserve .1-.10 (already done) and .200-.254 for ───── ! ── servers and printers with static IPs in upper range ────────── NetsTuts_R1(config)#ip dhcp excluded-address 192.168.10.200 192.168.10.254 ! ── Verify exclusions and pool ──────────────────────────────────── NetsTuts_R1#show running-config | section dhcp ip dhcp excluded-address 192.168.10.1 192.168.10.10 ip dhcp excluded-address 192.168.10.200 192.168.10.254 NetsTuts_R1#show ip dhcp pool Total addresses : 254 Leased addresses : 4 Pending event : none Current index : 192.168.10.12 ! ── Available: 254 - 10 (1-10) - 55 (200-254) - 4 (leased) = 185 ─
DHCP Address Planning Best Practices
| Address Range | Purpose | Configuration |
|---|---|---|
| 192.168.10.1 – 192.168.10.10 | Network infrastructure — router interfaces, L3 switch SVIs, management IPs | ip dhcp excluded-address 192.168.10.1 192.168.10.10 |
| 192.168.10.11 – 192.168.10.199 | DHCP pool — dynamically assigned to workstations, laptops, phones | Pool range (no exclusion needed in this range) |
| 192.168.10.200 – 192.168.10.254 | Static devices — servers, printers, IP cameras, APs with static IPs | ip dhcp excluded-address 192.168.10.200 192.168.10.254 |
6. Scenario 4 — Missing ip helper-address (DHCP Relay)
All clients in VLAN 20 (192.168.20.0/24) are showing 169.254.x.x addresses. The DHCP server for VLAN 20 is SRV1 at 192.168.99.10, reached through R1. VLAN 10 clients (served by R1 locally) are getting addresses without issues. VLAN 20 is a separate subnet on R1's Gi0/2 interface.
Why ip helper-address is Needed
DHCP Discovers are Layer 2 broadcasts (destination 255.255.255.255).
Routers do not forward broadcasts between subnets by default.
Without ip helper-address:
PC31 sends DHCPDISCOVER → 255.255.255.255 (broadcast)
R1 receives it on Gi0/2 (192.168.20.1) — drops it silently
SRV1 never receives the Discover → never sends an Offer
PC31 waits, retries 4 times, assigns 169.254.x.x (APIPA)
With ip helper-address 192.168.99.10 on Gi0/2:
PC31 sends DHCPDISCOVER → 255.255.255.255 (broadcast)
R1 receives it on Gi0/2 — RELAY AGENT kicks in:
- Changes source IP to R1's Gi0/2 address (192.168.20.1)
- Changes destination to 192.168.99.10 (unicast to SRV1)
- Adds Option 82 (relay agent info) including the
giaddr field = 192.168.20.1 (tells server which subnet)
SRV1 receives the unicast Discover, looks up which pool
matches giaddr 192.168.20.1 → selects VLAN20 pool
SRV1 unicasts the Offer back to R1
R1 relays the Offer back to PC31 as a broadcast
Step 1 — Confirm Missing Helper on R1
NetsTuts_R1#show running-config interface GigabitEthernet0/2 Building configuration... interface GigabitEthernet0/2 ip address 192.168.20.1 255.255.255.0 no shutdown ! ! ── No ip helper-address — broadcasts will not be relayed ──────── NetsTuts_R1#show running-config interface GigabitEthernet0/3 Building configuration... interface GigabitEthernet0/3 ip address 192.168.30.1 255.255.255.0 ip helper-address 192.168.99.10 no shutdown ! ! ── VLAN 30 has helper-address — VLAN 20 does not ────────────────
ip helper-address on Gi0/2 (the
VLAN 20 interface) is immediately visible in the running config.
VLAN 30's Gi0/3 shows the correct helper-address — this makes
VLAN 20 clearly the outlier. The DHCP server SRV1 never receives
any Discovers from VLAN 20 clients because R1 drops them at the
router boundary. This is confirmed by the fact that VLAN 10
(local pool on R1) and VLAN 30 (correct helper) both work.
Step 2 — Confirm with debug on R1
NetsTuts_R1#debug ip dhcp server events
! ── PC31 sends a Discover — watch what R1 does ───────────────────
DHCPD: DHCPDISCOVER received from client 0100.aabb.1234.5678
on interface GigabitEthernet0/2
DHCPD: No subnet for 192.168.20.0 with mask 255.255.255.0
DHCPD: No relay configured for interface 192.168.20.1
NetsTuts_R1#undebug all
No relay configured for interface
192.168.20.1 is the explicit confirmation — R1 received
the Discover but has no relay configuration for that interface,
so it cannot forward it to SRV1. Note that R1 also shows
"No subnet for 192.168.20.0" because R1 itself has no DHCP
pool for 192.168.20.0 — it is expected to relay, not serve.
Without the helper, the Discover goes nowhere.
Step 3 — Add the Helper Address
NetsTuts_R1(config)#interface GigabitEthernet0/2
NetsTuts_R1(config-if)#ip helper-address 192.168.99.10
NetsTuts_R1(config-if)#exit
! ── Verify ────────────────────────────────────────────────────────
NetsTuts_R1#show running-config interface GigabitEthernet0/2
interface GigabitEthernet0/2
ip address 192.168.20.1 255.255.255.0
ip helper-address 192.168.99.10
no shutdown
! ── Confirm DHCP relay is forwarding ─────────────────────────────
NetsTuts_R1#debug ip dhcp server events
DHCPD: DHCPDISCOVER received from client 0100.aabb.1234.5678
on interface GigabitEthernet0/2
DHCPD: Forwarding DHCPDISCOVER to 192.168.99.10
DHCPD: DHCPOFFER received from server 192.168.99.10
DHCPD: Forwarding DHCPOFFER to client 0100.aabb.1234.5678
NetsTuts_R1#undebug all
ip helper-address command is per-interface —
it must be configured on every router interface that faces
a client subnet where the DHCP server is not local.
Multiple helper-addresses can be configured on a single
interface to relay to multiple DHCP servers simultaneously
(for redundancy).
ip helper-address — What It Forwards
By default, ip helper-address relays eight UDP
broadcast protocols — not just DHCP. Understanding the full
list is important for environments where other broadcast-based
services are also in use:
| UDP Port | Protocol | Notes |
|---|---|---|
| 67/68 | DHCP / BOOTP | Primary use case — always relayed |
| 69 | TFTP | Legacy — relayed by default but rarely needed |
| 37 | Time (RFC 868) | Legacy time protocol — NTP preferred instead |
| 49 | TACACS | Legacy authentication — TACACS+ uses TCP |
| 53 | DNS | DNS queries broadcast — relayed to helper IP |
| 137 | NetBIOS Name Service | Windows name resolution broadcast |
| 138 | NetBIOS Datagram | Windows broadcast datagram |
| 9 | Discard (Wake-on-LAN) | Magic packet forwarding |
7. Scenario 5 — Wrong Helper Address
VLAN 30 clients (192.168.30.0/24) are all showing 169.254.x.x.
The interface Gi0/3 on R1 does have an
ip helper-address configured — so the relay is
set up. SRV1 (the correct DHCP server) is at 192.168.99.10.
Step 1 — Inspect the Helper Address
NetsTuts_R1#show running-config interface GigabitEthernet0/3 interface GigabitEthernet0/3 ip address 192.168.30.1 255.255.255.0 ip helper-address 192.168.99.11 no shutdown ! ── SRV1 is at 192.168.99.10 — helper points to .11 (wrong) ─────
Step 2 — Confirm with debug
NetsTuts_R1#debug ip dhcp server events DHCPD: DHCPDISCOVER received on interface GigabitEthernet0/3 DHCPD: Forwarding DHCPDISCOVER to 192.168.99.11 ! ── No DHCPOFFER ever follows — 192.168.99.11 does not respond ─── ! ── After timeout, client retries — same pattern repeats ───────── NetsTuts_R1#undebug all ! ── Verify 192.168.99.11 is unreachable ────────────────────────── NetsTuts_R1#ping 192.168.99.11 Sending 5, 100-byte ICMP Echos to 192.168.99.11: ..... Success rate is 0 percent (0/5) NetsTuts_R1#ping 192.168.99.10 Sending 5, 100-byte ICMP Echos to 192.168.99.10: !!!!! Success rate is 100 percent (5/5)
Step 3 — Fix the Helper Address
NetsTuts_R1(config)#interface GigabitEthernet0/3 NetsTuts_R1(config-if)#no ip helper-address 192.168.99.11 NetsTuts_R1(config-if)#ip helper-address 192.168.99.10 NetsTuts_R1(config-if)#exit ! ── Verify ──────────────────────────────────────────────────────── NetsTuts_R1#show running-config interface GigabitEthernet0/3 interface GigabitEthernet0/3 ip address 192.168.30.1 255.255.255.0 ip helper-address 192.168.99.10 no shutdown ! ── Test: Trigger DHCP on a VLAN 30 client ─────────────────────── ! ── On PC61: ipconfig /release then ipconfig /renew ────────────── ! ── Expected: PC61 receives 192.168.30.x address ───────────────── NetsTuts_R1#show ip dhcp binding | include 192.168.30 192.168.30.11 0100.beef.cafe.0061 Mar 08 2026 14:30 PM Automatic
no ip helper-address [old-ip] with the full
incorrect IP — using no ip helper-address alone
without specifying the address removes all helper addresses
on that interface, which may be unintended if multiple helpers
are configured.
8. Scenario 6 — DHCP Address Conflicts
VLAN 10 clients are intermittently losing their DHCP-assigned addresses shortly after receiving them. Syslog shows repeated DHCPDECLINE messages. Some clients cycle between 169.254.x.x and a DHCP address every few minutes. Investigation reveals that several printers and servers in VLAN 10 were configured with static IPs inside the DHCP pool range.
Step 1 — Observe the Decline Pattern in debug
NetsTuts_R1#debug ip dhcp server events DHCPD: DHCPDISCOVER from client 0100.1111.2222.3333 on Gi0/1 DHCPD: Sending DHCPOFFER of 192.168.10.25 to client DHCPD: DHCPREQUEST for 192.168.10.25 from client DHCPD: Sending DHCPACK of 192.168.10.25 to client DHCPD: DHCPDECLINE of 192.168.10.25 from client ! ^^^^^^^^^^^^^^^^ Client ARPed for .25, got a reply from the ! printer at .25 — conflict detected, client declines address DHCPD: Adding 192.168.10.25 to conflict table DHCPD: DHCPDISCOVER from client 0100.1111.2222.3333 on Gi0/1 DHCPD: Sending DHCPOFFER of 192.168.10.30 to client ! ── Pattern repeats as each conflicted address is offered ───────── NetsTuts_R1#undebug all
Step 2 — Check the Conflict Table
NetsTuts_R1#show ip dhcp conflict IP address Detection method Detection time VRF 192.168.10.25 Gratuitous ARP Mar 07 2026 10:15:22 192.168.10.30 Gratuitous ARP Mar 07 2026 10:17:44 192.168.10.45 Gratuitous ARP Mar 07 2026 10:22:09 192.168.10.50 Ping Mar 07 2026 09:55:01 192.168.10.51 Ping Mar 07 2026 09:55:14
Step 3 — Identify the Conflicting Static Hosts
! ── ARP table shows who has the conflicted addresses ─────────────
NetsTuts_R1#show arp | include 192.168.10.25
Internet 192.168.10.25 5 00aa.bb11.2233 ARPA GigabitEthernet0/1
NetsTuts_R1#show arp | include 192.168.10.30
Internet 192.168.10.30 3 00aa.bb11.4455 ARPA GigabitEthernet0/1
! ── Use MAC addresses to identify the devices ─────────────────────
! ── Check switch MAC address table ───────────────────────────────
NetsTuts_SW1#show mac address-table address 00aa.bb11.2233
Mac Address Table
-------------------------------------------
Vlan Mac Address Type Ports
---- ----------- ---- -----
10 00aa.bb11.2233 STATIC Fa0/12 ← Printer on Fa0/12 with static .25
Step 4 — Fix: Exclude Conflicted Addresses
! ── Option A: Exclude all static device IPs from the DHCP pool ── NetsTuts_R1(config)#ip dhcp excluded-address 192.168.10.25 NetsTuts_R1(config)#ip dhcp excluded-address 192.168.10.30 NetsTuts_R1(config)#ip dhcp excluded-address 192.168.10.45 NetsTuts_R1(config)#ip dhcp excluded-address 192.168.10.50 NetsTuts_R1(config)#ip dhcp excluded-address 192.168.10.51 ! ── Option B: Move static devices to the excluded upper range ───── ! ── Reconfigure printer from 192.168.10.25 to 192.168.10.210 ───── ! ── (in the excluded 192.168.10.200-254 range) ─────────────────── ! ── Clear the conflict table so those addresses can be used ─────── NetsTuts_R1#clear ip dhcp conflict * ! ── Verify conflict table is empty ─────────────────────────────── NetsTuts_R1#show ip dhcp conflict ! ── Empty ───────────────────────────────────────────────────────── ! ── Verify no conflicted addresses in binding ──────────────────── NetsTuts_R1#show ip dhcp binding | include 192.168.10 192.168.10.11 0100.1111.2222.3333 Mar 08 2026 14:00 Automatic 192.168.10.12 0100.4444.5555.6666 Mar 08 2026 14:05 Automatic
clear ip dhcp conflict * clears the entire
conflict table — the server can now re-offer those addresses
(after they have been properly excluded or the static devices
have been moved). Always clear conflicts after fixing the
underlying cause, not before — clearing without fixing means
the conflict will reoccur immediately when the server offers
the address again. Option B (moving static devices to the
excluded upper range) is the cleaner long-term solution because
it eliminates the problem at its source and requires no
per-address exclusions.
9. Full Diagnostic Command Reference & Decision Tree
show ip dhcp binding — Complete Field Guide
NetsTuts_R1#show ip dhcp binding Bindings from all pools not associated with VRF: IP address Client-ID/ Hardware address Lease expiration Type 192.168.10.11 0100.1a2b.3c4d.5e6f Mar 08 2026 08:00 AM Automatic 192.168.10.12 0100.aabb.ccdd.ee12 Mar 08 2026 09:22 AM Automatic 192.168.10.13 0100.1234.5678.9abc Infinite Manual ! ── Field meanings ─────────────────────────────────────────────── ! IP address : Address currently leased to this client ! Client-ID : 01 + MAC address (01 = Ethernet ARP type) ! or DHCP client-identifier option 61 string ! Lease expiration : When this binding expires — "Infinite" = manual ! Type : Automatic = DHCP pool assigned ! Manual = Static DHCP binding (ip dhcp pool / ! host command) ! ── Useful filters ──────────────────────────────────────────────── NetsTuts_R1#show ip dhcp binding | count ! total leases NetsTuts_R1#show ip dhcp binding | include [vlan] ! filter by subnet NetsTuts_R1#show ip dhcp binding | include Infinite ! manual bindings only
debug ip dhcp server events — Annotated Output
NetsTuts_R1#debug ip dhcp server events
! ── Successful DORA ───────────────────────────────────────────────
DHCPD: DHCPDISCOVER received from client 0100.cafe.babe.0001 ← D
on interface GigabitEthernet0/1
DHCPD: Sending DHCPOFFER of 192.168.10.15 to client ← O
DHCPD: DHCPREQUEST for 192.168.10.15 from client ← R
DHCPD: Sending DHCPACK of 192.168.10.15 to client 0100.cafe.babe.0001 ← A
! ── Pool exhaustion ───────────────────────────────────────────────
DHCPD: DHCPDISCOVER received from client 0100.dead.beef.0002
DHCPD: There are no addresses available in pool VLAN10
! ── Wrong network statement ───────────────────────────────────────
DHCPD: DHCPDISCOVER received from client 0100.1234.5678.9999
DHCPD: No subnet for 192.168.10.0 with mask 255.255.255.0
DHCPD: No pool configured for interface 192.168.10.1
! ── Missing relay ─────────────────────────────────────────────────
DHCPD: DHCPDISCOVER received from client 0100.aabb.1234.5678
on interface GigabitEthernet0/2
DHCPD: No relay configured for interface 192.168.20.1
! ── Address conflict ──────────────────────────────────────────────
DHCPD: DHCPDECLINE of 192.168.10.25 from client
DHCPD: Adding 192.168.10.25 to conflict table
! ── Relay working ─────────────────────────────────────────────────
DHCPD: Forwarding DHCPDISCOVER to 192.168.99.10
DHCPD: DHCPOFFER received from server 192.168.99.10
NetsTuts_R1#undebug all
DHCP Troubleshooting Decision Tree
| Symptom | First Command | Key Finding | Fix |
|---|---|---|---|
| Client gets 169.254.x.x — same subnet as server | show ip dhcp pool |
Pool misconfigured (wrong mask) or all addresses excluded | Fix network statement mask or adjust ip dhcp excluded-address |
| Client gets 169.254.x.x — different subnet from server | show run interface [client-facing] |
Missing ip helper-address |
Add ip helper-address [server-ip] to the client-facing interface |
| Relay configured but still 169.254.x.x | ping [helper-ip] from router + debug ip dhcp server events |
Wrong helper IP, server unreachable, or server has no pool for that subnet | Correct helper IP; fix routing to server using show ip route; add matching pool on server |
| Some clients get addresses, new ones cannot | show ip dhcp pool |
Leased count equals total available — pool exhausted | clear ip dhcp binding * (maintenance); reduce lease time; expand pool |
| Very few addresses available despite /24 pool | show run | section dhcp |
Over-broad ip dhcp excluded-address range |
no ip dhcp excluded-address [start] [end] for the incorrect range, add correct narrower exclusion |
| Clients get addresses then immediately lose them | debug ip dhcp server events |
DHCPDECLINE messages — address conflict | show ip dhcp conflict → identify static hosts → exclude those IPs or move static devices |
| Clients get addresses from wrong pool/subnet | show ip dhcp binding + show run | section dhcp |
Pool network statement matches wrong subnet, or rogue DHCP server on segment | Fix pool network statement; use debug ip dhcp server events to find rogue server MAC; deploy DHCP Snooping to block rogue servers |
| Specific client never gets address (others fine) | show ip dhcp binding + debug ip dhcp server events |
Client's MAC in conflict table, or client has static IP configured despite requesting DHCP | clear ip dhcp conflict [ip]; check client NIC settings for static IP override |
| DHCP works but clients cannot reach gateway | show ip dhcp binding + client ipconfig |
Wrong default-router in pool, or no default-router configured |
Add/correct default-router [gateway-ip] in the DHCP pool |
| DHCP works but DNS resolution fails | show run | section dhcp |
Missing or wrong dns-server statement in pool |
Add/correct dns-server [dns-ip] in the DHCP pool |
Key Points & Exam Tips
- A client showing 169.254.x.x (APIPA on Windows) or no address means DORA failed — begin diagnosis at the first step where the process breaks: Discover not reaching the server, no Offer returned, or DHCPDECLINE after ACK.
ip helper-addressis required on every router interface facing a client subnet when the DHCP server is on a different subnet. DHCP Discovers are broadcasts — routers block them without the relay configured.- The
ip helper-addressrelays eight UDP broadcast protocols by default — not just DHCP (ports 67/68). Useno ip forward-protocol udp [port]to disable specific protocols from being relayed if needed. show ip dhcp poolshows total, leased, and available address counts — the fastest way to confirm pool exhaustion. If leased equals total-minus-excluded, the pool is full.- When adding VLANs to an existing exclusion list, always use separate exclusion ranges at the top and bottom of the /24 — never a single exclusion that spans the middle of the pool.
- DHCPDECLINE means the client detected a conflict — the server offered an address that is already in use by a static device. The server adds that address to its conflict table and will not re-offer it until cleared with
clear ip dhcp conflict [ip]orclear ip dhcp conflict *. - The Cisco IOS DHCP server pings an address before offering it as a proactive conflict check — if a ping reply comes back, the address is added to the conflict table instead of being offered.
debug ip dhcp server eventsis the most useful DHCP debug — it shows each DORA step in real time without the excessive verbosity ofdebug ip dhcp server packet. Always follow withundebug all. Persistent DHCP event logging without debug can be achieved via Syslog.- Multiple
ip helper-addressstatements can be configured on one interface for DHCP redundancy — the Discover is forwarded to each helper IP simultaneously and the client uses the first Offer received. - On the CCNA exam: know the DORA message sequence and what each message uses as source/destination IPs, the purpose and placement of
ip helper-address, how to readshow ip dhcp poolfor exhaustion, and what DHCPDECLINE indicates.
dns-server option in the DHCP pool is missing or
incorrect. See DNS for an overview
of how DNS and DHCP work together. For DHCP server configuration from scratch see
DHCP Server Configuration.
For relay agent configuration detail see
DHCP Relay Agent.
For access control issues after DHCP succeeds see
Extended ACL Configuration.
For Layer 3 issues that prevent relayed DHCP from reaching the server see
Troubleshooting Layer 3.