Wie du einen DHCP-Server auf dem RaspberryPi einrichtest

Veröffentlicht: vor 4 monaten · Lesedauer ca. 13 Minuten

Darf ich dir eine Frage stellen?

Eine etwas persönliche Frage?

Nein, es ist nichts schweinisches 🙂

Aber mich würde es interessieren, wie oft du schon in deinem Leben manuell eine IP vergeben musstest?

Was? Kein einziges Mal?

Das könnte vielleicht daran liegen, dass in dem entsprechenden Netzwerk ein DHCP-Server vorhanden war.

Diese Funktionalität, gehört nämlich zu der Grundausstattung eines jeden Routers, der heutzutage verkauft wird.

Längst vorbei sind die Zeiten, in denen man sich noch die IP-Adresse manuell in den Netzwerk-Einstellungen ändern musste. Es gibt kaum ein Router, der kein DHCP mehr unterstützt. Und wenn du doch so einen besitzt, dann solltest du dir erst recht ein RasberryPi-Router zulegen 🙂

Halten wir fest: Jedes Netzwerk benötigt mindestens genau einen DHCP-Server!

Warum einen? Ganz einfach. Damit die sich nicht in die quere kommen.

Hast du schon einmal Eltern bei der Namensgebung ihrer Kinder beobachtet? Die werden sich da auch nie einig 🙂

Was ist DHCP und wie funktioniert es?

Nehmen wir mal an, du möchtest dich mit einem Netzwerk verbinden. Du steckst erst einmal das Netzwerkkabel ein und dann passiert es schon.

Bevor du auch nur den Gedanken daran verschwendest dir manuell eine IP Adresse zuzuweisen, schickt dein PC eine Nachricht an das Netzwerk und stellt sich einmal vor.

Das ist quasi so, wie mit dem neuen in der Klasse. Der kommt rein, stellt sich vor und (ggf. bis auf den Lehrer) juckt es keinen wie der/die Neue heißt. Alle haben die Nachricht erhalten und nur der Lehrer reagiert. In unserem Fall der DHCP.

Wie eine IP-Adresse vergeben wird

Die Kommunikation läuft über Port 67/UDP am Server und Port 68/UDP beim Client und beinhaltet folgende Nachrichten:

dhcp-aserver discover - offer - request - ack

Die eigentliche Kommunikation könnte in etwa so aussehen:

Client: „Hallo, ich bin neu hier, mein Name ist Max. Gibt es hier ein DHCP?“ (discover)
Server: „Ja, ich bin hier, Max. Ich kann dir die IP x.x.x.x geben.“ (offer)
Client: „Ja, das klingt super. Kann ich die haben?“ (request)
Server: „Max, hier ist die Adresse. Du kannst die für die nächsten 12 Stunden behalten.“ (acknowledge)

Der DHCP-Server notiert sich jetzt die Zeit, die Ablaufzeit und die Adresse, die er Max gegeben hat.

Wenn sich Max innerhalb der nächsten 12 Stunden ausloggt, sieht die Kommunikation wie folgt aus:

Client: „DHCP-Server, ich bin es, Max, ich brauche die IP nicht mehr!“ (release)
Server: „Alles klar, Max. Mach’s gut!“

Der DHCP entfernt dann Max’s Eintrag aus seiner Liste.

Wie eine IP-Adresse recycelt wird.

Was passiert eigentlich, wenn der Rechner von Max jetzt abstürzt oder der Netzwerkstecker einfach gezogen wird? Theoretisch wäre die IP dann für immer blockiert.

Hier kommt die Ablaufzeit (lease time) ins Spiel.

Wenn jetzt der nächste Client kommt, könnte die Kommunikation wie folgt aussehen:

Client: „Hallo, ich bin neu hier, mein Name ist Moritz. Gibt es hier ein DHCP?“
Server: „Ja, ich bin hier Moritz. Ich habe hier eine ungenutzt IP. Brauchst du eine?“
Client: „Ja, das klingt super. Kann ich die haben?“
Server: „Moritz, hier ist die Adresse. Du kannst die für die nächsten 12 Stunden behalten.“

12 Stunden später….

Client: „DHCP-Server, ich bin es, Moritz. Die 12 Stunden sind jetzt vorbei. Kann ich die IP noch etwas behalten?“ (request)
Server: „Moritz, du kannst die IP für weitere 12 Stunden behalten.“ (acknowledge)

