Booten und Konfiguration im Netz |
Übersicht |
Die etwas »schwammige« Formulierung »Booten und Konfiguration im Netz« versucht die nachfolgend vorgestellten - und doch recht unterschiedlichen - Techniken auf einen gemeinsamen Nenner abzubilden.
Genau genommen, umschreibt »Konfiguration einiger Netzwerkparameter während des
Netzwerkstarts« trefflich das Ansinnen von Dynamic Host Configuration Protocol DHCP oder
Bootstrap Protocol BOOTP. Aber als Titel schien uns das schlicht weg zu lang.
I.d.R. wird man das Netzwerk im Rahmen des Bootvorgangs aktivieren, weshalb
DHCP und BOOTP oft in einem Atemzug mit
»Booten« und »Netzkonfiguration« genannt werden. Wichtigstes Ansinnen beider
Protokolle ist es, einen Clientrechner mit einer IP-Adresse zu versehen. Ursprünglich entsprang der
Bedarf eines solchen Verfahrens dem Einsatz festplattenloser Clients, die ihre IP-Adresse während des
Starts nicht kennen können (Wo sollten sie diese auch speichern?). Die heutigen Einsatzfälle sind
weit reichender und sollen mit der Vorstellung des jeweiligen Protokolls genannt werden.
Der älteste (verbreitete) Mechanismus zur IP-Adress-Vergabe ist das Reverse Address Resolution Protocol (RARP), quasi das »umgekehrte« ARP. Es basiert auf einer Broadcast-Anfrage, wobei der Client in seinem Subnetz die seiner Hardwareadresse zugeordnete IP-Adresse erfragt. Ein RARP-Server wird anhand einer Datenbank mit der gewünschten Information antworten.
RARP ist jedoch zu sehr auf die zugrunde liegende Netzhardware fixiert und auf den bloßen Austausch der IP-Adresse beschränkt. Der Rechnername selbst oder bspw. der Namen eines DNS-Servers kann hierüber nicht in Erfahrung gebracht werden. U.a. der Wunsch nach solchen Anforderungen führte zur Entwicklung des BOOTP, das allgemein als Nachfolger des RARP bezeichnet wird. Der evolutionären Linie folgend, tritt DHCP mit einem nochmals gesteigerten Funktionsumfang das Erbe des BOOTP an.
Bei »Booten übers Netz« handelt es sich da um etwas gänzlich anderes, dient dieses Verfahren doch zum Start von »plattenlosen« Clients (Terminals), die alle notwendigen Daten - einschließlich des Kernels und des Rootdateisystems - von einem Server beziehen. Da einem solchen Vorgehen eine Konfiguration des Netzwerks vorausgehen muss - und DHCP bzw. BOOTP die genutzten Techniken sind - gliedert sich auch dieses Thema unter »Booten und Konfiguration im Netz« ein...
BOOTP - Internet Bootstrap Protocol |
Das Bootstrap Protocol dient zur Verteilung von IP-Konfigurationsparametern an einen Rechner. Für gewöhnlich handelt es sich um festplattenlose Clients, die während des Bootvorgangs alle notwendigen Informationen von einem Bootp-Server beziehen. Auch wenn das neuere DHCP BOOTP in vielen Bereichen verdrängt hat, gelangt BOOTP zumeist in Zusammenhang mit Booten übers Netz zum Einsatz, da der Kernel BOOTP direkt unterstützt.
Die Funktionsweise ist einfach: Ein konfigurationswilliger Client sendet eine Anforderung (BOOtrEQUEST) als Broadcast in das lokale (Sub)Netz. Ein Bootp-Server antwortet mit einem BOOtrEPLY-Paket, das eventuell mehrere Konfigurationsparameter für das Netzwerk, mindestens aber die IP-Adresse des Clients beinhaltet. Der Bootp-Server muss nicht zwingend im lokalen Subnetz liegen, dann erfordert das Protokoll aber ein Bootp-Gateway.
Bootp-Gateways dienen der Weiterleitung von BOOtrEQUESTS. Der zuständige Daemon bootpgw wird hierzu mit der Adresse eines Bootp-Servers als Argument gestartet. Dieser Daemon lauscht nun im Netz nach Anfragen von Clients. Trifft eine Bootp-Anfrage ein, wartet das Gateway noch drei Sekunden, ob eine zugehörige Antwort von einem Server eintrifft. Wenn nicht, trägt er in das BOOtrEQUEST-Paket seine Adresse ein und leitet es an den ihm bekannten Bootp-Server weiter. Bootp-Gateways könnten somit die Folgen des Ausfalls eines Servers lindern.
Nur in seltenen Fällen wird ein Bootp-Server entscheidend mehr als einige hundert Clients bedienen. Typisch für einen Rechnerpool sind wohl gar nur 10-50 Clients. Auch fordert ein Client nur ein einziges Mal während seiner Systemlaufzeit eine Netzkonfiguration an, sodass letztendlich eher selten Bootp-Kommunikationen im Netz zu verzeichnen sind. Es bietet sich daher an, den Bootp-Server nur bei Bedarf zu aktivieren und dies ist die Aufgabe von inetd:
user@sonne> grep bootp /etc/inetd.conf bootps dgram udp wait root /usr/sbin/bootpd /etc/bootptab |
Wird anstatt des »inetd« der xinetd verwendet, ist die Datei /etc/xinetd.conf der entsprechende Anlaufpunkt:
user@sonne> cat /etc/xinetd.conf ... bootps { socket_type = dgram wait = no user = root server = /usr/bin/bootpd server_args = /etc/bootptab } ... |
Neben dem »(x)inetd-Modus« lassen sich Bootp-Server und Bootp-Gateway ebenso als Daemon betreiben (»Standalone-Modus«). Die Aufrufe besitzen folgende Syntax:
bootpd [ -t Timeout -d Debuglevel -c chdir-path ] [ bootptab [ dumpfile ] ] bootpgw [ -t Timeout -d Debuglevel ] Bootp-Server |
Die Kommandozeilenparameter bedeuten (auf einige veraltete Optionen haben wir bewusst verzichtet):
-t Timeout
-d
-c chdir-path
bootptab
dumpfile
Server
Obwohl die Datei /etc/services in den von Distributionen ausgeliefertem Zustand meist komplett bestückt ist, sollten Sie sich vergewissern, dass die entsprechenden Ports freigeschalten sind:
user@sonne> grep bootp /etc/services bootps 67/udp # Bootstrap Protocol Server bootps 67/tcp # Bootstrap Protocol Server bootpc 68/udp # Bootstrap Protocol Client bootpc 68/tcp # Bootstrap Protocol Client |
Da alle verbreiteten Bootp-Implementierungen UDP als Transportprotokoll verwenden, genügt die Existenz der ersten Zeile. Die Zeilen 3 und 4 betreffen einen Bootp-Client und sind auf Server-Seite überflüssig.
Typisch erfolgt die Konfiguration in der Datei /etc/bootptab; über die Angabe des Datenbanknamens per Kommandozeilenoption kann die Datei prinzipiell beliebig benannt werden.
Die Fülle der Parameter, die ein Bootp-Server anbieten kann, lassen sich grob in zwei Katagorien einordern. Das sind zum einen Daten, die spezifisch für einen einzelnen Client sind, wie Rechnername, Hardware- und IP-Adresse und es sind Parameter, die für eine Reihe von Clients gleichermaßen gelten (bspw. Domainname, DNS-Server oder Netzwerkmaske). Aus diesem Grund unterstützt das Datenbankformat eine Art »Makro«-Mechanismus, der die Definition von »globalen« Datensätzen erlaubt. Doch zunächst betrachten wir den allgemeinen Aufbau eines Datenbankeintrags:
Rechnername:tg[=Wert...]:tg[=Wert...]:tg[=Wert...] |
Rechnername ist dabei der aktuelle Name des Clients oder ein Dummy-Eintrag. Um einen Dummy-Eintrag von einem gültigen Rechnernamen zu unterscheiden, beginnt der Bezeichner mit einem Punkt. Solch ein Dummy definiert eine Liste von Parametern, die als eine Art Makro in anderen Einträgen eingebunden werden können.
tg steht für ein zweistelliges Symbol, deren wichtigste folgende Liste erläutert:
bf
bs
dn
ds
gw
ha
hd
hn
ht
Type der Netzhardware, so wie sie im Assigned Number RFC spezifiziert ist. Die Angabe kann numerisch oder symbolisch erfolgen. Wichtige Symbole sind:
ethernet bzw. ether | 10..100 Mb Ethernet |
ieee802 bzw. tr bzw. token-ring | IEEE 802 networks |
arcnet | ARCNET |
ax.25 | AX.25 Amateur Radio networks |
ip
lp
ms
rp
sa
sm
Tn
tc
td
ts
yd
ys
Die relative Reihenfolge der Symbole ist unerheblich mit einer Ausnahme, dass ht zwingend unmittelbar vor ha stehen muss!
Mit Ausnahme des Symbols ip darf anstelle der IP-Adresse auch der Name des Servers stehen. Allerdings muss dieser mit den dem Client zur Verfügung stehenden Mitteln in die entsprechende IP-Adresse auflösbar sein. Für einen Client, der sein Rootverzeichnis über das Netzwerk bezieht, könnten die wichtigsten Adressen bspw. in der Datei /etc/hosts aufgeführt sein. Bei der Zuweisung mehrerer IP-Adressen (nicht bei ip, sa, sw, sm und ys) an ein Symbol sind diese durch Leerzeichen voneinander zu trennen. Symbolische Rechnernamen werden dagegen durch Kommata separiert.
Die einzelnen Symbole werden durch den Doppelpunkt voneinander getrennt, tritt ein Sonderzeichen (Doppelpunkt, Komma, Gleichheitszeichen, Leerzeichen) als Bestandteil eines Parameters auf, muss dieser in Anführungszeichen gesetzt werden. Im Falle des Hardwareadresse ist anstatt der Angabe von "7F:F8:10:00:00:AF" auch kurz 7FF8100000AF möglich.
Für einige der Symbole ist die bloße Angabe dieses erlaubt (:tg:) bzw. einzig zulässig. Dies beutet: »Der Wert ist gesetzt«. Ein Beispiel ist :hn:, was bedeutet, dass der Rechnername an den Client zu senden ist.
Im Zusammenhang mit dem Makromechanismus ist das Löschen einzelner Felder nützlich, was durch :tg=@: realisiert wird.
Schließlich lassen sich lange Zeilen aufsplitten, indem an die einzelnen Bestandteile ein Backslash »\« angefügt wird.
Die nachfolgende Konfigurationsdatei definiert einige Parameter für vier Clients. Neben IP-Adresse sollen die Rechner den Domainnamen, das Gateway und die Adressen zweier DNS-Server vom Bootp-Server beziehen. Zur Demonstration wird der letzte Eintrag auf mehrere Zeilen aufgeteilt:
user@sonne> cat /etc/bootptab erde:dn=galaxis.de:ds=192.168.100.1 211.97.100.1:ht=ethernet:ha=005056AA6464:ip=192.168.100.10:sm=255.255.255.0 venus:dn=galaxis.de:ds=192.168.100.1 211.97.100.1:ht=ethernet:ha="00:52:52:EA:01:64":ip=192.168.100.11:sm=255.255.255.0 mars:dn=galaxis.de:ds=192.168.100.1 211.97.100.1:ht=ethernet:ha=77630A0B0104:ip=192.168.100.12:sm=255.255.255.0 merkur:\ dn=galaxis.de:\ ds=192.168.100.1 211.97.100.1:\ ht=ethernet:\ ha=205252EA01F4:\ ip=192.168.100.13:\ sm=255.255.255.0 |
Verringert wird der Schreibaufwand durch die Zusammenfassung der gemeinsamen Parameter in ein Makro. Eine andere Darstellung derselben Konfiguration wäre:
user@sonne> cat /etc/bootptab .default:\ dn=galaxis.de:\ ds=192.168.100.1 211.97.100.1:\ sm=255.255.255.0:\ ht=ethernet erde:tc=.default:ha=005056AA6464:ip=192.168.100.10 venus:tc=.default:ha="00:52:52:EA:01:64":ip=192.168.100.11 mars:tc=.default:ha=77630A0B0104:ip=192.168.100.12 merkur:tc=.default:ha=205252EA01F4:ip=192.168.100.13 |
Zum Testen sollten Sie den Bootp-Server zunächst im Standalone-Modus mit maximalem Debuglevel betreiben. Bez. obiger Beispielkonfiguration startet der Server bei korrekter Dateisyntax mit folgenden Statusmeldungen:
root@sonne> bootpd -d4 bootpd: info(6): bootptab mtime: Mon Jun 4 09:54:14 2001 bootpd: info(6): reading "/etc/bootptab" bootpd: info(6): read 5 entries (4 hosts) from "/etc/bootptab" |
Die weiteren Schritte zur Verifzierung der Konfiguration erfolgen auf Seite der Clients. Im entsprechenden Abschnitt finden Sie weitergehende Informationen. Hinweise zum Auslesen der Hardwareadresse eines Rechners erfahren Sie im folgenden Text zum DHCP-Server.
DHCP |
Die Möglichkeiten von BOOTP stießen aus (mind.) zwei Gründen bald auf ihre Grenzen. Den ersten Schwachpunkt offenbarte die zunehmende Verbreitung von tragbaren Computern. »Mal eben schnell« einen solchen in ein bestehendes Netz zu integrieren, scheiterte, weil hierfür die Kenntnis der Hardwareadresse unbedingt erforderlich ist. Problem Nummer 2 erwuchs mit der zunehmenden Vernetzung, wobei frei verfügbare IP-Adressen immer mehr zur Mangelware wurden. Sind mehr Rechner miteinander verbunden, als es IP-Adressen im lokalen Netzwerk gibt, schließt die statische Zuordnung einige Rechner zwangsläufig für immer von der Kommunikation aus. Nun ist es in der Praxis selten der Fall, dass alle Rechner eines Netzwerks gleichzeitig laufen, sodass »meist« genügend Adressen für die aktiven Clients vorhanden sind. Mit der dynamischen Adressverteilung kann somit i.d.R. jeder Rechner mit einer Adresse versehen werden.
Maximale Flexibilität erlangt DHCP durch drei verschiedene Verfahrensweisen bei der Zuteilung von IP-Adressen an einen Client:
Statische Zuordnung
Automatische Zuordnung
Dynamische Zuordnung
Der gesteigerte Variation der Kommunikation spiegelt sich ebenso in der Anzahl der Anfragen und Antworten wider, die Client und Server miteinander austauschen (können):
DHCPDISCOVER
DHCPOFFER
DHCPREQUEST
DHCPACK
DHCPNACK
DHCPDECLINE
DHCPRELEASE
DHCPINFORM
Seine Konfiguration liest der Server aus der Datei /etc/dhcp.conf. Sie enthält alle Anweisungen über zu bedienende Netzwerke, Rechner und die zu verteilenden Konfigurationsdateien.
user@sonne> cat /etc/dhcpd.conf subnet 192.168.100.0 netmask 255.255.255.0 { # --- default gateway option routers 192.168.100.1; option subnet-mask 255.255.255.0; # option nis-domain "nisdomain.de"; option domain-name "galaxis.de"; option domain-name-servers 192.168.100.100; option time-offset 1; # option ntp-servers 192.168.1.1; # option netbios-name-servers 192.168.1.1; # --- Selects point-to-point node (default is hybrid). Don't change this unless # -- you understand Netbios very well # option netbios-node-type 2; # range dynamic-bootp 192.168.100.10 192.168.100.99; range 192.168.100.10 192.168.100.99; default-lease-time 21600; max-lease-time 43200; # we want the nameserver to appear at a fixed address # host ns { # next-server marvin.redhat.com; # hardware ethernet 12:34:56:78:AB:CD; # fixed-address 207.175.42.254; # } } |
Für den Fall, dass bestimmte IP-Adressen an konkrete Rechner gebunden werden müssen (bei Servern macht dies sicherlich Sinn), ist das Ermitteln der Hardwareadresse erforderlich. Ein Weg führt über das Kommando ifconfig, wozu allerdings der Gang zu jedem in Frage kommenden Rechner (bez. eine entfernte Sitzung) erforderlich wird:
user@sonne> /sbin/ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:00:CC:E9:1E:37 inet addr:192.168.100.11 Bcast:192.168.100.255 Mask:255.255.255.0 UP brOADCAST NOtrAILERS RUNNING MTU:1500 Metric:1 RX packets:65 errors:0 dropped:0 overruns:0 frame:0 TX packets:149 errors:0 dropped:1 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:6884 (6.7 Kb) TX bytes:22860 (22.3 Kb) Interrupt:11 Base address:0xa000 |
Effektiver ist wohl das Auslesen des arp-Caches, also des Puffers, der die Hardware-Adressen zu jedem in »letzter Zeit« (die Dauer ist abhängig von der Gültigkeit eines solches Eintrags) kontaktierten Rechner enthält.
user@sonne> /sbin/arp -a erde.galaxis.de (192.168.100.99) at 00:00:1E:D9:4C:A5 [ether] on eth0 mars.galaxis.de (192.168.100.22) at 00:00:3F:D0:4D:D4 [ether] on eth0 |
Um alle derzeit im lokalen Netz befindlichen Rechner zu erfassen, ließe sich ein ping in einer Schleife über alle IP-Adressen absetzen.
Eine weitere Möglichkeit bietet das Kommando tcpdump, wozu die Netzwerkkarte allerdings im so genannten PROMISC-Modus laufen muss. Folgender Aufruf findet die Hardwareadressen aller aktiven Rechner des lokalen Netzes:
root@sonne> tcpdump -qte broadcast and port bootpc |
I.d.R. genügt der bloße Aufruf des Kommandos dhcpd zum Start des Servers, womit der Serverprozess sich automatisch in den Hintergrund begibt und alle Parameter in der Voreinstellung übernimmt. Über mehrere Kommandozeilenoptionen lässt sich das Verhalten beeinflussen:
dhcpd [ -p port ] [ -f ] [ -d ] [ -q ] [ -cf config-file ] [ -lf lease-file ] [ if0 [ ...ifN ] ] |
-cf config-file
-d
-f
-lf lease-file
-p port
-q
root@sonne> dhcpd Internet Software Consortium DHCP Server 2.0pl3 Copyright 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved. Please contribute if you find this software useful. For info, please visit http://www.isc.org/dhcp-contrib.html Listening on Socket/eth1/172.16.45.0 Sending on Socket/eth1/172.16.45.0 Listening on Socket/eth0/192.168.100.0 Sending on Socket/eth0/192.168.100.0 |
Anmerkung: Der folgende Abschnitt basiert auf einer Ausarbeitung von Bernd Reimann.
Langer Titel - kurze Rede.
Wenn Sie in Ihrem Netzwerk mit DHCP arbeiten, ist es leider so, dass keinerlei Namensauflösung funtioniert. Um
Ihre Clients mit Namen ansprechen zu können, bedarf es einiges an Handarbeit und auch einiges an konsequenter
Update-Arbeit, woran es meist scheitert.
Mit der Kombination von DNS und DHCP gehört dies alles der Vergangenheit an. Diese beiden Server bieten Ihnen die Möglichkeit, die Adressen dynamisch vergeben zu lassen und auch dynamisch in Ihrem Nameserver einzupflegen. Einige wenige Handgriffe und Änderungen in der Datei »dhcp.conf« genügen und schon können Sie sich ruhig zurücklehnen und die Arbeit anderen - nämlich den Servern - überlassen.
# /etc/dhcpd.conf server-identifier ns1.zoneA.de; authoritative; # Dies ist die wichtigst Zeile. Sie spezifiziert die Methode, wie Updates # an den Server übertragen werden. ddns-update-style interim; ddns-updates on; # Dies ist die gleiche Key-Definition, wie sie # bereits in der /etc/named.conf zu finden ist key rndckey { algorithm hmac-md5; secret "secret_md5_hash"; }; # oder include "/etc/rndc.key"; # Hier werden die Zonen und die Schlüssel festgelegt zone zoneA.de. { primary ns1.zoneA.de; key rndckey; } zone 0.1.10.in-addr.arpa. { primary ns1.zoneA.de; key rndckey; } # Hier verbieten wir noch den Clients selbstständig # Updates an den DNS-Server zu geben, da allein der # DHCP-Server diese Aufgabe übernehmen soll deny client-updates; allow unknown-clients; |
Sie sehen lediglich die Art der Kommunikaton muss festgelegt werden und schon können die beiden Server kommunizieren.
Genauere Informationen zu den Schlüsseln und DNS finden Sie hier.
Clientseitig müssen nun noch der Eintrag send host-name "mars" in die /etc/dhclient.conf eingetragen werden, damit der DHCP-Server den Hostnamen einer IP-Adresse zuordnen kann und diese beiden beim DNS registrieren kann
user@sonne> /sbin/arp Address HWtype HWaddress Flags Mask Iface mars.zoneA.de ether xx:xx:xx:xx:xx:xx C eth0 ns1.zoneA.de ether xx:xx:xx:xx:xx:xx C eth0 |
user@sonne> tail /var/log/messages ns1 dhcpd: DHCPREQUEST for 10.1.0.208 from xx:xx:xx:xx:xx:xx (mars) via eth0 ns1 dhcpd: DHCPACK on 10.1.0.208 to xx:xx:xx:xx:xx:xx (mars) via eth0 ^^^^ send host-name "mars" |
Booten übers Netz |
Im 2-Jahres-Turnus stellt man mit Bedaueren fest, dass der einst so moderne Computer so gar nicht mehr zu den Reißern zählt; die eine oder andere Software stottert träge vor sich hin; das aktuellste Actionspiel erreicht die Dynamik einer Blitzschach-Partie...
Es wird Zeit für die Aufrüstung. Der Gang zum Händler beginnt mit einer Belehrung des besserwissenden Angestellten, dass unser Mainboard für die neuen Prozessoren nicht geeignet ist. Das Netzteil ist unterdimensioniert und mit dem langsamen Speicher dürfe man das System auf gar keinen Fall ausbremsen! Ach ja, die alte Grafikkarte passt selbstverständlich auch nicht zum performanten Aufrüstpaket, ganz zu schweigen vom Kopfschmerz provozierenden Festfrequenzmonitor.
Als Resultat wird man zum Besitzer eines Zweitrechners, denn für die paar Kröten, die der Händler für das gute Stück noch anrechnen wollte, stellt man ihn dann doch lieber in die Besenkammer...