Copyright © 1996 by O'Reilly/International Thomson Verlag

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches "Linux: Wegweiser durch das Netzwerk" dann klicken Sie hier.


Kapitel 5
TCP/IP-Konfiguration

In diesem Kapitel werden wir uns mit den Schritten befassen, die nötig sind, um Ihr Linux-System für TCP/IP einzurichten. Angefangen mit der Zuordnung von IP-Adressen arbeiten wir uns langsam durch die Konfiguration der Netzwerk-Schnittstellen und stellen einige Werkzeuge vor, die recht nützlich sind, um eventuellen Problemen mit Ihrer Netzwerk-Installation nachzuspüren.

Den Großteil der Tätigkeiten, die dieses Kapitel behandelt, werden Sie nur einmal erledigen müssen. Danach müssen Sie die meisten Konfigurations-Dateien nur noch anfassen, wenn Sie eine neue Maschine zu Ihrem Netz hinzufügen oder wenn sie Ihr System völlig neu konfigurieren. Einige der Befehle, die zur Initialisierung von TCP/IP dienen, müssen allerdings jedes Mal ausgeführt werden, wenn Ihr System bootet. Dies geschieht normalerweise durch die /etc/rc-Skripten.

Gewöhnlich ist der netzwerkspezifische Teil der Boot-Prozedur in einem Skript namens /etc/rc.net oder /etc/rc.inet enthalten. Manchmal werden Sie auch zwei Skripten namens rc.inet1 und rc.inet2 vorfinden, wobei ersteres den Kernel-Teil des Netzwerk-Kodes initialisiert und letzteres die wichtigsten Netzwerk-Dienste und -Applikationen startet. Im folgenden werde ich mich an diese Unterteilung halten.

Zunächst werde ich die Aufgaben von rc.inet1 beschreiben und die verschiedenen Applikationen für spätere Kapitel aufheben. Dieses Kapitel soll Ihnen dabei helfen, eine Befehlsfolge zusammenzustellen, die TCP/IP auf Ihrem System korrekt initialisiert. Diese Befehle sollten Sie in rc.inet1 eintragen (und dabei eventuell vorhandene Beispiele löschen).

Einrichten des proc-Dateisystems

Die meisten Konfigurations-Tools der Net-3-Familie kommunizieren mit dem Kernel über das proc-Dateisystem, auch kurz procfs genannt. Das procfs ist eine Kernel-Schnittstelle, die den Zugang zu verschiedenen Laufzeit-Informationen des Betriebssystems über einen Dateisystem-ähnlichen Mechanismus bereitstellt. Wenn das procfs gemountet ist, können Sie seine Dateien wie die jedes anderen Dateisystems auflisten oder ihren Inhalt auslesen. Typische Beispiele sind die Dateien loadavg, die die Systemauslastung enthält, und meminfo, die die aktuelle Belegung des System- und Swap-Speichers anzeigt.

Dem fügt der Netzwerk-Kode das Verzeichnis net hinzu. Es enthält eine Reihe von Dateien, die Dinge wie die ARP-Tabellen, den Zustand aller TCP-Verbindungen und die Routing-Tabellen enthalten. Die meisten Administrations-Werkzeuge aus dem Netzwerkbereich erhalten ihre Informationen aus diesen Dateien.

Das procfs wird gewöhnlich während des Sytemstarts am Verzeichnis /proc gemountet. Die einfachste Methode ist, folgende Zeile in /etc/fstab einzufügen:

# Geraet   Verzeichnis   Typ        Flags
  none     /proc         proc       defaults

Anschließend müssen Sie nur noch den Befehl »mount /proc« von Ihrer /etc/rc-Datei aus aufrufen.

Heutzutage ist procfs in den meisten vorkompilierten Kerneln bereits eingebunden, da es auch von anderen Dienstprogrammen wie ps benutzt wird. Wenn Ihr Kernel procfs wider Erwarten nicht enthalten sollte, sehen Sie eine Meldung wie »mount: fs type procfs not supported by kernel.« In diesem Falle müssen Sie einen neuen Kernel bauen und mit »y« antworten, wenn Sie nach Unterstützung für das procfs gefragt werden.

Installation der Programme

Wenn Sie eine der vorkonfigurierten Linux-Distributionen benutzen, enthält sie sehr wahrscheinlich die größeren Netzwerk-Applikationen und Dienstprogramme mitsamt einem Satz von Konfigurations-Beispielen. Die einzige Gelegenheit, bei der Sie diese Programme unter Umständen durch neuere ersetzen müssen, ergibt sich bei der Installation eines neuen Kernels. Da neue Kernel-Versionen manchmal auch Veränderungen der Netzwerk-Schnittstelle mit sich bringen, kann es passieren, daß die alten Programme seltsame Fehlermeldungen bringen, nur halb funktionieren oder im harmlosesten Fall einfach die neuesten Funktionen noch nicht unterstützen. Das bedeutet auf jeden Fall, daß Sie Programme wie ifconfig, route etc. neu kompilieren müssen, manchmal benötigen Sie aber auch eine ganz neue Version. Sie finden diese Programme in einem Archiv namens net-tools-XXX.tar.gz, wobei XXX die Versionsnummer des frühesten Kernels ist, ab dem sie gültig sind.

Wenn Sie bestimme Standard-Applikationen selbst kompilieren und installieren wollen, finden Sie die Quellen dafür auf den meisten Linux FTP-Servern. Es handelt sich bei ihnen oft um mehr oder weniger heftig modifizierte Programme aus BSD Net2 oder BSD-4.4. Andere Applikationen wie Mosaic, xarchie oder gopher müssen Sie sich oft anderweitig besorgen. Die meisten lassen sich ohne Probleme umstandslos aus der Mailbox heraus kompilieren.

Die offizielle FTP-Site für Net-3 ist sunacm.swan.ac.uk, die von sunsite.unc.edu im Verzeichnis system/Network/sunacm gespiegelt wird. sunsite wiederum wird von mehreren deutschen FTP-Servern gespiegelt, z. B. von ftp.gwdg.de unter /pub /linux/mirrors/sunsite. Der ISDN-Treiber von Mathias Urlichs ist von ftp.uni-stuttgart.de im Verzeichnis /pub/systems/linux/isdn erhältlich.

Noch ein Beispiel

Für den Rest des Buches möchte ich ein weiteres Beispiel vorstellen, das weniger komplex als die Groucho-Marx-Universität ist, aber wahrscheinlich eher mit den Aufgaben vergleichbar ist, denen Sie gegenüberstehen. Betrachten wir die Virtuelle Brauerei, eine kleine Firma, die, wie der Name schon sagt, virtuelles Bier braut. Um ihr Geschäft effizienter führen zu können, wollen die virtuellen Brauer ihre Computer vernetzen, die zufällig alle PCs sind, auf denen ein funkelnagelneues Linux 1.2 läuft.

Im selben Stockwerk gegenüber ist die Virtuelle Kellerei, die eng mit der Brauerei zusammenarbeitet. Sie hat ihr eigenes Ethernet. Natürlich wollen die beiden Firmen ihre Netze miteinander verbinden, sobald sie einsatzbereit sind. Als ersten Schritt wollen sie ein Gateway einrichten, das Pakete zwischen den beiden Netzen überträgt. Später möchten sie auch eine UUCP-Verbindung zur Außenwelt aufbauen, durch die sie Mail und News transportieren wollen. Längerfristig wünschen sie sich auch eine SLIP-Verbindung ins Internet.

Setzen des Hostnamens

Die meisten, wenn nicht gar alle Netzwerk-Applikationen verlassen sich darauf, daß der Name Ihrer Maschine einen sinnvollen Wert hat. Er wird im Normalfall während der Boot-Prozedur mit dem Befehl hostname gesetzt. Um den Hostnamen auf foo zu setzen, rufen Sie so auf:

# hostname foo