Eigentlich eine ganz prima Sache, oder? 🙂

Der Benutzer braucht sich um nichts zu kümmern. Alles läuft vollautomatisch im Hintergrund ab 🙂

Welchen DHCP-Server soll installiert werden?

Unter Unix stehen uns zwei verschiedene DHCP-Server zur Verfügung, unter denen man wählen kann.

Auf der einen Seite ist es der isc-dhcp-server und auf der anderen Seite dnsmasq.

dnsmasq, lässt nicht vermuten, dass es sich um einen DHCP-Server handelt. Eher wäre es ein DNS-Server. Es ist beides. Jedoch bin ich mit dnsmasq nie so richtig warm geworden. Meiner Meinung nach ist dieser Dienst etwas zu leichtgewichtig.

Welche Variante man schlussendlich verwendet, ist jedoch egal.

Ich verwende den ISC-DHCP-Server. Es ist jedoch nicht so, dass dieser besser oder schlechter ist, als dnsmasq, sondern eher, weil die Konfiguration des Servers etwas besser von der Hand geht. Man hat alles wichtige zentral an einer Stelle und keinen unnötigen Schnickschnack. Wirklich nur das, was man benötigt.

Lediglich die Auswertung der Logs ist etwas kompliziert, da die Einträge in keiner separaten Datei stehen, sondern global in der /var/logs/syslog. Jedoch muss man auch dazu sagen, dass diese Kleinigkeit kein Ausschlusskriterium darstellt, da ich persönlich kaum Logs durchwühle, wenn den alles funktioniert. 🙂

Wie isc-dhcp-server installiert und konfiguriert wird

Zunächst wird das Paket für den DHCP-Server installiert.

$ sudo apt-get install isc-dhcp-server

Direkt nach der Installation musst du die Schnittstellen angeben, auf die der DHCP-Server konfiguriert werden soll.

Aber vorher noch ein Backup der Konfigurationsdatei erstellen (falls mal etwas schieflaufen sollte).

$ sudo cp /etc/default/isc-dhcp-server /etc/default/isc-dhcp-server.bak
$ sudo nano /etc/default/isc-dhcp-server

In der letzten Zeile ist der Wert INTERFACES. Wenn du mehrere Schnittstellen hast, kannst du die auch alle hintereinander Schreiben:

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#	Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="eth1 wlan0 wlan1"

Gleich im Anschluss, muss die Konfiguration vom DHCP selbst etwas angepasst werden. Die Datei ist etwas mäßig dokumentiert, reicht aber aus um den Dienst nach eigenen Wünschen zu konfigurieren.

$ sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak
$ sudo nano /etc/dhcp/dhcpd.conf

Falls der DHCP-Server autoritär fungieren soll, also der einzige DHCP-Server im Netzwerk ist, gibt man dies mit diesem Schlüsselwort an.

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

Unter lease time versteht man den Zeitraum, für die der Server seine IP-Adresse zur Verfügung stellt. Die Angabe ist in Sekunden und kann für den Heimgebrauch eigentlich auch relativ weit nach oben geschraubt werden. Da kommt es ja sowieso kaum vor, dass man mehr Rechner als IPs hat.

default-lease-time 600;
max-lease-time 7200;

Bevor die IP vergeben wird, kann der Server die IP noch einmal anpingen um sicherzustellen, dass die IP auch wirklich nicht vergeben ist. Jedoch ist es meistens unnötig und dauert entsprechend länger. Der Parameter hierfür wäre:

ping-check true;

So legst du IP-Adressenbereiche für Netzwerke fest.

ISC kann mehrere Subnetze gleichzeitig beliefern. Die Subnetze werden wie folgt in Blöcken definiert:

# eth1
subnet 10.10.1.0 netmask 255.255.255.0 {
        range 10.10.1.10 10.10.1.250;
}
# wlan0
subnet 10.20.0.0 netmask 255.255.255.0 {
        range 10.20.0.10 10.20.0.250;
}
# wlan1
subnet 10.20.1.0 netmask 255.255.255.0 {
        range 10.20.1.10 10.20.1.250;
}

Mit der Angabe eines interfaces, kann man dem Server sagen, über welche Schnittstelle der Server lauschen und die IP-Adressen verteilen soll.

interface eth1;

Der DHCP benötigt noch die Angabe, über welche Adresse alle IPs gerouted werden sollen. Meistens (fast immer) ist das die eigene IP. Also die IP der eigenen Schnittstelle.

