Manuelle Netzwerkkonfiguration unter Linux



Man könnte in Versuchung kommen zu meinen, ein Netzwerk mit Linux aufzubauen stelle sich angesichts der Konfigurationsprogramme großer Distributionen als trivial dar. Doch der Umgang mit einer unbekannten Distribution ohne grafische Tools kann sich schnell wie der erste Kontakt mit Linux herausstellen - man fühlt sich hilflos, weiß nicht, wo was zu konfigurieren ist. Deswegen kann es eigentlich nur hilfreich sein zu wissen, wie man auch von Hand eine Netzwerkkarte unter Linux konfiguriert. Genau dies ist Anliegen der folgenden Beschreibung, die sich an alle richtet, die nicht nur auf Tools, sondern auch auf ihr eigenes Wissen setzen wollen...


Treiber laden


Der wichtigste und schwierigste Teil stellt das Laden des entsprechenden Kernel-Moduls dar. Dieses Thema kann in all seiner Fülle hier natürlich nicht betrachtet werden, da die Treiberkonfiguration unter Linux oftmals ein paar Probleme bereitet. Zudem kann ich nicht für zig Hundert Karten eine Beschreibung liefern, deshalb soll hier nur ein Allgemeinweg beschrieben werden, der trotzdem meistens zum Ziel führen dürfte.

Zunächst einmal muss man herausfinden, welche Netzwerkkarte man besitzt. Im Normalfall befindet sich diese (wenn man nicht gerade eine PCMCIA-Karte in einem Laptop konfigurieren will) in einem PCI-Slot, womit sich durch das Programm lspci, welches von root gestartet werden muss, viele Informationen auslesen lassen. Alternativ kann auch ein "cat /proc/pci" ausgeführt werden, was annähernd denselben Effekt hat.
Ein sehr verbreiteter Chipsatz ist der Realtek RTL-8139, da er sehr billig ist und sich trotzdem über viele Jahre hinweg bewährt hat. Auch in meinem Rechner ist eine Karte mit solch einem Chip vorhanden und lspci führt zu folgender Ausgabe:
[...]
00:09.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
[...]
Natürlich ermöglicht es lspci auch detailliertere Informationen darzustellen. lspci -vv gibt alles aus, was lspci auslesen kann, für weitere Informationen sollte man lspci die erste Anlaufstelle sein...

Q: Woher weiß ich nun, welchen Treiber ich laden muss?
A: Dies ist wohl der unsicherste Teil der ganzen Angelegenheit. Zunächst sollte man in das Verzeichnis /lib/modules/<kernel-version>/kernel/drivers/net wechseln, da hier alle Module abgelegt sind, die Treiber für Netzwerkkarten darstellen. Hier kann man suchen und schauen, ob es eine Datei gibt, welche vom Namen her der gefundenen Netzwerkkarte ähnelt. Ist man sich unsicher, so kann man mit "modinfo <modul>.o" herausfinden, ob es sich bei dem angegebenen Modul um einen Treiber für die eigene Netzwerkkarte handelt. Z.B. liefert "modinfo 8139too.o" folgende Ausgabe:
bash$  modinfo 8139too.o
 filename:    /lib/modules/2.4.23/kernel/drivers/net/8139too.o
 description: "RealTek RTL-8139 Fast Ethernet driver"
 author:      "Jeff Garzik"
 license:     "GPL"
 parm:        multicast_filter_limit int, description "8139too maximum number of filtered multicast addresses"
 parm:        max_interrupt_work int, description "8139too maximum events handled per interrupt"
 parm:        media int array (min = 1, max = 8), description "8139too: Bits 4+9: force full duplex, bit 5: 100Mbps"
 parm:        full_duplex int array (min = 1, max = 8), description "8139too: Force full duplex for board(s) (1)"
 parm:        debug int, description "8139too bitmapped message enable number"
Neben der Beschreibung des Moduls werden vor allem auch die unter "parm" aufgeführten Parameter mit ausgegeben. Diese könnten wichtig werden, falls der Treiber Probleme verursacht. Das Modul mit den entsprechenden Parametern zu laden kann dann die Lösung sein...

Q: Ich kann kein passendes Modul finden, was tun?
A: Zunächst einmal sollte man bei Google suchen, ob es ein Kernelmodul für die entsprechende Karte gibt. Ist dies der Fall, das entsprechende Modul fehlt allerdings in dem o.a. Ordner, dann hilft nur noch eine Neukonfiguration und -kompilierung des Kernels, was ich hier jedoch nicht weiter verfolgen werde...

