Dynamic Host Configuration Protocol

1. Introduction

The Dynamic Host Configuration Protocol (DHCP) is a network management protocol used to dynamically assign IP addresses to devices on a network.

DHCP operates based on a client-server model.

Start an IPv4 DHCP server.

  
$ kea-dhcp4 -c <config_file>
  

Send a DHCP request.

  
$ dhclient <network_interface>
  

2. Labs

flowchart LR
    subgraph host
        dhcp-server
    end

    subgraph br0[bridge: br0]
        veth1-br
        veth2-br
    end

    subgraph ns1[namespace: ns1]
        veth1
    end

    subgraph ns2[namespace: ns2]
        veth2
    end

    host <---> br0
    veth1-br <--->|veth pair| veth1
    veth2-br <--->|veth pair| veth2

2.1. Setup DHCP Server

Install isc-kea.

  
$ apt install kea
  

Setup virtual bridge interface br0.

  
# create bridge
$ ip link add br0 type bridge

# set IP
$ ip addr add 192.168.1.1/24 dev br0

# turn on
$ ip link set br0 up
  

Edit file /etc/kea/kea-dhcp4.conf.

  
{
  "Dhcp4": {
    "interfaces-config": {
        "interfaces": [ "br0" ]
    },
    "lease-database": {
        "type": "memfile"
    },
    "subnet4": [
    {
        "id": 1,
        "subnet": "192.168.1.0/24",
        "pools": [
            {
                "pool": "192.168.1.150 - 192.168.1.200"
            }
        ],
    }
    ]
  }
}
  

Start DHCP server.

  
$ systemctl restart kea-dhcp4-server
  

Check status

  
$ systemctl status kea-dhcp4-server
  

2.2. Setup Client.

Setup namespace ns1.

  
# create namespace
$ ip netns add ns1


# below steps to connect ns1 and host

# create veth pair
$ ip link add veth1 type veth peer name veth1-br

# move veth1 to ns1
$ ip link set veth1 netns ns1

# move veth1-br to br0
$ ip link set veth1-br master br0

# turn on veth pair
$ ip link set veth1-br up
$ ip netns exec ns1 ip link set veth1 up
  

2.2. Send DHCP Request.

From ns1, send a DHCP request.

  
$ ip netns exec ns1 dhclient veth1
  

Check IP addresses of ns1.

   
$ ip netns exec ns1 ip addr show
  
  
  veth1@if8:
    inet 192.168.1.150/24 brd 192.168.1.255 scope global dynamic veth1
  

For namespace ns2, we do the same steps as ns1 to setup and send DHCP requests.

2.3. Remove Assigned IP Address.

From ns1, remove the assigned IP address.

  
$ ip netns exec ns1 dhclient -r veth1
  

2.4. Capture DHCP messages.

DHCP operates over UDP ports 67 (server) and 68 (client).

  
$ tshark -P -i br0 -f "udp port 67 or udp port 68" -w dhcp.pcap
  
  
$ ip netns exec ns1 dhclient veth1
  

2.5. Analyze DHCP messages.

Read pcap.

  
$ tshark -r dhcp.pcap
  
  
1 0.000000000      0.0.0.0 → 255.255.255.255  DHCP 342 DHCP Discover  - Transaction ID 0x62535106
2 0.001860896  192.168.1.1 → 192.168.1.150    DHCP 342 DHCP Offer     - Transaction ID 0x62535106
3 0.003278980      0.0.0.0 → 255.255.255.255  DHCP 342 DHCP Request   - Transaction ID 0x62535106
4 0.003918114  192.168.1.1 → 192.168.1.150    DHCP 342 DHCP ACK       - Transaction ID 0x62535106
  

Tips

Observe live log of kea-dhcp4-server service.

  
$ journalctl -f -u kea-dhcp4-server
  

References