Einführung

DHCP steht für Dynamic Host Configuration Protocol. Mit einem DHCP-Server kann man Clients in einem Netzwerk automatisch eine IP-Konfiguration zuweisen. Somit muss man bei den Clients nicht manuell eine IP-Konfiguration vornehmen. Meistens wird über den DHCP-Server die IP-Adresse des Clients, die Subnetzmaske vom Netzwerk, der Default-Gateway und der zu verwendende DNS-Server verteilt.

Installation

Unter Debian heisst das Paket vom DHCP-Server isc-dhcp-server (früher dhcp3-server). Installiert wird es folgendermassen:

$ sudo aptitude install isc-dhcp-server

Nach der Installation ist der DHCP-Server noch nicht aktiv. Dieser muss zuerst konfiguriert werden.

Konfiguration

Das Konfigurationsfile vom DHCP-Server befindet sich nach der Installation im Verzeichnis /etc/dhcp und heisst dhcpd.conf.

Meine Konfiguration vom DHCP-Server ist relativ simpel und sieht folgendermassen aus:

########################################################################
#
# /etc/dhcp/dhcpd.conf
# Konfigurationsfile vom DHCP-Server (isc-dhcp-server)
#
# 2011-08-28; Emanuel Duss; Erste Version
#
########################################################################

########################################################################
# DHCP-Server
########################################################################
# Authoritative = Aktiv (Sendet DHCPNAK)
authoritative;
# Logging
log-facility local7;
# Lease-Time (86400 = 1 Tag)
default-lease-time 86400;
max-lease-time 86400;

########################################################################
# Globale Optionen
########################################################################
# Domain
option domain-name "duss.xy";
# DNS-Server
option domain-name-servers 10.0.0.20;
# NTP-Server
option ntp-servers 10.0.0.20;

########################################################################
# Subnetz
########################################################################
# Subnetz 10.0.0.0/24
subnet 10.0.0.0 netmask 255.255.255.0 {
  # Range
  range 10.0.0.100 10.0.0.200;
  # Default-Gateway
  option routers 10.0.0.1;
}

########################################################################
# Hosts
########################################################################
# Statische Adressen
host eris {
  hardware ethernet 58:94:6B:E9:FD:78;
  fixed-address 10.0.0.23;
}
# EOF

Authoritative bedeutet, dass der DHCP-Server Clients im Netzwerk konfigurieren darf. Die Konfiguration ist ein Tag lang gültig. Dann muss der Client erneut eine Konfiguration anfordern. Meldungen schreibt der Daemon ins syslog ( /var/log/messages). Die Clients bekommen die Domain duss.xy. Als DNS-Server wird 10.0.0.20 an die Clients verteilt. Aus dem Netz 10.0.0.0/24 können IP-Adressen aus dem Bereich 10.0.0.100 bis 10.0.0.200 verteilt werden. Um in andere Netze zu gelangen, wird der Default-Gateway 10.0.0.1 verteilt. Der Host eris mit der angegebenen MAC-Adresse bekommt immer dieselbe IP-Adresse 10.0.0.23 zugewiesen.

Kontrolle auf dem Server

Folgende Meldungen schreib der Syslog-Daemon ins File /var/log/messages:

$ sudo tail -f /var/log/messages | grep dhcpd
Aug 30 23:49:31 debian dhcpd: DHCPDISCOVER from 00:15:af:dd:4f:ab via eth0
Aug 30 23:49:32 debian dhcpd: DHCPOFFER on 10.0.0.108 to 00:15:af:dd:4f:ab (chaos) via eth0
Aug 30 23:49:32 debian dhcpd: DHCPREQUEST for 10.0.0.108 (10.0.0.20) from 00:15:af:dd:4f:ab (chaos) via eth0
Aug 30 23:49:32 debian dhcpd: DHCPACK on 10.0.0.108 to 00:15:af:dd:4f:ab (chaos) via eth0

Daran sieht man, dass die vier DHCP-Message-Types DHCPDISCOVER, DHCPOFFER, DHCPREQUEST und DHCPACK verschickt wurden.

Die selben vier Nachrichten sieht man auch mit dem Netzwerk-Sniffer tcpdump:

$ sudo tcpdump -n port 67 -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
23:49:31.921845 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:15:af:dd:4f:ab, length 323
23:49:32.000143 IP 10.0.0.20.67 > 10.0.0.108.68: BOOTP/DHCP, Reply, length 300
23:49:32.010123 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:15:af:dd:4f:ab, length 335
23:49:32.038398 IP 10.0.0.20.67 > 10.0.0.108.68: BOOTP/DHCP, Reply, length 300

Was jedoch wirklich im DHCP-Protokoll steckt, zeigt das Tool dhcpdump. Dieses stellt die DHCP-Nachrichten schön leserlich dar.

$ sudo dhcpdump  -i eth0
  TIME: 2011-08-30 23:49:31.922
    IP: 0.0.0.0 (0:15:af:dd:4f:ab) > 255.255.255.255 (ff:ff:ff:ff:ff:ff)
    OP: 1 (BOOTPREQUEST)
 HTYPE: 1 (Ethernet)
  HLEN: 6
  HOPS: 0
   XID: 39ab2218
  SECS: 0
 FLAGS: 0
CIADDR: 0.0.0.0
YIADDR: 0.0.0.0
SIADDR: 0.0.0.0
GIADDR: 0.0.0.0
CHADDR: 00:15:af:dd:4f:ab:00:00:00:00:00:00:00:00:00:00
 SNAME: .
 FNAME: .
OPTION:  53 (  1) DHCP message type         1 (DHCPDISCOVER)
OPTION:  57 (  2) Maximum DHCP message size 1500
OPTION:  60 ( 49) Vendor class identifier   dhcpcd-5.2.12:Linux-2.6.39-ARCH:i686:GenuineIntel
OPTION:  12 (  5) Host name                 chaos
OPTION:  55 ( 15) Parameter Request List      1 (Subnet mask)
					    121 (Classless Static Route)
					     33 (Static route)
					      3 (Routers)
					      6 (DNS server)
					     12 (Host name)
					     15 (Domainname)
					     26 (Interface MTU)
					     28 (Broadcast address)
					     42 (NTP servers)
					     51 (IP address leasetime)
					     54 (Server identifier)
					     58 (T1)
					     59 (T2)
					    119 (Domain Search)

---------------------------------------------------------------------------
  TIME: 2011-08-30 23:49:32.000
    IP: 10.0.0.20 (0:1e:b:27:a2:94) > 10.0.0.108 (0:15:af:dd:4f:ab)
    OP: 2 (BOOTPREPLY)
 HTYPE: 1 (Ethernet)
  HLEN: 6
  HOPS: 0
   XID: 39ab2218
  SECS: 0
 FLAGS: 0
CIADDR: 0.0.0.0
YIADDR: 10.0.0.108
SIADDR: 0.0.0.0
GIADDR: 0.0.0.0
CHADDR: 00:15:af:dd:4f:ab:00:00:00:00:00:00:00:00:00:00
 SNAME: .
 FNAME: .
OPTION:  53 (  1) DHCP message type         2 (DHCPOFFER)
OPTION:  54 (  4) Server identifier         10.0.0.20
OPTION:  51 (  4) IP address leasetime      86400 (24h)
OPTION:   1 (  4) Subnet mask               255.255.255.0
OPTION:   3 (  4) Routers                   10.0.0.1
OPTION:   6 (  4) DNS server                10.0.0.20
OPTION:  15 (  7) Domainname                duss.xy
OPTION:  58 (  4) T1                        43200 (12h)
OPTION:  59 (  4) T2                        75600 (21h)
---------------------------------------------------------------------------
  TIME: 2011-08-30 23:49:32.010
    IP: 0.0.0.0 (0:15:af:dd:4f:ab) > 255.255.255.255 (ff:ff:ff:ff:ff:ff)
    OP: 1 (BOOTPREQUEST)
 HTYPE: 1 (Ethernet)
  HLEN: 6
  HOPS: 0
   XID: 39ab2218
  SECS: 0
 FLAGS: 0
CIADDR: 0.0.0.0
YIADDR: 0.0.0.0
SIADDR: 0.0.0.0
GIADDR: 0.0.0.0
CHADDR: 00:15:af:dd:4f:ab:00:00:00:00:00:00:00:00:00:00
 SNAME: .
 FNAME: .