Ist das Modul gefunden, so wird es Zeit, dem System mitzuteilen, dass selbiges für den Betrieb eines Netzwerkgerätes eingesetzt werden soll. Am einfachsten ist dies mit dem Tool modconf möglich. Aktiviert man hier das entsprechende Modul, so wird automatisch ein Eintrag in die /etc/modules.conf geschrieben und der Treiber der Netzwerkkarte wird fortan bei jedem Bootvorgang automatisch geladen. Sollte modconf nicht zur Verfügung stehen, ist es notwendig, die /etc/modules.conf um folgenden Eintrag zu erweitern:
alias eth0 <modulname>
Zusätzlich können hier auch die oben erwähnten Parameter als Option gesetzt werden, sodass sie beim Laden des Moduls aktiviert werden:
options <modulname> <parameterliste>
Dieser manuelle Eintrag in /etc/modules.conf hat denselben Effekt wie eine Aktivierung in modconf: bei einem erneuten Bootvorgang wird das Modul geladen und steht nun als Device eth0 zur Verfügung.
Zudem kann man nun den Treiber auch ohne Neubooten einbinden: " modprobe <modulname>" liest die entsprechende Konfiguration aus der modules.conf aus und aktiviert die Karte inklusive etwaigen Parametern...


/etc/network/interfaces -- Netzwerkdaten konfigurieren


Die wichtigsten Daten des Netzwerkes wie IP-Adresse, Subnet Mask, Gateway, Hostname etc. können in der Datei /etc/network/interfaces eingestellt werden. Dies ist die Konfigurationsdatei für die Programme ifup/ifdown, welche (zumeist beim Systemstart) für das Konfigurieren der Netzwerkkarte zuständig sind. Sollten diese Tools nicht installiert sein, verfügt ihr System wohl über einen anderen Mechanismus zur Konfiguration beim Booten - vielleicht ähnlich dem von ROCK Linux - siehe nächster Abschnitt.
Folgende Zeilen sollten in der interfaces-Datei so oder so ähnlich bereits vorhanden sein:
auto lo
iface lo inet loopback
Dies sind die Einträge des loopback-Devices, welches von systeminterner Bedeutung ist. Soll sich das System die Daten des Netzwerkes über einen DHCP-Server holen, so sind folgende zusätzliche Einträge notwendig:
auto eth0
iface eth0 inet dhcp
Will man dem Rechner über die Schnittstelle eth0 eine statische IP-Adresse samt zusätzlicher Optionen zuweisen, fügt man stattdessen einfach ein paar Zeilen folgender Art an:
auto eth0
iface eth0 inet static
		address 192.168.0.2
		netmask 255.255.255.0
		network 192.168.0.0
		broadcast 192.168.0.255
		gateway 192.168.0.1
Erläuterung:
"auto eth0" legt fest, dass das Device eth0 beim Systemstart mit den angegebenen Daten konfiguriert werden soll.
"iface eth0 inet static" spezifiziert eth0 als Device mit den folgenden statischen Konfigurationsdaten.
"address 192.168.0.2" legt die zu verwendende IP-Adresse fest, hier eine Adresse in einem Klasse-C-LAN.
"netmask 255.255.255.0" ist die zum Klasse-C-Netz gehörende Netzmaske (wichtig für das Routing und für Subnetze).
"network 192.168.0.0" zeigt die Zugehörigkeit zum Klasse-C-Netz.
"broadcast 192.168.0.255" beschreibt die Adresse zum Broadcasten von Paketen im Netzwerk.
"gateway 192.168.0.1" legt die Adresse des default-Gateways fest, über den Pakete in andere Netze geroutet werden sollen.

Der Befehl "ifup eth0" aktiviert nun die Netzwerkkarte mit der entsprechenden Konfiguration, "ifdown eth0" deaktiviert sie wieder. Einen Überblick über die derzeit aktivierten Netzwerkinterfaces liefert ifconfig, welchem man ebenfalls Parameter übergeben kann, wodurch die Netzwerkkarte temporär konfiguriert wird. Näheres hierzu erfährt man mit "man ifconfig"...


/etc/conf/network -- Netzwerkkonfiguration unter "ROCK Linux" u.a.


Ist das ifup/ifdown-Paket nicht installiert und somit auch keine /etc/network/interfaces vorhanden, so verfügt die eigene Linux-Distribution über einen anderen Mechanismus zum automatischen Laden von Netzwerkdaten.
Wahrscheinlich ist dann die Konfiguration, wie sie auch bei ROCK Linux stattfindet: nämlich in der Datei /etc/conf/network. Diese definiert die beiden Shellfunktionen start_net() und stop_net(), welche vom /etc/init.d/network-Bootskript beim Booten bzw. Shutdown des Rechners aufgerufen werden.
Anfangs hatte ich ein paar Probleme mit der netmask-Einstellung meines ROCK Linux, da die /etc/conf/network in etwa so aussah:
DHCP="off"

