Wireless LAN auf Linux-Basis

Einrichten eines DHCP Services für WLANs

16.10.2006 | Autor / Redakteur: Michael J. Martin / Andreas Donner

Der Dynamic Host Configuration Protocol Dienst (DHCP) eines drahtlosen Netzwerks kann nicht nur über das IOS implementiert sondern – mit ein wenig Know-how – auch auf Linux-Basis realisiert werden.

Wenn ein DHCP-Dienst in ein drahtloses Netzwerk implementiert werden soll, kann zwischen dem DHCP-Dienst des Cisco IOS und dem DHCP des Internet Systems Consortiums (ISC), das auf einem Linux Server laufen kann, gewählt werden. Grundlage für die hier diskutierte Implementierung ist das abgebildete Netzdiagramm. Zwei Schlüsselmerkmale dieser Implementierung sind:

  • Die Verwendung einer einzelnen, 802.1q benötigenden Netzschnittstelle auf dem Linux Server
  • Der Einsatz mehrfacher Gateways auf WLAN/LAN-Segmenten

Das erste Merkmal verlangt, dass – ausgehend davon, dass der Kernel des Servers 802.1q unterstützt – eine 802.1q-Vernetzung auf dem Linux Server eingerichtet wird. Damit muss der Switch Port des Servers so konfiguriert werden, dass er 802.1q-Trunking und die Server-Schnittstelle VLANs unterstützt. Der Switch-Teil kann leicht umgesetzt werden. Zuerst muss das Trunk Encapsulation Protocol des Ports gesetzt werden. Sobald dies erledigt ist, kann der Port zu einem Trunk-Port gemacht werden und die entsprechenden VLANs können definiert werden:

outlan-sw01#config t
Enter configuration commands, one per line. End with CNTL/Z.
outlan-sw01(config)#interface FastEthernet 0/21
outlan-sw01(config-if)#switchport trunk encapsulation dot1q
outlan-sw01(config-if)#switchport mode trunk
outlan-sw01(config-if)# switchport trunk allowed vlan 40
outlan-sw01(config-if)#switchport trunk allowed vlan add 80
outlan-sw01(config-if)#^Z

Wenn keine VLANs eingerichtet werden, wird der Switch den gesamten potentiellen Verkehr aller auf dem Switch konfigurierten VLANs über den Port senden. Das ist nicht unbedingt falsch, aber es ist besser zu definieren, welcher Daten über den Port ausgetauscht werden sollen, anstatt diese Entscheidung dem Uplink-Gerät zu überlassen. Damit lautet die finale Port-Konfiguration wie folgt:

outlan-sw01#sh run | begin interface FastEthernet0/21
interface FastEthernet0/21
switchport trunk encapsulation dot1q
switchport trunk allowed vlan 40,80
switchport mode trunk
!

Jetzt muss der Server konfiguriert werden. Red Hat unterstützt 802.1q nicht standardmäßig. Am schnellsten kann die VLAN-Schnittstellen aktiviert werden, indem der Bootstrap Network Process /etc/rc3.d/S10network deaktiviert wird. Dies geschieht durch Umbenennen der /etc/rc3.d/S10network Bootstrap-Datei in /etc/rc3.d/s10network umbenennt. Damit kann dann ein individuelles Network-Bootstrap-Skript wie in folgendem Beispiel erzeugt werden:

#!/bin/sh
# Install this script in /etc to load VLAN interfaces as part of the
# bootstrap process using /etc/rc3.d/S99local
#
# System Variables
host=trident
domain=open.outlan.net
gateway=172.30.80.1
# App Variables
vlan=/sbin/vconfig
ifc=/sbin/ifconfig
hn=/bin/hostname
dn=/bin/domainname
rt=/sbin/route
echo „Activating eth0....“
$ifc eth0 up
$ifc eth0 mtu 1460
# Define 802.1q vlans here:
$vlan add eth0 80
$vlan add eth0 40
#
#
echo „Enabling Vlan Interfaces“
$ifc eth0.80 172.30.80.101 netmask 255.255.255.0 up
$ifc eth0.80 mtu 1460
#
$ifc eth0.40 172.30.40.6 netmask 255.255.255.0 up
$ifc eth0.80 mtu 1460
#
echo Setting hostname....
$hn $host
echo Setting Domain Name....
$dn $domain
echo Setting Default Route....
$rt add default gw $gateway
Das Skript kann am Ende des Bootstrap-Prozesses geladen werden, in dem es an die /etc/rc3.d/S99local Bootstrap-Prozess-Datei angehängt wird (an dieser Stelle wird auch der DHCP Dienst gestartet):
[root@tridant rc3.d]# vi S99local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don‘t
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
echo Starting Network
/etc/start-net.sh
:wq
[root@tridant rc3.d]#