option routers 10.10.1.1;

In einem host Block definierst du Rechner, die immer wieder die gleiche IP bekommen sollen. Gut geeignet für Server oder Geräte, auf die du kein Einfluss hast.

host printer {
   hardware ethernet xx:xx:xx:xx:xx:xx;
   fixed-address 10.30.0.42;
   option host-name "Drucker";
}

Wichtig zu wissen ist auch, dass fast alle Parameter sowohl innerhalb, als auch außerhalb eines subnet oder host blocks definiert werden können. Beispielsweise ist es bei dem Befehl interfaces sinnvoll, da man je nach Schnittstelle andere Adressen vergeben möchte.

So aktivierst du IP-Forwarding

Per Definition kennen sich Computer nur innerhalb eines Subnetzes. Würde man ein ping von einem PC mit der IP 10.10.1.42/24 in Richtung 10.10.2.16/24 senden, würde keine Antwort ankommen. Wären beide Computer innerhalb des 16er Netzes, wäre der ping erfolgreich.

Es ist zwingend erforderlich, dass man die Netze voneinander trennt, da der DHCP nicht zwei Netzwerkschnittstellen gleichzeitig mit einem Adressbereich beliefern kann.

Damit man das in den Griff bekommt, gibt es mit dem IP Forwarding eine kleine Abhilfe.

Dazu öffnest du die sysctrl und kommentierst eine Zeile rein.

$ sudo nano /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Jetzt noch das Forwarding und NATing aktivieren

$ sudo echo 1 > /proc/sys/net/ipv4/ip_forward
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Im Hintergrund passiert jetzt folgendes:

Es kommt ein ping von eth1 (Netzwerk) auf eine wlan1 (Haupt-WiFi) IP rein:

Der Router schaut zunächst in sein eth1 Netz und findet nichts. Als Nächstes werden die anderen Netze angefragt, ob die IP bekannt ist. Falls ja, antwortet der entsprechende Rechner auf die Anfrage. Falls nicht, geht die Anfrage weiter bis über den Provider raus ins Internet. Spätestens da ist Schluss. Da der ping aus einem privaten Adressbereich gekommen ist, werden die Anfragen einfach verworfen.

Jetzt nur noch mit

$ service isc-dhcp-server start

starten und dann kannst du dich schon probeweise zum Server verbinden.

Solltest du auf die Idee kommen und den Raspberry Pi neustarten wollen, geht jedoch die Einstellung für iptables verloren.

Der iptables Befehl ist Teil der Firewall, den wir später noch einmal genauer ansehen werden und auch „persistieren“ werden (also das der auch mal ein Neustart überlebt).

Wie meine finale Konfiguration aussieht

Meine finale Konfiguration sieht schlussendlich wie folgt aus:

authoritative;
log-facility local7;
default-lease-time 600;
max-lease-time 7200;
# DNS Option muss später angepasst werden
option domain-name-servers 8.8.8.8, 8.8.4.4;

subnet 10.10.1.0 netmask 255.255.255.0 {
	range 10.10.1.10 10.10.1.250;
	option routers 10.10.1.1;
	interface eth1;
}

subnet 10.20.0.0 netmask 255.255.255.0 { 
	range 10.20.0.10 10.20.0.250;
	option routers 10.20.0.1;
	interface wlan0;
}

subnet 10.20.1.0 netmask 255.255.255.0 { 
	range 10.20.1.10 10.20.1.250;
	option routers 10.20.1.0;
	interface wlan1;
}

DHCP-Server in aller Kürze

Wie du siehst, ist auch ein DHCP-Server ziemlich schnell eingerichtet. Dazu musst du nur:

  • Das Paket isc-dhcp-server installieren
  • Angeben über welche Schnittstellen die IPs vergeben werden sollen
  • IP-Adressenbereiche für jede Netzwerkschnittstelle festlegen
  • IP-Forwarding aktivieren
  • IP-Masquerade erlauben

Nachdem wir also auch ein DHCP-Server haben, können wir uns schon um das WLAN kümmern, damit man auch mit dem Smartphone über den Raspberry-Pi-Router ins Internet einwählen kann.

Kategorien:
Jupiter-PI
Das könnte dir auch gefallen
Sei der erste und teile deine Meinung mit der Welt!
... und was meinst du dazu?
Deine E-Mail-Adresse wird nicht veröffentlicht.