15. April 2015

Raspberry PI als DHCP Server - Kleiner Eingriff, große Wirkung

Das dynamic host configuration protocol, kurz DHCP, ist ein Kommunikationsprotokoll und ermöglicht die Verteilung von IP Adressen in einem Netzwerk. Aber nicht nur die IPs werden vergeben. Auch der Standardgateway (also die Adresse des Routers) oder die Netzwerkmaske wird dem Client per DHCP zugewiesen.

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 RasPI Router zulegen 😃

DHCP ist für unseren kleinen Router ein must-have-feature!

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.

Alle anderen Computer bekommen auch diese Nachricht. Jedoch fühlt sich bis auf den DHCP keiner angesprochen. Teilweise bemerken die es noch nicht einmal, weil es die gar nicht interessiert.

Die Kommunikation läuft über Port 67/UDP am Server und Port 68/UDP beim Client und könnte etwa wie so aussehen:

Client: "Hallo, ich bin neu hier, mein Name ist Max. Gibt es hier ein DHCP?"
Server: "Ja, ich bin hier Max. Ich kann dir die IP x.x.x.x geben."
Client: "Ja, das kling super. Kann ich die haben?"
Server: "Max, hier ist die Adresse. Du kannst die für die nächsten 12 Stunden behalten."

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!"
Server: "Alles klar, Max. Machs gut!"

Der DHCP entfernt dann den Eintrag von Max aus seiner Liste.

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

Hier kommt die Ablaufzeit 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. Es ist bereits über 12 Stunden her, dass ich das letzte mal etwas von Max gehört habe. Ich kann dir die seine alte IP x.x.x.x geben."
Client: "Ja, das kling 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?"
Server: "Moritz, du kannst die IP für weitere 12 Stunden behalten."

Eigentlich eine prima Sache, oder? 😃

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

Konfiguration auf dem PI

Ich verwende den ISC DHCP Server. Es ist jedoch nicht so, dass es besser oder oder anderen schlechter sind, als der ISC. Sondern eher weil die Konfiguration des Servers etwas besser von der Hand geht. Man hat alles wichtige zentral an einer Stelle und kein unnötigen Schnick Schnack. 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. 😃

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

$ apt-get install isc-dhcp-server

Direkt nach der Installation, musst du die Schnittstellen angeben auf die der DHCP Server konfiguriert werden soll. Dies geschieht in der Datei:

$ 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".
INTERFACES="eth1 wlan0"
view raw isc-dhcp-server hosted with ❤ by GitHub

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.

$ nano /etc/dhcp/dhcpd.conf

Falls der DHCP Server authorativ funkgieren soll, also der einzige DHCP Server im Netzwerk ist, gibt man dies mit diesem Schlüsselwort an.

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;
view raw dhcpd.conf hosted with ❤ by GitHub

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;

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

subnet 172.26.32.0 netmask 255.255.240.0 {
# Anfang Ende
range 172.26.32.10 172.26.47.250;
}
subnet 172.26.48.0 netmask 255.255.240.0 {
range 172.26.48.10 172.26.63.250;
}
view raw dhcpd.conf hosted with ❤ by GitHub

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 172.26.47.253;

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 00:01:E6:3F:FC:4D;
fixed-address 192.168.0.2;
option host-name "Drucker";
}
view raw dhcpd.conf hosted with ❤ by GitHub

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.

IP Forward

Per Definition kennen sich Computer nur innerhalb eines Subnetzes. Würde man ein ping von einem PC mit der IP 172.26.16.16/24 in Richtung 172.26.17.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.

$ nano /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
view raw sysctl.conf hosted with ❤ by GitHub

Jetzt noch das Forwarding und NATing aktivieren

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

Im Hintergrund passiert jetzt folgendes:

Es kommt ein ping von eth1 auf eine wlan0 IP rein:

Jupiter schaut auf 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.

Meine finale Konfiguration

Meine finale Konfiguration sieht schlussendlich wie folgt aus:

authoritative;
option domain-name "knet.mw";
option domain-name-servers 172.26.47.253 172.26.63.253;
option broadcast-address 172.26.240.0;
default-lease-time 600;
max-lease-time 7200;
subnet 172.26.32.0 netmask 255.255.240.0 {
range 172.26.32.10 172.26.47.250;
option routers 172.26.47.253;
interface eth1;
}
subnet 172.26.48.0 netmask 255.255.240.0 {
range 172.26.48.10 172.26.63.250;
option routers 172.26.63.253;
interface wlan0;
}
host lanDrucker {
hardware ethernet 00:01:E6:3F:FC:4D;
fixed-address 172.26.18.3;
option host-name "Drucker";
}
view raw dhcpd.conf hosted with ❤ by GitHub

DHCP Server - Fazit

Ein DHCP Server kann viel Zeit und nerven sparen. Es muss nicht mehr Aufwändig jeder einzelne Rechner mit einer IP Adresse versehen werden.

Wenn ein neuer Rechner ins Netzwerk kommt, muss man nicht erst den Administrator fragen welche IP den noch vorhanden ist und welche genommen werden darf.

Zwar klingt das etwas lächerlich für ein paar Rechner solch eine Automatisierung zu verwenden, aber man bedenke jedoch die heutige mobile Welt.

Es kommen immer mal Freunde zu Besuch, die mit ihrem Smartphone ins Internet wollen um mal eben bei YouTube ein Video oder das letzte Schnäppchen bei eBay zeigen wollen. Zumal ich nicht sicher bin, ob man bei allen Smartphones die IP Adresse manuell vergeben kann 😃

Nicht zu verachten ist auch der Aufwand, wenn man Administrator von über 1000 Rechnern ist (nein, bin ich nicht) und der IP Adressenbereich ändern muss. Der Administrator wäre erst einmal für ein paar Tage beschäftigt.

Wenn dir das gefallen hat, wirst du diese Artikel lieben!

Die neuesten Artikel, die du gelesen haben musst!

teilen

Noch mehr privux?

Verpasse keine spannende Beiträge & Tutorials mehr!

Jetzt kostenlosen Newsletter abonieren!

Jetzt newsletter abonieren