Es ist üblich, hier den unqualifizierten Namen ohne jede Domain-Angabe zu verwenden. Die Rechner der Virtuellen Brauerei könnten beispielsweise vlager.vbrew.com, vale.vbrew.com usw. heißen. Das sind ihre offiziellen, voll qualifizierten Hostnamen. Die jeweils erste Komponente wird nun oft für den lokalen Hostnamen benutzt, wie z. B. vlager. Da dieser lokale Name aber häufig dann verwendet wird, wenn eine Applikation die IP-Adresse des Rechners, auf dem sie läuft, herausfinden will, müssen Sie sicherstellen, daß der Resolver diesen Namen kennt. Das bedeutet im allgemeinen, daß Sie diesen Namen in der Datei /etc/hosts eintragen müssen (mehr dazu gleich).

Manche Leute schlagen vor, mit dem Kommando domainname dem Kernel die Domain-Komponente des Hostnamens mitzuteilen, so daß man anschließend die Ausgabe von hostname und domainname einfach nur kombinieren müßte, um wieder den vollständigen Namen zu erhalten. Das ist bestenfalls zur Hälfte richtig, da der Befehl domainname eigentlich nur die NIS-Domain Ihres Systems festlegt, die mit der DNS-Domain, der Ihr Rechner angehört, nicht viel zu tun haben muß. (NIS wird in Kapitel 10, Das »Network Information System« behandelt.)

Neuere Versionen des hostname-Befehls sind in der Lage, den voll qualifizierten Hostnamen aus dem lokalen Namen abzuleiten.

IP-Adressen zuweisen

Wenn Sie Ihren Rechner für den Standalone-Betrieb konfigurieren (zum Beispiel, um nur das Newssystem INN laufen zu lassen), können Sie diesen Abschnitt getrost überspringen. In diesem Falle brauchen Sie nur eine einzige IP-Adresse für das Loopback-Interface, die immer 127.0.0.1 lautet.

In echten Netzen wie einem Ethernet liegen die Dinge ein wenig komplizierter. Wenn Sie sich an ein existierendes Netz anschließen wollen, müssen Sie dessen Administratoren bitten, Ihnen eine IP-Adresse zuzuweisen. Wenn Sie aber Ihr eigenes Netz aufbauen, müssen Sie selber die Adressen verteilen, wie im folgenden näher beschrieben wird.

Alle Hosts innerhalb eines physikalischen Netzes sollten üblicherweise Adressen aus demselben logischen IP-Netz verwenden. Daher müssen Sie Ihrem Netz zuerst eine IP-Netzwerk-Adresse zuweisen. Wenn Ihre Installation aus mehreren physikalisch unabhängigen Teilnetzen besteht, benötigen Sie für jedes Teilnetz eine eigene Adresse. In den allermeisten Fällen werden Sie zu diesem Zweck den zur Verfügung stehenden Adreßbereich in mehrere Subnetze unterteilen.

Was für eine IP-Adresse Sie wählen, hängt stark davon ab, ob Sie für die nähere Zukunft den Sprung ins Internet planen oder nicht. Wenn ja, sollten Sie bereits jetzt eine offizielle Internet-Adresse beantragen, da Ihnen das später eine mühselige Neueinrichtung Ihres Netzes erspart. Der beste Weg ist, Ihren Service-Anbieter dabei um Hilfe zu bitten. Wenn Sie eine IP-Adresse nur für den Fall beantragen wollen, daß Sie Ihr Netz irgendwann einmal ans Internet anschließen werden, sollten Sie sich einen IP-Adreßantrag von Ihrem Netzwerk-Provider besorgen.

Ist Ihr Netz nicht mit dem Internet verbunden, und wird es auch in Zukunft nicht sein, können Sie sich theoretisch eine völlig beliebige Adresse aussuchen. Sie müssen nur sicherstellen, daß keine Pakete aus Ihrem internen Netz ins Internet entkommen können. Um völlig sicherzugehen daß kein Schaden entsteht, selbst wenn dies einmal passieren sollte, sollten Sie eine der IP-Netze verwenden, die für die private Nutzung reserviert sind. Die Internet Assigned Numbers Authority (IANA -- so etwas wie die Zulassungsstelle für die Datenautobahn) hat mehrere Netzwerk-Nummern der Kategorien A, B und C reserviert, die Sie benutzen können, ohne sie registrieren zu müssen. Diese Adressen sind nur innerhalb Ihres privaten Netzes gültig und werden nicht zwischen echten Internet-Systemen geroutet. Die Adressen (definiert in RFC 1597) sind:


---------------------------------------
Kategorie  Netze                         
---------------------------------------
A          10.0.0.0                      
B          172.16.0.0 bis 172.31.0.0     
C          192.168.0.0 bis 172.31.255.0  
---------------------------------------

Der zweite und dritte Block enthält dabei jeweils 16 bzw. 256 Netze.

Allerdings ist es nicht nur dann sinnvoll, eine Adresse aus diesem Bereich zu wählen, wenn Ihr Netz völlig vom Internet abgeschnitten ist; ein solches Netz hilft Ihnen auch, den Zugriff von außen auf Maschinen in Ihrem Netz auf ein einzelnes Gateway zu beschränken. Innerhalb Ihres Netzes wäre das Gateway über seine interne Adresse von allen Maschinen aus erreichbar, während es der Außenwelt unter seiner offiziellen Adresse bekannt wäre. Fremde Systeme könnten aber im allgemeinen Rechner innerhalb Ihres Netzes nicht erreichen, da deren Adressen im Internet nicht geroutet werden.

Im folgenden werden wir annehmen, daß die Netzwerk-Administratorin der Brauerei eine IP-Adresse der Kategorie B verwendet, z. B. 172.16.0.0. Natürlich würde ein Netz der Klasse C vollkommen für alle Systeme der Brauerei und der Kellerei ausreichen. Ich verwende nur der Einfachheit halber ein Klasse-B-Netz, da es die Subnettierung leichter verständlich macht.

Einrichten von Subnetzen

Um mehrere Ethernets oder Token-Ringe in einem IP-Netz zu betreiben, müssen Sie Ihren Adreßbereich unterteilen. Bitte beachten Sie, daß eine Subnettierung nur notwendig wird, wenn Sie mehr als ein Broadcast-Netz haben; Punkt-zu-Punkt-Verbindungen wie SLIP und PPP zählen hier nicht. Wenn Sie beispielsweise ein Ethernet und eine oder mehrere SLIP-Verbindungen in die weite Welt unterhalten, besteht kein Bedarf an mehreren Subnetzen. Warum das so ist, werden wir später in Kapitel 7 erläutern.

Um zwei Ethernets bedienen zu können, entscheidet sich die Netz-Administratorin, 8 Bits des Host-Teils der Adresse als zusätzliche Subnetz-Bits zu verwenden. Damit bleiben weitere 8 Bits für den Host-Teil, womit pro Subnetz 254 Adressen möglich sind. Der Brauerei teilt sie das Subnetz 1 zu und der Kellerei Subnetz 2. Die jeweiligen Netzwerk-Adressen sind dann 172.16.1.0 und 172.16.2.0, und die Netzmaske ist 255.255.255.0.

vlager, das als Gateway zwischen den zwei Netzen fungiert, erhält auf beiden jeweils die Hostnummer 1, was eine IP-Adresse von 172.16.1.1 bzw. 172.16.2.1 ergibt. Abbildung 5--1 zeigt die beiden Subnetze und das Gateway.

Abbildung 5-1. Virtuelle Brauerei und Virtuelle Kellerei -- die zwei Subnetze.

Die Dateien hosts und networks

Nachdem Sie Ihr Netz subnettiert haben, benötigen Sie für den Anfang eine einfache Art der Namensauflösung, die auf der Datei /etc/hosts basiert. Wenn Sie nicht vorhaben, DNS oder NIS zu benutzen, müssen Sie sogar alle Maschinen in Ihrem Netz in dieser Datei eintragen.

Aber auch, wenn Sie im normalen Betrieb DNS oder NIS einsetzen, ist es bequem, einen Teil der Rechnernamen in /etc/hosts zu haben. Oft möchte man nämlich auch während des Bootens, wenn noch keine Netzwerk-Schnittstellen aktiv sind, symbolische Namen verwenden, beispielsweise im Skript rc.inet1. Sollten Sie einmal gezwungen sein, alle IP-Adressen zu ändern, müssen Sie nur noch die modifizierte hosts-Datei auf allen Rechnern installieren und die Systeme neu starten, anstatt sämtliche rc-Dateien von Hand zu editieren. Normalerweise werden Sie alle lokalen Rechner in /etc/hosts eintragen, zusammen mit eventuell vorhandenen Gateways und NIS-Servern.