Nachdem das Netzwerk des Servers ausgeschaltet ist, kann nun geklärt werden, ob der Cisco oder der ISC DHCP benutzt werden soll. Die Cisco Implementierung ist ideal für die meisten Standard DHCP-Umgebungen geeignet, die nur die Basis-Optionen beim Client erfordern:

  • Subnet mask (option 1)
  • Router/default gateway (option 3)
  • DNS server (option 6)
  • Hostname (option 12)
  • Domain name (option 15)
  • NetBIOS name server (option 44)
  • NetBIOS node type (option 46)

Alle oben genannten Optionen werden heute praktisch von jeder verfügbaren DHCP-Client-Implementierung erkannt und sind völlig ausreichend, um einen Windows, Mac OS X oder Unix/Linux-basierten Arbeitsplatzrechner ins Netzwerk zu integrieren. Nichtsdestotrotz sind aber im aktuellen IANA (Internet Assigned Numbern Authority) DHCP Parameters Document über 100 DHCP–Client-Optionen definiert. Die Cisco DHCP-Implementierung unterstützt 12 von ihnen. Sollen DHCP-Optionen jenseits dieser Basis (wie Web Proxy Auto Discovery oder Static Route Distribution) unterstützt werden, dann muss die Entscheidung auf den ISC DHCP-Client fallen.

Den DHCP-Server einrichten

Der ISC DHCP-Dienst ist kostenlos auf der ISC-Website verfügbar. (ISC ist auch für den BIND Domain Name Service daemon verantwortlich). Die ISC Implementierung wird von den meisten Entwicklern als Referenz-DHCP-Distribution angesehen, da viele Entwickler Mitglied der DHCP-Standardisierungsgruppe sind, und ist Teil von vielen Unix-/Linux-Distributionen. Der ISC DHCP-Dienst läuft als Root-Dienst. Dies schafft eine potentielle Sicherheitslücke, sollte eine DHCP-Schwachstelle entdeckt werden. Die einzige Möglichkeit dieses Risiko zu reduzieren besteht darin, den DHCP in einem r-„Zelle“ laufen zu lassen. Dies erfordert die Einrichtung einer Verzeichnisbaum-“Zelle“, in der alle zur Ausführung des Dienstes nötigen Konfigurationen, Protokolle, Bibliotheken und Datenbankdateien sowie ausführbaren Programmen getrennt vom Rest des Systems untergebracht sind. Allerdings unterstützt ISC DHCP die chroot Option nicht von Haus aus.

Glücklicherweise hat jedoch der Programmierer Ari Edelkind den Code-Patch „Paranoia“ geschrieben, der das Ausführen eines ISC DHCP in einer chroot Zelle ermöglicht. Um mit dem Build-Prozess zu beginnen zu können, muss unter Zuhilfenahme von wget zuerst die Patch-Datei herunterladen werden. Dies kann aus dem Stammverzeichnis oder innerhalb eines Build-Verzeichnisses erledigt werden, das mithilfe folgender Skripts erstellt wird:

[root@tridant root]# wgethttp://www.episec.com/people/edelkind/patches/dhcp/dhcp-3.0+paranoia.patch
-bash: wgethttp://www.episec.com/people/edelkind/patches/dhcp/dhcp-
3.0+paranoia.patch: No such file or directory
[root@tridant root]# wget http://www.episec.com/people/edelkind/patches/dhcp/dhcp-3.0+paranoia.patch
--08:51:27-- http://www.episec.com/people/edelkind/patches/dhcp/dhcp-
3.0+paranoia.patch
=> `dhcp-3.0+paranoia.patch‘
Resolving www.episec.com... done.
Connecting to www.episec.com[69.55.237.141]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5,366 [text/plain]
100%[==============================================================
========================================================>]
5,366 56.35K/s ETA 00:00
08:51:33 (56.35 KB/s) - `dhcp-3.0+paranoia.patch‘ saved [5366/5366]
[root@tridant root]#

Die aktuelle Version des ISC DHCP ist 3.0.3. Der „Paranoia“-Patch wurde vom Autor auf ISC DHCP-Versionen bis 3.0.1.rc4 getestet. Dabei wurden einige Sicherheitslücken in den ISC DHCP Versionen 3.0p1, 3.0.1rc8 und 3.0.1rc12 sowie 3.0.1rc13 entdeckt. Außerdem arbeitet der Patch nicht auf den ISC DHCP-Versionen 3.0.1.rc14 und höher. Um eine sichere Version des ISC DHCP Codes zu verwenden, mit der der Einsatz des chroot möglich wird, muss daher also die Version R3.0.1 rc11 eingesetzt werden. Genau wie das Patchfile kann der Code mit Hilfe von wget heruntergeladen werden:

root@tridant root]# wget http://ftp.isc.org/isc/dhcp/dhcp-3.0-
history/dhcp-3.0.1rc11.tar.gz
--09:36:06-- http://ftp.isc.org/isc/dhcp/dhcp-3.0-history/dhcp-3.0.1rc11.tar.gz
=> `dhcp-3.0.1rc11.tar.gz‘
Resolving ftp.isc.org... done.
Connecting to ftp.isc.org[204.152.184.110]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 853,934 [application/x-gzip]
100%[=========================================================
=========================================================
====>] 853,934 267.71K/s ETA 00:00
09:36:09 (267.71 KB/s) - `dhcp-3.0.1rc11.tar.gz‘ saved [853934/853934]
[root@tridant root]#
Entpacken und kopieren des Tar-Balls:
[root@tridant root]# tar xfz dhcp-3.0.1rc11.tar.gz
Verschieben der Patch-Datei ins Serververzeichnis des DHCP Quellcodeverzeichnisses:
[root@tridant root]# mv dhcp-3.0+paranoia.patch dhcp-3.0.1rc11/server
[root@tridant root]# cd dhcp-3.0.1rc11/server

