This article provides configuration guidelines for operating a Cisco IOS® Classic / IOS XE IPv4 DHCP server, with a focus on providing consistent, reliable servic.
Configure a general pool for each subnet that requires DHCP service. The general pool provides IP address and other information to non-server clients, such as guests, wireless phones. In this example, DHCP service is provided for a subnet 10.10.10.0 /24, with 62 addresses reserved for static bindings, and the remaining 193 addresses in a pool (10.10.10.63 through 10.10.10.254.) The lease duration is 6 hours, and Cisco Umbrella DNS server addresses are provided.
router(config)#ip dhcp excluded-address 10.10.10.1 10.10.10.62
ip dhcp pool BIGPOOL
network 10.10.10.0 255.255.255.0
default-router 10.10.10.1
dns-server 208.67.222.222 208.67.220.220
lease 0 6
Note: The DHCP server must have a layer 3 interface (such as an SVI) in the subnet, for it to see the DHCP traffic.
Note: If the Cisco IOS system providing the DHCP service is itself a DHCP client for its network uplink, then you can use the “import all” command under the pool, to bring in the DNS server information, and other options.
With ping-check configured, the DHCP server, before OFFERing a new DHCP address to a client, will attempt to ping that address, to see whether it’s in use by another device. In this example, the server will send up to three ping packets, with a 400 millisecond timeout for each, before sending a new OFFER. This will impose a 1.2 second delay between the DISCOVER and OFFER, so in highly time-critical applications, where address assignment is tightly controlled, you may want to disable this with “ip dhcp ping packets 0”, at increased risk of having multiple devices trying to use the same IP address.
router(config)#ip dhcp ping packets 3
router(config)#ip dhcp ping timeout 400
Note: ping-check caused the DHCP server to suffer from scaling problems prior to the commits of Cisco bug ID CSCdp35267
in Cisco IOS Classic 15.0(1)M and Cisco bug ID CSCua63083
in Cisco IOS XE 16.1.1. Specifically, the Cisco IOSXE 3.xE “Nova” software in older Catalyst switches does not have the scaling enhancement, so those platforms should not be used for large-scale DHCP service.
router(config)#ip dhcp remember
With DHCP remember, after a lease from a pool has expired, the address goes back into the pool, but the server “remembers” the last time it was used, and the last client ID / hardware address to which that IP address was assigned. The address will not be reassigned to a different client until the entry is the least recently used address in the pool. This avoids conflicts and also serves usefully as a historical record of DHCP clients.
The remembered bindings in the pool can be seen with the command “show ip dhcp binding [remembered]”. Example:
router#show ip dhcp binding remembered
Remembered bindings from all pools not associated with VRF:
IP address Client-ID/ Lease expiration Type State Interface
Hardware address/
User name
10.10.10.123 0146.81df.f153.fe Jun 27 2026 01:47 PM Remembered Terminated Vlan102
10.10.10.124 01e2.2e0b.baf5.4a Jul 30 2026 07:50 AM Remembered Terminated Vlan102
10.10.10.125 0146.8f75.339a.66 Jul 25 2026 06:17 AM Remembered Terminated Vlan102
For infrastructure equipment, such as LAN switches and access points, it’s good practice to assign fixed DHCP bindings. Even if the equipment has its IP addresses configured statically, it’s still good to set a static DHCP binding for it, if only to ensure that that address not be used by a different DHCP client.
First, configure an excluded address range for the fixed bindings. All fixed bindings as well as any static address assignments should go into this range.
For each device with a fixed binding, configure a DHCP pool entry like this:
router(config)#ip dhcp pool AARON-X1
host 10.10.10.42 255.255.255.0
client-identifier 01e2.2e0b.baf5.4a
For most devices, the client-identifier will be its interface MAC address, preceded by a 0x01 octet. However, some devices will request a DHCP addresses using only the hardware-address:
router(config)#ip dhcp pool BedroomEchoDot
host 10.10.10.24 255.255.255.0
hardware-address 66.db.f5b3.e85f
To figure out what client-identifier a given client has, you can let it pull an address from the general pool, find out what address it has, and then look in the pool’s binding table:
router#show ip dhcp binding | include Automatic
10.10.10.137 0196.8eac.8963.b4 Aug 04 2026 05:03 PM Automatic
Then delete the automatic binding, so that you can configure the static binding:
router#clear ip dhcp binding 10.10.10.137
Client-specific DHCP options may be configured under the static binding. If the address in the static binding is in the same subnet as a “network” scope in a general pool, then the options from that pool will be provided to the static binding’s client.
For reliable DHCP service across server reloads, it’s very important to back up the dynamic bindings to a database file. Otherwise, after the reload, the server will be unaware of the existing leases that it had handed out, and therefore will likely assign IP addresses that are already in use by other clients. This is so even if ping-check is in effect, as some devices do not reply to ICMP ECHO requests.
router(config)#ip dhcp database flash:/dhcp-bindings.db
When the DHCP server restarts, it will read the DHCP bindings from the backup file.
The DHCP database may be stored on a network server, and can be moved from one DHCP server to another, for a seamless migration, but such uses are outside the scope of this article.
To see how many bindings are assigned/available in a given pool:
router#show ip dhcp pool BIGPOOL
Pool BIGPOOL :
Utilization mark (high/low) : 100 / 0
Subnet size (first/next) : 0 / 0
Total addresses : 254
Leased addresses : 61
Excluded addresses : 62
Remembered addresses : 77
Pending event : none
1 subnet is currently in the pool :
Current index IP address range Leased/Excluded/Total
10.10.10.160 10.10.10.1 - 10.10.10.254 61 / 62 / 254
The number of available addresses will be the Total – (Leased + Excluded), so 123 in this case (254 – (61+62)).
These commands can be used to debug the Cisco IOS DHCP server:
router#debug ip dhcp server packet
router#debug ip dhcp server events
A packet capture of the DHCP transaction can be helpful, for example by running a SPAN or Embedded Packet Capture.
See: Troubleshoot DHCP in Enterprise Networks.
See the Configuring the Cisco IOS XE DHCP Server chapter in the IOS XE IP Addressing Configuration Guide.
| Revision | Publish Date | Comments |
|---|---|---|
1.0 |
06-Aug-2026
|
Initial Release |