Außerdem sollten Sie während der anfänglichen Testphase nur Informationen aus der hosts-Datei verwenden. In manchen Distributionen enthalten die Konfigurations-Dateien für NIS und DNS Beispiele, die für seltsame Effekte sorgen können, wenn sie verwendet werden. Um sicherzustellen, daß alle Applikationen ausschließlich /etc/hosts verwenden, wenn Sie die Adresse eines Systems suchen, müssen Sie die Datei /etc/host.conf editieren. Kommentieren Sie alle Zeilen aus, die mit dem Schlüsselwort order beginnen, indem Sie ein Doppelkreuz voranstellen, und fügen Sie folgende Zeile ein:

order hosts

Die Konfiguration der Resolver-Bibliothek wird ausführlich in Kapitel 6, Resolver und NameServer behandelt.

Die Datei hosts enthält einen Eintrag pro Zeile, bestehend aus der IP-Adresse, dem Hostnamen und einer optionalen Liste von Aliases. Die Felder sind durch Leerzeichen oder Tabulatoren voneinander getrennt, und das Adreßfeld muß in Spalte eins beginnen. Ein Doppelkreuz leitet einen Kommentar ein.

Namen können entweder voll qualifiziert oder relativ zur lokalen Domain sein. Für vale würden Sie beispielsweise sowohl den vollständigen Namen vale.vbrew.com eintragen als auch vale ohne Domain-Angabe, so daß das System sowohl unter seinem offiziellen als auch unter dem kürzeren lokalen Namen bekannt ist.

Das folgende Beispiel zeigt, wie die Datei hosts in der virtuellen Brauerei aussehen könnte. Neben den normalen Namen sehen Sie zwei spezielle Einträge, vlager-if1 und vlager-if2, die die Adressen für die beiden Schnittstellen des Gateway-Systems festlegen.

#
# Hosts-Datei fuer die Virtuelle Brauerei und die Virtuelle Kellerei
#
# IP            FQDN                  Aliase
#
127.0.0.1       localhost
#
172.16.1.1      vlager.vbrew.com      vlager vlager-if1
172.16.1.2      vstout.vbrew.com      vstout
172.16.1.3      vale.vbrew.com        vale
#
172.16.2.1      vlager-if2
172.16.2.2      vbeaujolais.vbrew.com vbeaujolais
172.16.2.3      vbardolino.vbrew.com  vbardolino
172.16.2.4      vchianti.vbrew.com    vchianti

Genau wie für IP-Adressen möchte man manchmal auch symbolische Namen für Netzwerk-Nummern verwenden. Aus diesem Grunde gibt es parallel zu /etc/hosts die Datei /etc/networks, um Netzwerknamen auf Adressen abzubilden und umgekehrt. In der Virtuellen Brauerei würden wir etwa folgende networks-Datei installieren:

#
# Networks-Datei fuer die Virtuelle Brauerei und Virtuelle Kellerei
#
brew-net        172.16.1.0
wine-net        172.16.2.0
loopback        127.0.0.0

Das Netz loopback kann für die Konfiguration der Loopback-Schnittstelle benutzt werden, wie weiter unten gezeigt wird.

Schnittstellen-Konfiguration für IP

Nachdem Sie Ihre Hardware wie im vorigen Kapitel beschrieben eingerichtet haben, müssen Sie sie der Netzwerk-Ebene des Kernels bekanntmachen. Zur Konfiguration der Schnittstellen und Initialisierung der Routing-Tabelle sind zwei Befehle von besonderer Bedeutung, nämlich ifconfig (wobei »if« für Interface steht) und route. Sie werden gewöhnlich aus rc.inet1 heraus aufgerufen.

ifconfig dient dazu, eine Schnittstelle für die Netzwerkschicht des Kernels sichtbar zu machen. Das beinhaltet die Zuweisung einer IP-Adresse und verschiedener anderer Paremeter sowie die Aktivierung der Schnittstelle. Die einfachste Art, es auzurufen, ist:

# ifconfig interface ip-adresse

Das weist interface die Adresse ip-adresse zu und aktiviert es. Alle anderen Parameter werden auf voreingestellte Werte gesetzt. Die Netzmaske zum Beispiel wird aus der Kategorie der Adresse abgeleitet; für ein Klasse-B-Netz wäre das 255.255.0.0. Wir werden uns am Ende des Kapitels noch ausführlicher mit ifconfig befassen.

route erlaubt Ihnen, Routen in die Routing-Tabelle des Kernels einzutragen oder aus ihr zu entfernen. Es kann aufgerufen werden als

# route [add|del] target

Dabei bestimmt das zweite Argument, ob die Route eingetragen oder entfernt wird.

Die Loopback-Schnittstelle

Die allererste Schnittstelle, die aktiviert werden muß, ist das Loopback-Interface:

# ifconfig lo 127.0.0.1

Manchmal werden Sie auch sehen, daß anstelle der IP-Adresse der Name localhost verwendet wird. ifconfig wird diesen Namen in der Datei hosts nachschlagen, wo er als Hostname für 127.0.0.1 definiert sein sollte:

# Eintrag fuer localhost
127.0.0.1       localhost

Um die Konfiguration einer Schnittstelle anzuzeigen, rufen Sie ifconfig nur mit dem Namen der Schnittstelle auf:

# ifconfig lo
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Bcast:127.255.255.255  Mask:255.0.0.0
          UP BROADCAST LOOPBACK RUNNING  MTU:2000  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0
          TX packets:0 errors:0 dropped:0 overruns:0

Wie Sie sehen, ist der Loopback-Schnittstelle die Netzmaske 255.0.0.0 zugewiesen worden, weil 127.0.0.1 eine Klasse-A-Adresse ist. Die Broadcast-Adresse ist auf den voreingestellten Wert gesetzt worden, in diesem Falle also 127.255.255.255.

Frühe Kernels der Serie 1.1 setzten die Broadcast-Adresse der Loopback-Schnittstelle übrigens nicht automatisch, da das niemand sehr sinnvoll fand. Später stellte sich aber heraus, daß das sehr wichtig ist, falls das Kommando rwho richtig funktionieren soll.(1) Sollten Sie noch einen älteren Kernel fahren, aber Wert auf rwho legen, müssen Sie die Broadcast-Adresse von Hand setzen, was weiter unten im Abschnitt Alles über ifconfig beschrieben wird.

Jetzt können Sie fast schon anfangen, mit Ihrem »Mini-Netz« zu spielen. Was noch fehlt, ist ein Eintrag in der Routing-Tabelle, der festlegt, daß diese Schnittstelle als Route für das Netz 127.0.0.0 dient. Das erreichen Sie, indem Sie eingeben:

# route add 127.0.0.0

Natürlich können sie auch hier wieder anstelle der IP-Adresse den Namen localhost verwenden.

Als nächstes sollten Sie sich mit dem Programm ping davon überzeugen, daß alles einwandfrei funktioniert. ping ist das netztechnische Äquivalent eines Sonars(2) und wird benutzt, um festzustellen, ob ein System überhaupt erreichbar ist und wie lange ein Paket zu diesem System und zurück benötigt. Diese Zeit wird auch oft als round-trip time bezeichnet.

# ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=32 time=1 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=32 time=0 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=32 time=0 ms
^C
--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0 packet loss
round-trip min/avg/max = 0/0/1 ms

Wenn Sie ping wie hier gezeigt aufrufen, wird es fortwährend Pakete aussenden, bis Sie es unterbrechen. Das \verb|^C| oben markiert die Stelle, an der wir Ctrl-C gedrückt haben.

Das obige Beispiel zeigt, daß Pakete an 127.0.0.1 korrekt ausgeliefert werden und nahezu augenblicklich eine Antwort an ping zurückgeschickt wird. Das beweist, daß Sie Ihre erste Netzwerkschnittstelle erfolgreich konfiguriert haben.