OPTION:  53 (  1) DHCP message type         3 (DHCPREQUEST)
OPTION:  50 (  4) Request IP address        10.0.0.108
OPTION:  54 (  4) Server identifier         10.0.0.20
OPTION:  57 (  2) Maximum DHCP message size 1500
OPTION:  60 ( 49) Vendor class identifier   dhcpcd-5.2.12:Linux-2.6.39-ARCH:i686:GenuineIntel
OPTION:  12 (  5) Host name                 chaos
OPTION:  55 ( 15) Parameter Request List      1 (Subnet mask)
					    121 (Classless Static Route)
					     33 (Static route)
					      3 (Routers)
					      6 (DNS server)
					     12 (Host name)
					     15 (Domainname)
					     26 (Interface MTU)
					     28 (Broadcast address)
					     42 (NTP servers)
					     51 (IP address leasetime)
					     54 (Server identifier)
					     58 (T1)
					     59 (T2)
					    119 (Domain Search)

---------------------------------------------------------------------------
  TIME: 2011-08-30 23:49:32.038
    IP: 10.0.0.20 (0:1e:b:27:a2:94) > 10.0.0.108 (0:15:af:dd:4f:ab)
    OP: 2 (BOOTPREPLY)
 HTYPE: 1 (Ethernet)
  HLEN: 6
  HOPS: 0
   XID: 39ab2218
  SECS: 0
 FLAGS: 0
CIADDR: 0.0.0.0
YIADDR: 10.0.0.108
SIADDR: 0.0.0.0
GIADDR: 0.0.0.0
CHADDR: 00:15:af:dd:4f:ab:00:00:00:00:00:00:00:00:00:00
 SNAME: .
 FNAME: .
OPTION:  53 (  1) DHCP message type         5 (DHCPACK)
OPTION:  54 (  4) Server identifier         10.0.0.20
OPTION:  51 (  4) IP address leasetime      86400 (24h)
OPTION:   1 (  4) Subnet mask               255.255.255.0
OPTION:   3 (  4) Routers                   10.0.0.1
OPTION:   6 (  4) DNS server                10.0.0.20
OPTION:  15 (  7) Domainname                duss.xy
OPTION:  58 (  4) T1                        43200 (12h)
OPTION:  59 (  4) T2                        75600 (21h)
---------------------------------------------------------------------------

Die DHCP-Message-Types bedeuten folgendes:

  • DHCPDISCOVER: Der Client sendet per Broadcast eine Anfrage ins Netzwerk und fragt nach einer IP-Konfiguration. Dabei sagt er dem Server, wie er heisst und welche Parameter er annehmen kann. Unter der Parameter-Liste ist z. B. die Subnetzmaske, der DNS-Server, der Default-Gateway oder die Domain zu finden.
  • DHCPOFFER: Der Server antwortet mit einem Konfigurations-Angebot.
  • DHCPREQUEST: Falls das Angebot dem Client passt, fordert er die gewünschten Parameter an.
  • DHCPACK: Falls alles funktioniert hat, bestätigt der DHCP-Server die Konfiguration.

Kontrolle auf dem Client

Der Client hat die IP-Adresse 10.0.0.108 mit der Subnetzmaske 255.255.255.0 zugewiesen bekommen. Das sehen wir mit ifconfig -a wlan0:

$ ifconfig -a wlan0
wlan0     Link encap:Ethernet  HWaddr 00:15:AF:DD:4F:AB
          inet addr:10.0.0.108  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::215:afff:fedd:4fab/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:162 errors:0 dropped:0 overruns:0 frame:0
          TX packets:121 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:16929 (16.5 Kb)  TX bytes:19607 (19.1 Kb)

In der Routing-Tabelle sieht man den Default-Gateway 10.0.0.1. Der Default-Gateway erkennt man immer an der Destination 0.0.0.0.

$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.0.1        0.0.0.0         UG        0 0          0 wlan0
10.0.0.0        0.0.0.0         255.255.255.0   U         0 0          0 wlan0

In der Datei /etc/resolv.conf sieht man die Domain ( duss.xy) und der DNS-Server ( 10.0.0.10):

$ cat /etc/resolv.conf
# Generated by dhcpcd from wlan0
# nameserver 8.8.8.8
domain duss.xy
nameserver 10.0.0.10
# /etc/resolv.conf.tail can replace this line

Es lohnt sich auch die Konfiguration vom DHCP-Client anzuschauen! Wird der DHCP-Client dhclient verwendet, befindet sich die Konfiguration unter /etc/dhcp/dhclient.conf (Debian) bzw. unter /etc/dhclient.conf (Arch Linux).