IF="eth0"
IPADDR="192.168.0.2"
GATEWAY="192.168.0.1"

xx() { echo ">> $*" ; eval "$*" ; return $? ; }

start_net() {
	if [ -f /etc/mactab ]; then
		xx nameif -c /etc/mactab
	fi
	if [ ".$DHCP" = ".on" ]; then
		xx /sbin/dhclient -q $IF
	else
		xx ip link set $IF up
		for addr in $IPADDR; do
			xx ip addr add $addr dev $IF
		done
		[ "$GATEWAY" ] && xx ip route add default via $GATEWAY
	fi
	return 0
}
[...]
Das Problem dabei ist, dass kein netmask-Eintrag vorhanden ist, was zu einer falschen Netzmaske (255.255.255.255) für dieses Klasse-C-Netz führt, womit kein Datenverkehr möglich ist...
Die Lösung bestand in einer Um-Konfiguration der Datei, sodass sie wie folgt aussieht:
# modifizierte "/etc/conf/network"-Datei mit gültigem netmask-Eintrag

DHCP="off"
IF="eth0"
IPADDR="192.168.0.2"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"

# start and stop functions (called by /etc/init.d/network)

xx() { echo ">> $*" ; eval "$*" ; }

start_net() {
	if [ -f /etc/mactab ]; then
		xx nameif -c /etc/mactab
	fi
	if [ ".$DHCP" = ".on" ] ; then
		echo "starting dhclient."
		/sbin/dhclient -q $IF
	else
		echo "setting up network ..."
		xx ifconfig $IF $IPADDR netmask $NETMASK up
		xx route add default gw $GATEWAY dev $IF
	fi
	return 0
}

stop_net() {
	if [ ".$DHCP" = ".on" ] ; then
		echo "stopping dhclient."
		killall -15 /sbin/dhclient
		ifconfig $IF down
	else
		echo "shutting down network ..."
		xx route del default gw $GATEWAY dev $IF
		xx ifconfig $IF down
	fi
	return 0
}
Statt dem Befehl "ip" wird hier "ifconfig" aufgerufen, um die Netzwerkkonfiguration aufzusetzen. Ich finde, dies ist eine saubere und elegante Lösung des Problems, welche mir auch noch nie Sorgen bereitet hat. Wie man außerdem sieht, ist die Konfigurationsdatei sehr flexibel mit zusätzlichen Einträgen. So könnte man z.B. auch seine Firewall hiermit aufsetzen, was nur ein paar Zeilen mehr Code benötigen würde - Rum-Experimentieren macht hier richtig Laune :o)


/etc/hostname -- Hostname einstellen


Die Datei /etc/hostname enthält den Hostnamen des Rechners. Sie sollte von /etc/network/interfaces mit der Option "hostname" modifiziert werden, man kann sie aber auch manuell oder mit einem Editor bzw. dem Kommando "hostname" ändern.


/etc/hosts -- Host-Aliases festlegen


In der Datei /etc/hosts werden Host-Namen bekannter IP-Adressen im LAN vergeben. So muss man sich nicht die ganze Adresse, sondern nur noch einen Alias merken, wie es auch beim Betrieb über einen DNS-Server der Fall ist. Der prinzipielle Aufbau einer solchen Aliaszeile ist folgender:
IP-Adresse		voller Rechnername		Abkürzung
Der "volle Rechnername" sollte aus der vollständigen Bezeichnung des Rechners mit Domainname bestehen, bei der "Abkürzung" kann man eine gewünschte Kurzform des Rechnernamens eingeben. Z.B. würde die Zeile:
192.168.0.1  gateway.localdomain  gw
dem Rechner mit der IP-Adresse 192.168.0.1 den vollständigen Namen "gateway.localdomain.de" und die Abkürzung "gw" zuweisen, sodass man diesen fortan über diese beiden Aliase ansprechen kann. In der Datei sollte sich auch immer ein Alias für 127.0.0.1, also die Adresse des Loopback-Interfaces befinden, welcher dann "localhost" wäre...


/etc/networks -- Netzwerknamen einstellen


In der /etc/networks werden Aliase für ganze Netzwerke festgelegt. Oft ist nur folgender Eintrag vorhanden und auch ausreichend:
loopback		127.0.0.0