Wenn ping eine völlig andere Ausgabe produziert als hier dargestellt, haben Sie ein Problem. Prüfen Sie, ob irgendwelche Fehlermeldungen nahelegen, daß eine Datei nicht korrekt installiert worden ist. Prüfen Sie außerdem, ob die verwendeten Programme ifconfig und route mit Ihrer Kernel-Version kompatibel sind und vor allem ob der Kernel mit Netzwerk-Unterstützung übersetzt wurde (letzteres erkennen Sie an der Existenz des Verzeichnisses /proc/net). Wenn Sie eine Fehlermeldung bekommen, die sinngemäß »Network Unreachable« lautet, haben Sie sich wahrscheinlich beim route-Kommando vertippt.

Die bisher beschriebenen Schritte reichen aus, um Netzwerk-Applikationen auf einem alleinstehenden Rechner zu benutzen. Nachdem Sie die zwei Aufrufe von ifconfig und route in rc.inet1 eingetragen und sichergestellt haben, daß beide rc.inet-Skripten beim Systemstart ausgeführt werden, können Sie Ihre Maschine neu booten und einige Applikationen ausprobieren. Zum Beispiel sollte »telnet localhost« eine telnet-Verbindung aufbauen und Ihnen den Login-Prompt Ihres Systems geben.

Das Loopback-Interface ist allerdings nicht nur als Beispiel in Netzwerkbüchern oder als Testumgebung während der Software-Entwicklung nützlich, sondern wird auch von einigen Applikationen während des normalen Betriebs benutzt.(3) Aus diesem Grunde müssen Sie es auf jeden Fall konfigurieren, unabhängig davon, ob Ihre Maschine an ein Netz angeschlossen ist oder nicht.

Ethernet-Schnittstellen

Die Konfiguration von Ethernet-Schnittstellen geht fast genauso vonstatten wie beim Loopback-Gerät; Sie brauchen nur ein paar Parameter mehr, um Subnetze verwenden zu können.

In der virtuellen Brauerei haben wir das IP-Netz, das ursprünglich ein Klasse-B-Netz war, in C-Subnetze unterteilt. Um das dem Interface mitzuteilen, sähe die ifconfig-Anrufung so aus:

# ifconfig eth0 vstout netmask 255.255.255.0

Dies weist der Schnittstelle eth0 die IP-Adresse von vstout zu (172.16.1.2). Hätten wir die Netzmaske weggelassen, hätte ifconfig sie aus der Netzklasse der Adresse abgeleitet, was einen Wert von 255.255.0.0 ergeben hätte. Ein schneller Test ergibt jetzt:

# ifconfig eth0
eth0      Link encap:10Mps Ethernet HWaddr  00:00:C0:90:B3:42
          inet addr:172.16.1.2 Bcast:172.16.1.255 Mask:255.255.255.0
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0
          TX packets:0 errors:0 dropped:0 overruns:0
          Interrupt:12 Base address:0x320

Wie Sie sehen, hat ifconfig die Broadcast-Adresse (im Bcast-Feld angezeigt) automatisch auf den üblichen Wert gesetzt, nämlich die Netzwerk-Nummer mit einem Host-Teil, bei dem alle Bits auf eins gesetzt sind. Außerdem wurde die maximale Übertragungseinheit (MTU -- Maximum Transmission Unit) auf das Ethernet-spezifische Maximum eingestellt.(4) Alle diese Werte können über spezielle Optionen auch mit anderen Werten besetzt werden; diese Optionen werden wir weiter unten beschreiben.

Fast wie im Falle des Loopback-Geräts müssen Sie jetzt eine Route eintragen, die dem Kernel mitteilt, welches Netz durch eth0 erreicht werden kann. Für die virtuelle Brauerei würden Sie route so aufrufen:

# route add -net 172.16.1.0

Auf den ersten Blick sieht das ein wenig wie Schwarze Magie aus, da nicht ohne weiteres klar ist, wie route eigentlich wissen soll, daß wir hiermit die Ethernet-Schnittstelle meinen. Der Trick ist aber relativ simpel: Der Kernel prüft alle bisher konfigurierten Interfaces und vergleicht das Zielnetz (in unserem Falle 172.16.1.0) mit der Netznummer der Interface-Adresse, d. h. dem bitweisen UND der Interface-Adresse und der Netzmaske. Die einzige Schnittstelle, bei der diese beiden Werte übereinstimmen, ist eth0.

Aber was soll dann die Option -net? Sie wird nötig, da route sowohl Routen zu ganzen Netzen als auch zu einzelnen Maschinen einrichten kann, wie Sie oben bereits am Beispiel der localhost-Route gesehen haben. Wenn Sie route eine IP-Adresse in Dezimalnotation übergeben, versucht es zu erraten, obe es sich dabei um eine Host- oder Netzadresse handelt, indem es den Host-Teil anschaut. Ist der Host-Teil Null, nimmt es an, daß die Adresse ein Netz bezeichnet, andernfalls behandelt es sie als Host-Adresse. Aus diesem Grunde würde route in unserem Beispiel davon ausgehen, daß 172.16.1.0 eine Hostadresse ist, denn es kann ja nicht wissen, daß wir Subnetze verwenden. Darum müssen Sie ihm ausdrücklich mitteilen, daß sie ein Netz bezeichnet, indem Sie -net verwenden.

Natürlich können Sie es auch einfacher haben, indem Sie zum Beispiel die Netznamen benutzen, die wir oben in /etc/networks definiert haben. Das hat nicht nur die bekannten Vorteile bei einer Umstrukturierung Ihres Netzes, sondern macht den Befehl auch wesentlich lesbarer. Sie können nun sogar die Option -net weglassen, da route jetzt weiß, daß brew-net ein Netz bezeichnet.

# route add brew-net

Nachdem Sie die grundlegenden Konfigurations-Schritte hinter sich gebracht haben, sollten Sie überprüfen, ob Ihr Ethernet tatsächlich fröhlich vor sich hinbrummt. Wählen Sie irgendeine Maschine auf Ihrem lokalen Ethernet und geben Sie folgenden Befehl ein:

# ping vlager
PING vlager: 64 byte packets
64 bytes from 172.16.1.1: icmp_seq=0. ttl=255 time=3.1 ms
64 bytes from 172.16.1.1: icmp_seq=1. ttl=255 time=2.4 ms
64 bytes from 172.16.1.1: icmp_seq=2. ttl=255 time=4.0 ms
64 bytes from 172.16.1.1: icmp_seq=3. ttl=255 time=2.2 ms
^C
----vstout.vbrew.com PING Statistics----
4 packets transmitted, 4 packets received, 0 packet loss
round-trip (ms)  min/avg/max = 2.2/2.9/4.0

Wenn sich die Ausgabe auf Ihrem Bildschirm deutlich von dem unterscheidet, was Sie hier sehen, ist offensichtlich etwas faul. Ungewöhnlich hoher Datenverlust(5) beispielsweise legt ein Hardware-Problem nahe, wie beispielsweise ungenügende oder fehlende Terminierung. Wenn ping keinerlei Pakete zurückempfängt, sollten Sie die Schnittstellen-Statistik mit netstat überprüfen. Die Paket-Statistiken, die netstat ausgibt, sagen Ihnen, ob überhaupt Pakete über das Interface übertragen wurden. Bei manchen Karten »erkennt« Linux manchmal auch einen falschen Interrupt. Eine von Linux falsch erkannte Karte macht sich im allgemeinen dadurch bemerkbar, daß sich das Interface ohne Fehlermeldungen konfigurieren läßt, aber keine Pakete auf das Ethernet geschickt werden.

Wenn Sie außerdem Zugang zum Zielrechner Ihres ping-Versuchs haben, sollten Sie auch auf diesem die Paket-Statistiken Maschine prüfen. Auf diese Art können Sie genau feststellen, wo die Daten verlorengehen. Zusätzlich sollten Sie auf beiden Maschinen mit route die Routing-Informationen überprüfen. Wenn Sie route ohne weitere Parameter aufrufen, gibt es die Routing-Tabellen des Kernels aus. Die Option -n sorgt dafür, daß es Adressen in Dezimalnotation anstelle der symbolischen Hostnamen darstellt:

# route -n
Kernel routing table
Destination     Gateway         Genmask         Flags MSS    Window Use Iface
127.0.0.0       *               255.0.0.0       U     1936   0      112 lo
193.175.30.32   *               255.255.255.248 U     1436   0       10 eth0

Die genaue Bedeutung der einzelnen Felder wird weiter unten in Abschnitt Testen mit netstat erklärt. Die mit Flags betitelte Spalte enthält eine Liste von Flags für jede Zieladresse. U ist für aktive Schnittstellen immer gesetzt. Ein Flag H in dieser Spalte besagt, daß die Zieladresse einen einzelnen Host bezeichnet. In diesem Beispiel ist H bei keiner der beiden Routen gesetzt, da sich beide auf ein Netz beziehen. Sollte allerdings H für einen Eintrag gesetzt sein, der eigentlich eine Netzwerk-Route sein sollte, müssen Sie beim Eintragen der Route die Option -net mit angeben.

Um festzustellen, ob eine von Ihnen eingegebene Route überhaupt benutzt wird, prüfen Sie, ob sich das Feld Use zwischen zwei Aufrufen von ping erhöht.

Routing durch ein Gateway

Im vorigen Abschnitt habe ich nur beschrieben, wie Sie eine Maschine auf einem isolierten Ethernet einrichten. Der Regelfall ist allerdings, daß mehrere Netze durch Gateways miteinander verbunden sind. Diese Gateways können einfach zwei oder mehrere Ethernets miteinander verbinden, können aber auch Ihr Tor zur Außenwelt, dem Internet, darstellen. Um den Dienst eines Gateways zu nutzen, müssen Sie dem Routing-Mechanismus zusätzliche Informationen geben.

Zum Beispiel sind die Ethernets der Virtuellen Brauerei und der Virtuellen Kellerei durch solch ein Gateway miteinander verbunden, nämlich vlager. Angenommen, vlager sei bereits konfiguriert, dann müssen wir auf Maschinen wie vstout nur noch eine weitere Route eintragen, die angibt, daß alle Maschinen auf dem Netz der Kellerei über vlager erreichbar sind. Der entsprechende Aufruf von route sieht so aus:

# route add wine-net gw vlager

Dabei gibt gw an, daß das folgende Argument ein Gateway bezeichnet. Natürlich muß jedes System auf dem Kellerei-Netz einen analogen Routing-Eintrag für das Brauerei-Netz haben. Ansonsten könnten Sie nur Pakete von vstout an vbardolino schicken, aber jede Antwort von vbardolino würde im großen Biteimer landen.

Dieses Beispiel beschreibt nur ein Gateway, das Pakete zwischen zwei isolierten Ethernets befördert. Nehmen Sie nun an, daß vlager außerdem eine Verbindung ins Internet hat, beispielsweise durch einen SLIP-Link. Dann wäre es natürlich wünschenswert, daß Pakete für beliebige Zieladressen, die nicht auf dem Brauerei-Netz liegen, an vlager weitergereicht werden. Das können Sie erreichen, indem Sie vlager zum Default-Gateway für vstout machen:

# route default wine-net gw vlager

Die Netzwerk-Adresse default ist eine Abkürzung für 0.0.0.0, die Default-Route. Diesen Namen müssen Sie nicht in /etc/netqworks eintragen, er ist in route fest eingebaut.

Sollten Sie hohe Verlustraten beobachten, wenn Sie eine Maschine hinter einem Gateway mit ping ansprechen, könnte das ein Hinweis auf ein verstopftes Netz sein. In diesem Falle sind Paketverluste nicht so sehr die Folge technischer Probleme, sondern rühren von einer kurzzeitigen Überlastung der routenden Maschinen her, die dazu führt, daß ankommene Pakete verzögert oder gar weggeworfen werden.

Konfiguration eines Gateways

Es ist ziemlich einfach, eine Maschine dafür einzurichten, Pakete zwischen zwei Ethernets auszutauschen. Nehmen Sie an, wir befänden uns wieder auf vlager, das mit zwei Ethernet-Karten ausgestattet ist, die jeweils mit einem der beiden Netze verbunden sind. Alles was sie tun müssen ist, beide Schnittstellen getrennt zu konfigurieren und ihnen eine Adresse auf dem jeweiligen Subnetz zuzuweisen, und das war's. Dabei ist es recht nützlich, zusätzlich zum offiziellen Hostnamen vlager zwei Namen für die beiden Schnittstellen in /etc/hosts zu definieren:

172.16.1.1      vlager.vbrew.com vlager
172.16.1.1      vlager-if1
172.16.1.2      vlager-if2

Mit diesen Einträgen lautet die Befehlsreihenfolge für die Einrichtung von vlager so:

# ifconfig eth0 vlager-if1
# ifconfig eth1 vlager-if2
# route add brew-net
# route add wine-net

Die PLIP -- Schnittstelle

Wenn Sie PLIP verwenden, um zwei Maschinen miteinander zu vernetzen, liegen die Dinge etwas anders als bei einem Ethernet. PLIP stellt im Gegensatz zu einem Ethernet nur eine sogenannte Punkt-zu-Punkt-Verbindung her, d. h. es sind nur zwei Hosts involviert.

Als Beispiel betrachten wir den Laptop einer Angestellten der Virtuellen Brauerei, der mittels PLIP mit vlager verbunden werden kann. Der Laptop selbst heißt vlite und hat nur einen parallelen Port. Beim Booten wird dieser als plip1 registriert. Um die Verbindung zu aktivieren, muß die Schnittstelle plip1mit den folgenden Befehlen konfiguriert werden:(6)

# ifconfig plip1 vlite pointopoint vlager
# route add vlager
# route add default gw vlager

Der erste Befehl richtet das Interface ein und teilt dem Kernel mit, daß es sich dabei um eine Punkt-zu-Punkt-Verbindung handelt, deren anderes Ende die IP-Adresse 172.16.1.1 (vlager) hat. Der zweite installiert eine Route für vlager, und der dritte richtet die Default-Route mit vlager als Gateway ein. Auf vlager sind entsprechende Kommandos nötig (die Default-Route darf natürlich nicht auf vlite zeigen):

# ifconfig plip1 vlager pointopoint vlite
# route add vlite

Das Besondere an diesem Fall ist, daß die Schnittstelle plip1 auf vlager keine eigene IP-Adresse haben muß, sondern Sie ihr auch die Adresse 172.16.1.1 zuweisen können. Dies ist eine wichtige Eigenschaft von Punkt-zu-Punkt-Verbindungen.(7) Bis jetzt haben wir das Routing vom Laptop zu den Netzen der Virtuellen Brauerei eingerichtet. Jetzt fehlt noch die Möglichkeit, vlite von jedem Rechner der Virtuellen Brauerei aus zu erreichen. Eine besonders mühselige Methode ist, auf jedem System eine spezielle Route einzutragen, die vlager als Gateway für vlite angibt:

# route add vlite gw vlager

Eine viel bessere Methode, mit solchen temporären Routen zurechtzukommen, ist dynamisches Routing. Das können Sie beispielsweise mit gated, einem sogenannten Routing-Dämon verwirklichen, der die Routing-Informationen von vlager an alle anderen Maschinen im Netz verteilt. Dazu muß gated allerdings auf jeder Maschine im Netz installiert und konfiguriert werden, womit wir auch nicht viel gewonnen hätten.

Am einfachsten fahren Sie in einem solchen Fall mit Proxy-ARP. Mit dieser Methode tut vlager gegenüber allen Maschinen auf dem Brauerei-Netz so, als sei es vlite, indem es alle ARP-Anfragen mit seiner eigenen Ethernet-Adresse beantwortet. Die Folge davon ist, daß alle Pakete für vlite auf vlager landen, das sie dann an den Laptop weiterreicht. Wir werden im Abschnitt Die ARP-Tabelle auf Proxy-ARP zurückkommen.

Die SLIP-Schnittstelle

