= Netzwerk-Konfiguration mit DHCP =

DHCP ist ein Verfahren, das die Konfiguration von
Netzwerkeigenschaften im LAN vereinheitlicht. Ein Rechner, der
konfiguriert werden muss, startet einen sog. DHCP-Client. Dieser
sendet ein Datenpaket auf das Netzwerk, das soviel heisst wie
"Hallo! Ich bin hier! Ich weiss nicht, wer ich bin und wies
weitergeht! Wer kann mir helfen?". Falls jetzt auf diesem
Netzwerksegment ein DHCP-Serever installiert ist, kann dieser
reagieren und dem Client alle Einstellungen wie seine IP-Adresse,
DNS-Server-Adresse, Standard-Gateway (Router), etc. übergeben.
Welche Einstellungen unter welchen Umständen wem zugeteilt werden
kann natürlich eingestellt werden. Der Client wird dann anhand der
MacAdresse identifiziert. Man kann aber auch ohne Identifizierung
arbeiten, dann bekommt der Client eine Adresse aus einem freien
Adress-Pool.

= DHCP-Clients unter Linux =

Wir haben bisher Erfahrung mit zwei Clients:

== pump ==

Das Debian-Paket '''pump''' enthält einen einfachen und gut
funktionierenden DHCP-Client, der für normale Anwendungen genau das
richtige ist. Er wird z.B. in KnoppixLinux eingesetzt.

== dhcp3-client ==
Dieses Paket einthält den Standard-DHCP-Client des
[http://www.isc.org Internet Software Consortiums]. Er hat
vielfältige Konfigurationsmöglichkeiten und bietet Mechanismen wie
einen Fallback (falls kein Server gefunden wird) und Einstellungen
zum Umgang mit mehreren DHCP-Servern.

Aufgrund seiner umfangreichen Konfigurationsmöglichkeiten haben wir
ihn erstmal für unser Projekt KrefixLinux ausgewählt.

=== Problem / Fehlerbehebung ===
Mit dem mitgelieferten DHCP-Skript gibt es ein zwei kleine
Probleme: 

Wenn man eine Default-lease angibt, d.h. Werte für den Fall, das
kein Server existiert, so versucht das Skript, diese Einstellungen
zu verifizieren. Das bedeutet, es muss ein Router eingetragen sein
und dieser muss mit ''ping'' erreichbar sein. Um eine Karte auch
ohne bereits existierenden Router konfigurieren zu können, empfehle
ich folgende Änderung: Ziemlich am Ende des Skripts
''/etc/dhcp3/dhclient-script'' steht eine Zeile
<pre>
  set $new_routers
</pre>
Diese muss ergänzt werden zu:
<pre>
  set $new_routers $new_ip_address
</pre>

Dadurch wird, falls ein Router angegeben ist, dieser getestet,
falls nicht, wird das eigene Interface angepingt (was eigentlich
immer klappen sollte). ''Diese Lösung darf allerdings als Hack
gelten, da der eigentliche Sinn des Pings damit unterlaufen wird.
Wenn ich es richtig verstehe, kann das Script damit aus mehreren
gültigen Leases die richtige herausfinden. Wie kann man das besser
lösen?!?''

Ein zweites Problem ist, das eine ''option host-name'' in einer
fallback-lease in der Konfigurations-Datei nicht angenommen wird.
Falls man jedoch einen Hostnamen vorkonfiguriert, wird überhaupt
keine ''option host-name'' (auch nicht vom DHCP-Server) angenommen.
Um das zu beheben, muss nach der Zeile

  if [ x$reason = xTIMEOUT ]; then

folgendes eingefügt werden:

    current_hostname=`hostname`
    if [ x$current_hostname = x ] || \
       [ x$current_hostname = x$old_host_name ]; then
      if [ x$current_hostname = x ] || \
         [ x$new_host_name != x$old_host_name ]; then
        hostname $new_host_name
      fi
    fi

== Beispiel-Konfiguration ==

=== /etc/dhcp3/dhcpd.conf ===

dhcp3 ermöglicht es (im Gegensatz zu '''pump'''),
Default-Einstellungen anzugeben, die benutzt werden, wenn kein
DHCP-Server gefunden wird.  Für unser Projekt KrefixLinux haben wir
deshalb folgendes in die Konfiguration geschrieben:

 timeout 3;
 lease {
   interface "eth0";
   fixed-address 192.168.200.1;
   option host-name "router";
   renew 0 2020/1/1 00:00:01;
   rebind 0 2020/1/1 00:00:01;
   expire 0 2020/1/1 00:00:01;
 
 } 
 lease {
   interface "eth1";
   fixed-address 192.168.201.1;
   renew 0 2020/1/1 00:00:01;
   rebind 0 2020/1/1 00:00:01;
   expire 0 2020/1/1 00:00:01;
 }
 lease {
   interface "eth2";
   fixed-address 192.168.202.1;
   renew 0 2020/1/1 00:00:01;
   rebind 0 2020/1/1 00:00:01;
   expire 0 2020/1/1 00:00:01;
 }
 lease {
   interface "eth3";
   fixed-address 192.168.203.1;
   renew 0 2020/1/1 00:00:01;
   rebind 0 2020/1/1 00:00:01;
   expire 0 2020/1/1 00:00:01;
 }

Durch diese Konfiguration sucht der Rechner auf allen Interfaces
nach einem DHCP-Server. Falls er keinen findet, wird 
das Interface mit einer Standard-Adresse hochgefahren. In diesem
Falle "gründet" der Rechner die neuen Netze 
''192.168.20x.yyy''. Passiert das, sind wir nun natürlich für diese
Netze verantwortlich und brauchen einen eigenen
DHCPServerMitDNS, der den anderen Rechnern, die das Netz noch
besiedeln, sagt, wo es langgeht.

Die Interfaces sind alle gleich konfiguriert. Lediglich die
Netzwerkadressen sind unterschiedlich. Die angegebenen Leases
kommen nur zur Geltung, wenn kein DHCP-Server gefunden wird. Sie
sind also nur fallback-Werte. Dennoch müssen sie, was die Daten
angeht, gültig sein, um aktiviert zu werden.

=== /etc/network/interfaces ===

In der Datei ''/etc/network/interfaces'' werden die Interfaces wie
folgt eingetragen:

  auto eth0 eth1 eth2
  iface eth0 inet dhcp
  iface eth1 inet dhcp
  iface eth2 inet dhcp
  # ... ggf. noch mehr Interfaces angeben, bis zur maximalen
Kartenanzahl

Dadurch werden alle Interfaces automatisch hochgefahren und
versucht, sie per DHCP zu konfigurieren. Das gibt beim hochfahren
zwar Fehlermeldungen, falls gar nicht so viele Netzwerkkarten
eingebaut sind, aber das läßt sich wohl nicht vermeiden.

= DHCP-Server unter Linux =

Siehe DHCPServerMitDNS