DHCP Configuration
DHCP (Dynamic Host Configuration Protocol) automatically assigns IP addresses, subnet masks, default gateways, and DNS servers to clients on a network. For Ubuntu servers, DHCP is typically used in development/test environments while production servers use static IPs. However, understanding how DHCP works and how to set up a DHCP server is an essential networking skill for managing lab environments, infrastructure networks, and bare-metal provisioning.
How DHCP works
DHCP DORA process:
Client ──[DISCOVER]──────────────→ Broadcast (255.255.255.255)
Server ──[OFFER: 192.168.1.50]──→ Client
Client ──[REQUEST: I want .50]──→ Broadcast
Server ──[ACK: .50 is yours]────→ Client
Client now has:
IP: 192.168.1.50
Mask: 255.255.255.0
Gateway: 192.168.1.1
DNS: 8.8.8.8
Lease time: 86400 seconds (24 hours)Configuring an interface for DHCP
# In Netplan, DHCP is the simplest configuration:
# /etc/netplan/00-installer-config.yaml
network:
version: 2
ethernets:
ens3:
dhcp4: true # Enable IPv4 DHCP
dhcp6: false # Disable IPv6 DHCP (optional)
dhcp4-overrides:
use-dns: true # Accept DNS from DHCP
use-routes: true # Accept routes from DHCP
sudo netplan apply
DHCP lease files
# systemd-networkd stores DHCP lease info here:
ls /run/systemd/netif/leases/
# View the current lease
cat /run/systemd/netif/leases/2 # 2 = interface index for ens3
# dhclient stores leases here (if using dhclient):
cat /var/lib/dhcp/dhclient.leases
Lease file contents (key fields)
ADDRESS=192.168.1.50
NETMASK=255.255.255.0
ROUTER=192.168.1.1
DNS=8.8.8.8 1.1.1.1
LEASETIME=86400
Renewing and releasing leases
# Force DHCP renewal via networkctl (systemd-networkd)
sudo networkctl renew ens3
# Via dhclient (if using dhclient):
sudo dhclient -r ens3 # Release current lease
sudo dhclient ens3 # Request new lease
# If you changed DHCP server configuration:
sudo networkctl down ens3
sudo networkctl up ens3
Setting up isc-dhcp-server
sudo apt install -y isc-dhcp-server
# Configure the DHCP server
sudo nano /etc/dhcp/dhcpd.conf
/etc/dhcp/dhcpd.conf — basic configuration
option domain-name "lab.local";
option domain-name-servers 8.8.8.8, 1.1.1.1;
default-lease-time 86400; # 24 hours
max-lease-time 604800; # 7 days
# Which interface to listen on:
# /etc/default/isc-dhcp-server: INTERFACESv4="ens3"
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.50 192.168.1.200; # IP pool
option routers 192.168.1.1; # Default gateway
option subnet-mask 255.255.255.0;
}
# Specify which interface to listen on
sudo nano /etc/default/isc-dhcp-server
# Set: INTERFACESv4="ens3"
sudo systemctl enable --now isc-dhcp-server
sudo systemctl status isc-dhcp-server
# View current leases
cat /var/lib/dhcpd/dhcpd.leases
Static DHCP reservations
# Assign a fixed IP to a specific MAC address
# Add inside /etc/dhcp/dhcpd.conf:
host server01 {
hardware ethernet 52:54:00:12:34:56; # Client's MAC address
fixed-address 192.168.1.10; # Always gets this IP
option host-name "server01";
}
host printer01 {
hardware ethernet 00:11:22:33:44:55;
fixed-address 192.168.1.20;
}
# Reload DHCP server after config changes
sudo systemctl reload isc-dhcp-server # If supported
sudo systemctl restart isc-dhcp-server # Or full restart
Conclusion
For Ubuntu servers, configure DHCP in Netplan with dhcp4: true. For running a DHCP server on a local network, install isc-dhcp-server and configure the subnet block in /etc/dhcp/dhcpd.conf. Static DHCP reservations (fixed IP by MAC address) are better than hardcoding IPs on clients because the DHCP server remains the single source of truth for address assignments. Check /var/lib/dhcpd/dhcpd.leases to see which MAC addresses have received leases.
Need help with Ubuntu administration?
Work directly with Muhammad Irfan Aslam for Ubuntu Server, Linux, cloud, Docker, DevOps, CI/CD, or infrastructure troubleshooting support.
Work with Muhammad Irfan Aslam