Obwohl SLIP genau wie PLIP auch nur eine einfache Punkt-zu-Punkt-Verbindung darstellt, ist die Konfiguration eines SLIP-Links wesentlich komplizierter. Zum Verbindungsaufbau gehört meist noch das Einwählen ins fremde System und die Umschaltung der seriellen Leitung auf SLIP-Betrieb. Obwohl für jeden dieser Schritte separate Programme existieren, können Sie all dies auch mit einem einzelnen Programm namens dip erreichen. dip und die Konfiguration einer SLIP-Verbindung werden detalliert in Kapitel 7, Serial Line IP beschrieben.

Die Dummy-Schnittstelle

Die Dummy-Schnittstelle ist ein wenig exotisch, aber trotzdem unter gewissen Umständen gut zu gebrauchen. Ihre wichtigste Anwendung findet sich auf isolierten Maschinen und solchen, deren einzige IP-Verbindung zur Außenwelt eine Wählverbindung, zum Beispiel über SLIP oder PPP ist. Genaugenommen sind letztere die meiste Zeit auch isoliert (im Englischen verwendet man hier den Ausdruck standalone).

Das Dilemma mit solchen »alleinstehenden« Maschinen ist, daß ihre einzige aktive Schnittstelle das Loopback-Interface ist, das immer die Adresse 127.0.0.1 trägt. Manchmal müssen Sie aber auch Daten an die »offizielle« IP-Adresse Ihres Rechners schicken können. Betrachten Sie den Laptop vlite, der für die Dauer dieses Beispiels vom Netz getrennt wurde. Ein Applikation auf vlite möchte nun Daten an eine andere Applikation auf vlite senden. Dazu sucht sie die Adresse von vlite in /etc/hosts heraus, erhält 172.16.1.65 und schickt das Paket an diese Adresse. Da aber zur Zeit das Loopback-Interface als einziges aktiv ist, kann der Kernel gar nicht wissen, daß sich diese Adresse auf den lokalen Host bezieht! Die Folge davon ist, daß er das Paket als unzustellbar wegwirft und der Applikation eine Fehlermeldung zurückliefert.

An dieser Stelle nun tritt das Dummy-Gerät auf den Plan. Es löst das Dilemma, indem es als alter ego des Loopback-Interface dient, sozusagen als Halter einer zweiten IP-Adresse. In unserem Fall würden sie ihm einfach die Adresse 172.16.1.56 geben und eine Route eintragen, die auf dieses Interface verweist. Jedes Paket an 172.16.1.56 wird daraufhin lokal ausgeliefert. Die vollständige Sequenz der Befehle ist:

# ifconfig dummy vlite
# route add vlite

Alles über ifconfig

ifconfig kennt neben den bisher vorgestellten noch eine ganze Reihe weiterer Optionen, die wir nun im einzelnen besprechen werden. ifconfig wird normalerweise so aufgerufen:

ifconfig interface [addresse [parameter]]

interface ist der Name der zu konfigurierenden Schnittstelle, und adresse ist die IP-Adresse, die ihr zugewiesen werden soll. Sie kann entweder in Dezimalnotation angegeben werden oder als Name, den ifconfig in /etc/hosts nachschlägt.

Wenn iconfig nur mit dem Interface-Namen aufgerufen wird, gibt es die Konfiguration der Schnittstelle aus. Wird es ganz ohne Parameter aufgerufen, zeigt es alle bisher konfigurierten Schnittstellen; die Option -a zwingt zusätzlich die Anzeige der inaktiven. Ein Aufruf für die Ethernet-Schnittstelle könnte beispielsweise so aussehen:

# ifconfig eth0
eth0      Link encap:10Mbps Ethernet  HWaddr 00:40:05:12:C6:54
          inet addr:172.16.1.2  Bcast:172.16.1.0 Mask:255.255.255.0
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0
          TX packets:136 errors:0 dropped:0 overruns:0
          Interrupt:15 Base address:0x340

Die Felder MTU und Metric zeigen die aktuellen Werte für die MTU und die Metrik der Schnittstelle. Die Metrik wird von einigen Betriebssystemen verwendet, um die Kosten verschiedener Routen miteinander zu vergleichen. Linux benutzt diesen Wert bisher nicht, definiert ihn aber trotzdem aus Gründen der Kompatibilität. Die von ifconfig angezeigten Flags entsprechen mehr oder weniger den Namen der Befehlsparameter und werden gleich behandelt.

Die Zeilen RX und TX zeigen, wie viele Pakete empfangen (RX -- receive) bzw. gesendet wurden (TX -- transmit), wie viele Fehler dabei auftraten, wie viele Pakete (beispielsweise aufgrund von Speichermangel) weggeworfen wurden und wie viele wegen eines Überlaufs verlorengingen. Ein Überlauf des Empfängers (engl. overrun) tritt dann auf, wenn Pakete schneller hereinkommen als der Kernel den jeweils letzten Interrupt bedienen kann.

Die folgende Liste zeigt die Parameter, die ifconfig versteht; die Namen der zugehörigen Flags stehen in Klammern. Optionen, die einen bestimmten Dienst der Schnittstelle einschalten, können auch mit vorangestelltem Minus (-) benutzt werden, um ihn wieder auszuschalten.

up
Dies aktiviert ein Interface für die IP-Schicht des Kernels. Diese Option wird impliziert, wenn auf der Kommandozeile eine Adresse angegeben ist. Die Angabe der Option allein initialisiert das Interface mit Default-Werten für die IP-Adresse etc., was normalerweise wenig sinnvoll ist.

(Diese Option entspricht den Flags UP and RUNNING.)

down
Dies markiert eine Schittstelle als inaktiv, d. h. unzugänglich für die Netzwerkschicht. Gleichzeitig werden alle Routen durch dieses Interface entfernt.
netmask
maske Dies weist der Schnittstelle eine Subnetz-Maske zu. Sie kann entweder als eine 32-Bit-Hexadezimalzahl oder als punktierter Quadrupel angegeben werden.
pointopoint
adresse Diese Option wird für Punkt-zu-Punkt-Verbindungen benutzt, die nur zwei Hosts miteinander verbinden. Sie wird beispielsweise für die Konfiguration von SLIP- und PLIP-Schnittstellen benötigt und teilt dem Kernel die IP-Adresse des anderen Systems mit.

(Wenn eine Punkt-zu-Punkt-Adresse gesetzt worden ist, zeigt ifconfig das Flag POINTOPOINT.)

broadcast
adresse Die Broadcast-Adresse wird normalerweise aus der Netzwerknummer gebildet, indem alle Bits des Host-Teils auf eins gesetzt werden. Einige IP-Implementationen (zum Beispiel von BSD 4.2 abstammende Systeme) verwenden eine andere Broadcast-Adresse; die Option broadcast dient dazu, Ihre Konfiguration an solch eine seltsame Umgebung anzupassen.

(Wenn dem Interface eine Broadcast-Adresse zugeordnet worden ist, gibt ifconfig das Flag BROADCAST aus.)

metric
wert Mit dieser Option können Sie der Schnittstelle einen Metrikwert zuordnen. Dieser Wert wird beispielsweise vom Routing Information Protocol (RIP) berücksichtigt, wenn es Routing-Tabellen für Ihr Netz erstellt.(8) Die Default-Metrik, die ifconfig einem Interface zuweist, ist Null. Wenn Sie das Routing in Ihrem Netz nicht mit RIP regeln, benötigen Sie diese Option überhaupt nicht; aber selbst wenn Sie einen RIP-Dämon einsetzen, werden Sie nur äußerst selten Verwendung dafür haben.
mtu
bytes Dies setzt die Maximum Transmission Unit MTU, d. h. die maximale Zahl von Bytes, die das Interface in einer Transaktion behandeln kann. Für Ethernets liegt der Defaultwert bei 1500; für SLIP beträgt er 296.
arp
Diese Option kann nur für Broadcast-fähige Netz wie Ethernet oder Ham-Radio verwendet werden. Sie ermöglicht die Benutzung von ARP, dem Address Resolution Protocol, zur Zuordnung von IP-Adressen zu physikalischen Adressen. Für Broadcast-Netze wird sie per Voreinstellung eingeschaltet.