/etc/host.conf -- Rechnernamen auflösen


In dieser Datei findet man die Reihenfolge der Auflösung von Rechnernamen. Meist sind folgende Zeilen sinnvoll:
order hosts,bind
multi on
Hierbei wird die Reihenfolge der Auflösung so festgelegt, dass beim Zugriff auf einen anderen Rechner über seinen Namen zunächst die /etc/hosts nach passenden Einträgen durchsucht und dann mit der Abfrage über einen in der Datei /etc/resolv.conf eingetragenen Nameserver begonnen wird. "multi on" spezifiziert, dass ein Lookup des zu einer IP-Adresse gehörenden Rechnernamens alle Vorkommen dessen in der hosts-Datei zurückgibt anstatt nur des ersten. Weitere Optionen lesen sie bitte in "man host.conf" nach...


/etc/resolv.conf -- Nameserver eintragen


In dieser Datei stehen die Nameserver, welche zum Auflösen von Rechnernamen verwendet werden sollen. Die gebräuchlichste Form ist wohl folgende:
domain localdomain
nameserver nameserver1
nameserver nameserver2
[...}
"domain localdomain" spezifiziert den Namen der lokalen Domain. Der Eintrag hat zur Folge, dass die lokale Domain automatisch angehängt wird, wenn nur ein Rechner ohne Domainname angegeben wurde. Mit der Option "nameserver" können ein oder mehrere Nameserver eingestellt werden, die zum Auflösen von Rechnernamen verwendet werden sollen. Besitzt man eine Einwahlverbindung zum Internet, so muss hier meist nichts eingetragen werden, da das Dial-in-Programm dynamisch Einträge generiert, die es beim Verbindungsaufbau erhält. Sollte dies nicht der Fall sein, so fügt man einfach einen Nameserver hinzu, dessen IP-Adresse man bei seinem Provider erfragt. Weitere Optionen sind in "man resolv.conf" nachzulesen.


"/sbin/route" -- Routing einstellen


Schlussendlich muss man noch einstellen, über welche Rechner/Interfaces Pakete geroutet werden sollen, um in andere Netzwerke zu gelangen. Dies ist besonders dann notwendig, wenn ein Rechner die Verbindung zum Internet herstellt und andere Rechner im LAN dann über diesen Internet-Zugriff erhalten sollen. Doch darauf soll hier nicht eingegangen werden.
Der Linux-Kernel hält die Informationen, wie Pakete geroutet werden sollen, in der sogenannten "Routing Tabelle". Mit dem Befehl /sbin/route kann diese Tabelle ausgegeben werden. Per default sollte nur das Loopback-Device erscheinen. Mit der Option "gateway" in der Datei /etc/network/interfaces kann man von ifup bei Aktivierung des Netzwerkinterfaces auch gleich einen Standard-Gateway in die Routing-Tabelle eintragen lassen. Um dies manuell zu tun, muss die folgende erste route-Kommandozeile ausgeführt werden:
bash$  route add default gw <ip-adresse oder rechnername>
bash$  route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0
Die zweite Zeile bestimmt eth0 als das Device, über welches Pakete in das Netzwerk 192.56.76.0 geroutet werden sollen. Die Netzmaske ist hier optional, da es die eines Klasse-C-Netzes ist, für Subnetze muss sie allerdings entsprechend modifiziert werden.
Setzt man anstelle von "add" ein "del" in die Kommandozeile, so wird der entsprechende Eintrag aus der Routing-Tabelle gelöscht. Für erweiterte Optionen bezüglich des Routings ist "man route" sehr aufschlussreich.
Nach obigen Einstellungen könnte die Kernel-Routing-Tabelle z.B. wie folgt aussehen:
bash$  route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
loopback        *               255.0.0.0       U     0      0        0 lo
default         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
192.56.76.0     *               255.255.255.0   U     0      0        0 eth0

Finally...


Somit wäre eigentlich alles Wesentliche gesagt, was man zur manuellen Konfiguration eines Netzwerkinterfaces sagen kann. Natürlich wurden Spezialfälle wie pcmcia und erweitertes Routing nicht behandelt, dieser Text sollte sich auch nur an Privatanwender richten, die mit ihren Desktop-PCs ein kleines Home-LAN aufbauen wollen.
Ich hoffe, dass inhaltlich alles soweit in Ordnung geht, für weitere Fragen, Anregungen und Hinweise ist eine Mail an mich wie immer willkommen :o)

(c) 2004 by RTC, www.linux-related.de
Dieses Dokument unterliegt der GNU Free Documentation License