Anwenden des Patches auf dhcpd.c. (Bei Problemen wird die Patch-Anwendung Fehler melden; bei fehlerfreiem Durchlauf beendet sich das Programm mit einer Bestätigungsmeldung:

[root@tridant root]# cd dhcp-3.0.1rc11/server
[root@tridant server]# patch dhcpd.c dhcp-3.0+paranoia.patch
patching file dhcpd.c
[root@tridant server]#

Nach dem erfolgreichen Ausführen der Patch-Datei wird der „configure“-Befehl mit den gepatchten Flags im Root-Verzeichnis des Quellverzeichnisses ausgeführt:

[root@tridant dhcp-3.0.1rc11]# ./configure --copts „-DPARANOIA“
System Type: linux-2.2
make[1]: Entering directory `/root/dhcp-3.0.1rc11/work.linux-2.2‘
Making links in common
make[2]: Entering directory `/root/dhcp-3.0.1rc11/work.linux-2.2/common‘
make[2]: Leaving directory `/root/dhcp-3.0.1rc11/work.linux-2.2/common‘
make[1]: Leaving directory `/root/dhcp-3.0.1rc11/work.linux-2.2‘
….
[root@tridant dhcp-3.0.1rc11]#
Dann wird der Source-Code erstellt:
[root@tridant dhcp-3.0.1rc11]# make
….
make[2]: Leaving directory `/root/dhcp-3.0.1rc11/work.linux-2.2/dhcpctl‘
make[1]: Leaving directory `/root/dhcp-3.0.1rc11/work.linux-2.2‘
[root@tridant dhcp-3.0.1rc11]#

Sobald der Code erstellt ist, stehen zwei Optionen zur Verfügung. Einerseits kann „make install“ ausgeführt werden, um die Binaries, die Man-Seite und die Konfigurationsdateien in das Standard-Installationsverzeichnis zu verschieben, andererseits können die Dateien aber auch ins work.linux-2.2 Verzeichnis gezogen werden:

[root@tridant work.linux-2.2]# ls
client common dhcpctl dst Makefile minires omapip relay server
[root@tridant work.linux-2.2]#

Anschließend können die Server- und Man-Page-Dateien manuell dorthin installieren werden, wo es am sinnvollsten erscheint (zum Beispiel in die chroot Zelle, die hier im Anschluss erstellt wird). Als Erstes werden der Benutzer und die Gruppe erstellt, die den Dhcpd-Dienst ausführen sollen:

[root@tridant root]# /usr/sbin/groupadd dhcpd
[root@thumper root]# adduser dhcpd -s /bin/nologin

Dann werden die Verzeichnisse erzeugt:

[root@thumper root]# mkdir -m 700 /usr/local/dhcpd
[root@thumper root]# mkdir -p /usr/local/dhcpd/etc
[root@thumper root]# mkdir -p /usr/local/dhcpd/lib
[root@thumper root]# mkdir -p /usr/local/dhcpd/dev
[root@thumper root]# mkdir -p /usr/local/dhcpd/sbin
[root@thumper root]# mkdir -p /usr/local/dhcpd/var
[root@thumper root]# mkdir -p /usr/local/dhcpd/var/state
[root@thumper root]# mkdir -p /usr/local/dhcpd/var/state/dhcp
[root@thumper root]# mkdir -p /usr/local/dhcpd/var/run

Jetzt müssen einige Sonderdateien erstellt und die Bibliotheken kopiert werden, die daemon braucht, um zu laufen. Zuerst die Device-Dateien:

[root@thumper root]# mknod -m 666 /usr/local/dhcpd/dev/null c 1 3
[root@thumper root]# mknod -m 666 /usr/local/dhcpd/dev/random c 1 3

Jetzt kopiert man die /etc/localtime Datei nach /usr/Einwohner/dhcpd/etc., damit syslog-Nachrichten den korrekten Zeitstempel erhalten.

[root@thumper root]# cp /etc/localtime /usr/local/dhcpd/etc/localtime

Sobald die Device-Dateien vollständig sind, muss festgelegt werden, welche Bibliotheken gebraucht werden. Diese sind dann in den chroot-Verzeichnisbaum kopiert werden:

[root@tridant root]#cd /dhcp-3.0.1rc11/work.linux-2.2/server
[root@tridant server]# ldd dhcpd
libc.so.6 => /lib/tls/libc.so.6 (0x4001e000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
[root@tridant server]# cp /lib/ld-linux.so.2 /usr/local/dhcpd/lib/
[root@tridant server]# mkdir /usr/local/dhcpd/lib/tls/
[root@tridant server]# cp /lib/tls/libc.so.6 /usr/local/dhcpd/lib/tls/
[root@tridant server]# ln -s /usr/local/dhcpd/lib/tls/libc.so.6
/usr/local/dhcpd/lib/libc.so.6

Jetzt kann daemon installiert und die dhcpd.leases-Datei erstellt werden:

[root@tridant server]# cp dhcpd /usr/local/dhcpd/sbin/dhcp-3.0.1rc11
[root@tridant server]# /usr/local/dhcpd/var/state/dhcp/dhcpd.leases

Jetzt sind alle Dateien an Ort und Stelle und abschließend müssen nur noch die Benutzer- und Gruppen-Berechtigungen eingerichtet werden:

[root@tridant server]# chgrp -R dhcpd /usr/local/dhcpd/
[root@tridant server]# chown -R dhcpd /usr/local/dhcpd/

Nachdem daemon installiert und die chroot-„Zelle“ erstellt ist, muss der Service gestartet und auf „run“ gesetzt werden, wenn das System bootet.

Kommentar zu diesem Artikel

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)



Spamschutz 

Bitte geben Sie das Resultat dieser Rechenaufgabe (Addition) ein:
Kommentar abschicken

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 2000226)