(Ist ARP ausgeschaltet, zeigt ifconfig das Flag NOARP.)

-arp
Schaltet ARP explizit aus.
promisc
Versetzt die Schnittstelle in den sogenannten »promiskuösen« Modus. Auf Broadcast-Netzen hat das zur Folge, daß die Schnittstelle alle Pakete unabhängig davon empfängt, ob sie für einen anderen Host bestimmt sind oder nicht. Dadurch kann man den Netzwerk-Verkehr mit Paketfiltern wie tcpdump analysieren, um Netzwerk-Problemen nachzuspüren, denen anders nur schwer beizukommen ist.

Dieses sogenannte Packet Snooping (d. h. Schnüffeln) hat aber auch seine problematische Seite. Mit ziemlich einfachen Mitteln können potentielle Cracker den Datenverkehr Ihres Netzes nach Paßwörtern filtern oder noch viel bösartigere Dinge tun. Dagegen können Sie sich kaum schützen, es sei denn, Sie entfernen alle DOS-Boxen aus Ihrem Netz und lassen niemanden in die Nähe Ihres Ethernet-Kabels. Beides ist nicht sehr realistisch. Eine andere Möglichkeit ist, ein sicheres Authentisierungs-Protokoll zu benutzen, wie es Kerberos oder die SRA Login-Suite bietet.(9) Diese Option entspricht dem Flag PROMISC.

-promisc
Schaltet den promiskuösen Modus ab.

Testen mit netstat

Als nächstes wenden wir uns einem nützlichen Werkzeug zu, mit dem Sie die Konfiguration und die Aktivität Ihres Netzes überprüfen können. Es heißt netstat und ist eher eine ganze Sammlung von Werkzeugen, die in einem Programm zusammengepackt worden sind. Wir werden im folgenden jede seiner Funktionen in einem separaten Abschnitt besprechen.

Anzeigen der Routing-Tabellen

Wenn Sie netstat mit dem Flag -r aufrufen, gibt es die Routing-Tabellen des Kernels aus, ähnlich, wie Sie es oben bereits bei route gesehen haben. Die Option -n sorgt zusätzlich dafür, daß die Adressen anstatt als symbolische Hostnamen direkt ausgegeben werden. Das ist besonders nützlich, wenn Sie verhindern wollen, daß der Resolver langwierige Nachfragen übers Netz startet, zum Beispiel beim DNS- oder NIS-Server.

Auf vstout sieht der Aufruf ungefähr so aus:

# netstat -nr
Kernel routing table
Destination     Gateway         Genmask         Flags Metric Ref Use Iface
172.16.1.0      0.0.0.0         255.255.255.0   U     0      0   478 eth0
172.16.2.0      172.16.1.1      255.255.255.0   UG    0      0   250 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0    50 lo

Die erste Spalte zeigt jeweils das Ziel der Route an; Spalte vier enthält verschiedene Flags, die mehr über den Typ der Route sagen. Beispielsweise besagt das Flag G in der zweiten Zeile, daß es sich um eine Netzwerk-Route durch ein Gateway handelt. Das zugehörige Gateway ist in der zweiten Spalte angegeben. Geht die Route nicht durch ein Gateway, enthält die Spalte den Wert 0.0.0.0.(10)

Die dritte Spalte gibt die »Allgemeinheit« der Route an. Bei Routen, deren Ziel ein Netz ist, entspricht das der Netzmaske. Host-Routen haben eine Genmask von 255.255.255.255, und die Default-Route hat eine Maske von 0.0.0.0. Die Routing-Tabelle ist so sortiert, daß spezielle Routen (lange Genmask) vor einer allgemeineren (kurze Genmask) stehen. Sucht der Kernel nun eine passende Route zu einer gegebenen Zieladresse, nimmt er das bitweise UND der Zieladresse und der Genmask und vergleicht das Resultat mit dem Ziel der Route.

Die vierte Spalte zeigt verschiedene Flags, die die Route näher charakterisieren.

G
Die Route geht durch ein Gateway.
U
Das zu verwendende Interface ist aktiv. Das ist bei \linux{} eigentlich immer der Fall.
H
Die Route zeigt auf einen einzelnen Host.
D
Der Eintrag wurde durch einen »ICMP Redirect« erzeugt. Diese Nachricht wird im allgemeinen von einem Gateway generiert, wenn es bemerkt, daß ein Host das Paket ohne Umweg direkt an die nächste Station der Route hätte schicken können, ohne dazu das Gateway zu benutzen.
M
Der Tabelleneintrag wurde durch einen ICMP Redirect modifiziert.

Die Spalte Ref sollte die Anzahl der Referenzen auf diese Route zeigen, ist aber zur Zeit bedeutungslos. Die beiden letzten Spalten zeigen, wie viele Päckchen bereits durch sie verschickt bzw. empfangen wurden und durch welches Interface sie führt.

Anzeige der Interface-Statistiken

Wenn Sie netstat mit dem Flag -i aufrufen, gibt es die Statistiken für die gerade aktiven Netzwerk-Schnittstellen aus. Geben Sie außerdem das Flag -a mit an, werden alle im Kernel vorhandenen Schnittstellen ausgegeben, nicht nur die konfigurierten. Auf vstout produziert netstat in etwa folgendes:

$ netstat -i
Kernel Interface table
Iface   MTU Met  RX-OK RX-ERR RX-DRP RX-OVR  TX-OK TX-ERR TX-DRP TX-OVR Flags
lo        0   0   3185      0      0      0   3185      0      0      0 BLRU
eth0   1500   0 972633     17     20    120 628711    217      0      0 BRU

Die Spalten MTU und Met geben die aktuelle MTU und Metrik des Interface an. Die mit RX bzw. TX überschriebenen Spalten geben an, wie viele Pakete fehlerfrei empfangen bzw. gesendet wurden (RX-OK/TX-OK), wie viele beschädigt waren (RX-ERR/TX-ERR), wie viele wegeworfen werden mußten (RX-DRP/TX-DRP) und wie viele aufgrund eines Overruns verlorengingen (RX-OVR/TX-OVR).

Die letzte Spalte zeigt wieder die Liste der Flags, die für die Schnittstelle gesetzt sind. Das sind einbuchstabige Versionen der langen Flagnamen, die ifconfig ausgibt:

--------------
B  BROADCAST    
L  LOOPBACK     
M  PROMISC      
O  NOARP        
P  POINTOPOINT  
R  RUNNING      
U  UP           
--------------

Aktive Verbindungen und Sockets

netstat bietet eine Reihe von Optionen, mit denen Sie aktive und passive Sockets auflisten können. Die Argumente -t, -u, -w und -x zeigen aktive TCP, UDP, RAW und UNIX-Sockets. Wenn Sie zusätzlich -a angeben, sehen Sie außerdem die Sockets, die gerade auf eine Verbindung warten, weil Sie die Funktion listen() aufgerufen haben. Auf diese Weise erhalten Sie eine Liste aller Server, die derzeit auf Ihrem System laufen.

Ein Aufruf von netstat -ta ergibt auf vlager:

$ netstat -ta
Active Internet connections
Proto Recv-Q Send-Q Local Address    Foreign Address    (State)
tcp        0      0 *:domain         *:*                LISTEN
tcp        0      0 *:time           *:*                LISTEN
tcp        0      0 *:smtp           *:*                LISTEN
tcp        0      0 vlager:smtp      vstout:1040        ESTABLISHED
tcp        0      0 *:telnet         *:*                LISTEN
tcp        0      0 localhost:1046   vbardolino:telnet  ESTABLISHED
tcp        0      0 *:chargen        *:*                LISTEN
tcp        0      0 *:daytime        *:*                LISTEN
tcp        0      0 *:discard        *:*                LISTEN
tcp        0      0 *:echo           *:*                LISTEN
tcp        0      0 *:shell          *:*                LISTEN
tcp        0      0 *:login          *:*                LISTEN

Man sieht, daß die meisten Server einfach auf eine einkommende Verbindung warten, da sie sich im Zustand LISTEN befinden. Die vierte Zeile zeigt allerdings eine SMTP-Verbindung von vstout, und die sechste Zeile besagt, daß eine ausgehende telnet-Verbindung zu vbardolino besteht.(11)

Wenn Sie netstat nur mit der Option -a aufrufen, zeigt es eine kombinierte Liste aller Sockets aus allen Familien.

Die ARP-Tabelle

Bei einigen Netzproblemen kann es durchaus aufschlußreich sein, einen Blick auf die ARP-Tabelle des Kernels zu werfen oder sie sogar zu verändern. Wenn beispielsweise ein Host auf Ihrem Ethernet auf ping nicht reagiert, können Sie an der ARP-Tabelle erkennen, ob zumindest die Verbindung und die Hardware einwandfrei funktionieren oder nicht. Auf vlager sieht die Ausgabe beispielsweise so aus:

# arp -a
IP address      HW type                 HW address
172.16.1.3      10Mbps Ethernet         00:00:C0:5A:42:C1
172.16.1.2      10Mbps Ethernet         00:00:C0:90:B3:42
172.16.2.4      10Mbps Ethernet         00:00:C0:04:69:AA

Hier ist alles in bester Ordnung: In der ersten Spalte sehen Sie die IP-Adressen verschiedener Maschinen, die von vlager aus vor kurzem angesprochen wurden; in der letzten Spalte finden sich die Hardware-Adressen der Ethernet-Karten dieser Hosts.

Wenn in einem Eintrag in der letzten Spalte bei wiederholten Aufrufen statt der Ethernet-Adresse der Text (incomplete) erscheint, deutet das darauf hin, daß die Maschine entweder abgestürzt ist oder die Hardware defekt oder falsch konfiguriert ist.

Neben Ethernet wird ARP beispielsweise auch auf AX.25-Amateurfunknetzen und Token Ring eingesetzt, die aber natürlich jeweils eine andere Art der Adressierung benutzen. arp zeigt den Typ der Adresse jeweils in Spalte zwei an. Per Voreinstellung zeigt arp nur die Einträge für Ethernet-Adressen an. Um die Liste der AX.25-Adressen zu bekommen, müssen Sie es so aufrufen:

# arp -a -t ax25

Außer -a versteht arp auch noch die Optionen -s und -d. Wenn Sie arp mit der Option -d aufrufen, entfernt es alle Einträge für einen bestimmten Host, z. B. vstout:

# arp -d vstout

Damit zwingen Sie den Kernel, beim nächsten IP-Paket für vstout dessen Adresse neu zu erfragen. Das kann nützlich sein, wenn ein falsch konfigurierter Host falsche ARP-Informationen ausgegeben hat (vorher müssen Sie natürlich den fehlkonfigurierten Host »reparieren«).

-s dient dazu, die Hardware-Adresse eines Host manuell in die ARP-Tabelle einzutragen. Das ist beispielsweise sinnvoll, wenn ARP-Anfragen nach diesem Host nicht funktionieren, sei es, daß dessen ARP-Treiber eine Macke hat oder daß ein zweiter Host im Netz sich irrtümlich mit dessen IP-Adresse identifiziert. Die Festverdrahtung von Hardware-Adressen im ARP-Cache ist auch eine (wenn auch drastische) Maßnahme, um unerlaubt an Ihr Netz angeschlossene Maschinen daran zu hindern, sich als jemand anders auszugeben.

Dazu wird arp so aufgerufen:

# arp -s vstout 00:00:C0:90:B3:42

Dieser Befehl trägt vstout mit der Hardware-Adresse 00:00:C0:90:B3:42 in die Tabelle ein. Im Gegensatz zu normalen Einträgen wird er nicht nach einer gewissen Zeit wieder entfernt, sondern bleibt permanent, bis Sie den Rechner rebooten.

Die Option -s kann aber auch für Proxy-ARP benutzt werden. Das ist eine spezielle Technik, bei der ein Host als Stellvertreter (engl. proxy) für eine andere Maschine fungiert, indem er vorgibt, daß beide IP-Adressen auf ihn zeigen. Im Abschnitt über PLIP zum Beispiel diente vlager als Gateway für den Laptop vlite. Mit Proxy-ARP fügen Sie dem ARP-Cache auf vlager nun noch einen Eintrag hinzu, der der IP-Adresse von vlite die Hardware-Adresse von vlager zuordnet. Will vstout nun ein Paket an vlite schicken, erkundigt er sich über ARP nach der Ethernet-Adresse von vlite und erhält -- ohne Böses zu ahnen -- die Adresse von vlager zurück. Darauf schickt er das Paket direkt an vlager, der es umgehend an vlite weiterleitet.

Der korrekte Aufruf dafür sieht so aus (wobei 00:40:05:12:C6:54 die Adresse von vlager ist):

# arp -s vstout 00:40:05:12:C6:54 pub

Diese Verrenkungen ersparen Ihnen nun die Arbeit, auf jedem Host des Brauerei-Ethernets einen expliziten Routing-Eintrag für vlite zu machen. Natürlich funktioniert das nur, wenn vlites Adresse auf einem IP-Subnetz liegt, an das auch vlager angeschlossen ist. Beispielsweise könnte vstout einen Proxy-Eintrag für eine Adresse auf dem Brauerei-Subnetz (172.16.1.0) veröffentlichen, aber niemals für eine auf dem Kellerei-Netz (172.16.2.0).

Eine weitere Anwendungsmöglichkeit für Proxy-ARP kann angezeigt sein, wenn sich in Ihrem Netz eine DOS-Maschine mit einer etwas mangelhaften IP-Implementation befindet, die mit Subnetzen nicht zurechtkommt. In diesem Fall können Sie auf Ihrem Gateway Proxy-Einträge für alle Hosts hinter Ihrem Gateway einrichten, damit die DOS-Box sich nicht selbst um das Routing kümmern muß.


Fußnoten

(1)
Ohne Broadcast auf dem Loopback-Gerät zeigt rwho nur Benutzer auf anderen Maschinen im Netz an, ist aber völlig blind für seinen eigenen Host.
(2)
Erinnert sich noch jemand an Pink Floyds »Echoes«?
(3)
Zum Beispiel verwenden alle RPC-basierten Applikationen die Loopback-Schnittstelle, wenn sie sich beim portmapper registrieren.
(4)
Der MTU-Wert gibt die maximale Größe eines Pakets an, das über dieses Interface übermittelt werden kann.
(5)
Auf einem stark belasteten Ethernet oder mit einer sehr langsamen Ethernet-Karte ist es möglich, daß dann und wann ein Paket verlorengeht.
(6)
Die Schreibweise pointopoint ist wirklich kein Tippfehler:-)
(7)
Vorsichtshalber sollten Sie allerdings Ihren PLIP- oder SLIP-Link erst dann einrichten, wenn Sie bereits alle Routen für andere Netze eingetragen haben. Bei einigen älteren Kernels könnte eine falsche Reihenfolge dazu führen, daß Ihre Netzwerkroute anstatt aufs Ethernet plötzlich auf die PLIP-Schnittstelle zeigte.
(8)
RIP wählt aus mehreren zur Verfügung stehenden Routen zu einem Zielsystem die jeweils »kürzeste« aus. Die Länge eines Pfades setzt sich dabei aus den Metrikwerten der einzelnen Teilverbindungen zusammen. Per Voreinstellung hat jeder solche Hop die Länge 1, einzelne Schnittstellen haben eine Metrik von 0. Mit der Option metric können sie alle Routen durch ein bestimmtes Interface »teurer« machen.
(9)
SRA ist auf ftp.tamu.edu im Verzeichnis /pub/sec/TAMU erhältlich.
(10)
Bei manchen Versionen von netstat auch einfach nur ein Sternchen *.
(11)
Die Richtung einer Verbindung können Sie anhand der auftauchenden Port-Nummern erkennen. Das Ziel einer telnet-Verbindung zum Beispiel ist immer der Port 23, den netstat hier mit seinem symbolischen Namen ausgibt, der in /etc/services definiert ist. Der Port auf dem Ausgangsrechner dagegen ist so gut wie nie ein bekannter (well-known) Service-Port, weshalb netstat auch nur eine normale Zahl anzeigt.

Inhaltsverzeichnis Kapitel 4 Kapitel 6