Inhalt

8. Neue Netzwerkfähigkeiten mit Kernel 2.2

Der Kernel 2.2 hat die Routing-Fähigkeiten von Linux wesentlich verbessert. Unglücklicherweise gibt es fast keine Dokumentation zur Nutzung der neuen Fähigkeiten und wenn vorhanden ist sie schwer zu finden.

Ich habe einige Zeit darin investiert und bereits einige Dinge erreicht. Mit der Zeit und mit wachsendem Verständnis werde ich diese Dokumentation erweitern.

Bis Kernel 2.0 nutzte Linux das Standardkommando route zum Erstellen von Routingregeln in einer einzigen Routingtabelle. Diese konnte mit

netstat -rn
auf der Kommandozeile angezeigt werden.

Mit neueren Kerneln (ab 2.1) gibt es eine weitere regelbasierte Möglichkeit, die es erlaubt, mehrere Routingtabellen zu führen. Die neuen Regeln sind viel flexibler bei der Entscheidung, wie ein Paket gehandhabt wird. Es sind nun Regeln möglich, die nicht mehr nur auf der Zieladresse, sondern auch auf der Quelladresse, dem TOS (Type of Service) Feld des Paketes oder der Schnittstelle auf der das Paket ankam, basieren können.

8.1 Die Grundlagen

Die Routingtabelle kann so angezeigt werden:

ip route

Auf meinem Rechner ergibt sich folgende Ausgabe:

207.149.43.62 dev eth0  scope link
207.149.43.0/24 dev eth0  proto kernel  scope link  src 207.149.43.62
default via 207.149.43.1 dev eth0

Die erste Zeile »207.149.43.62 dev eth0 scope link« ist dabei die Routingregel für die Schnittstelle.

Die zweite Zeile »207.149.43.0/24 dev eth0 proto kernel scope link src 207.149.43.62« ist eine Regel, die aussagt: alles nach 207.149.43.0 muß über 207.149.43.62 versandt werden.

Die dritte Zeile »default via 207.149.43.1 dev eth0« ist die Regel für die Defaultroute.

Nutzen dieser Informationen

Jetzt nachdem wir uns eine einfache Routingtabelle angesehen haben, ist es Zeit, mit ihr zu arbeiten. Dazu sollte man zuerst die englischsprachige Dokumentation zum Policy Based Routing lesen, die von folgender Adresse bezogen werden kann:

http://www.compendium.com.ar/policy-routing.txt
Wenn Sie dieser Text verwirrt, dann macht das nichts - es ist ein verwirrender Text. Aber er bietet eine vollständige Beschreibung dessen, was man mit dem neuen Routing alles anstellen kann.

8.2 Anlegen einer Route mit dem ip Befehl

Im letzten Abschnitt haben wir das Anzeigen und die Bedeutung der Ausgabe der Routingtabelle besprochen. Glücklicherweise ähnelt die Ausgabe der Tabelle der Syntax zu ihrer Erzeugung:

ip route add 207.149.43.62 dev eth0  scope link
ip route add 207.149.43.0/24 dev eth0 proto kernel scope link src 207.149.43.62
ip route add 127.0.0.0/8 dev lo  scope link
ip route add default via 207.149.43.1 dev eth0

Wie Sie sehen, sind Ausgabe und Kommandos fast identisch, wenn man mal von dem ip route add vor jeder Zeile absieht.

8.3 NAT mit dem Kernel 2.2 nutzen

Die IP Network Address Translation Funktionalität ist so ziemlich der standardisierte »Big Brother« des Linux IP Masquerading. NAT ist in gewisser Hinsicht im RFC 1631 spezifiziert. Es bietet Möglichkeiten, die das IP-Masquerading nicht bietet. Damit ist es eher für die Nutzung für Firmen Firewall-Router und noch größere Installationen geeignet.

Eine Alpha Implementierung von NAT für den Linux 2.0.29 Kernel wurde von Michael Hasenstein (Michael.Hasenstein@informatik.tu-chemnitz.de) entwickelt. Michaels Dokumentation und Implementierung sind verfügbar unter:

http://www.suse.de/~mha/HyperNews/get/linux-ip-nat.html

Der wesentlich verbesserte TCP/IP Stack des 2.2er Linux Kernel enthält bereits die NAT-Funktionalität. Diese Möglichkeit macht eine Zusatzlösung wie von Michael Hasenstein unnötig.

Um sie zu aktivieren, müssen folgende Kerneloptionen gewählt werden:

CONFIG_IP_ADVANCED_ROUTER,
CONFIG_IP_MULTIPLE_TABLES (auch bekannt als Policy Routing)
CONFIG_IP_ROUTE_NAT (auch bekannt als Fast NAT)

Benötigen sie granularere NAT Regeln, dann möchten Sie ebenfalls die Firewallfunktionalität aktivieren:

CONFIG_IP_FIREWALL
CONFIG_IP_ROUTE_FWMARK.

Um diese Kernelfunktionalität auch nutzen zu können, benötigt man das ip Programm von Alexey Kuznyetsov, welches von folgendem Server bezogen werden kann:

ftp.inr.ac.ru:/ip-routing

NAT für eingehende Pakete

Ist der Kernel richtig konfiguriert und sind alle Tools installiert, kann man mit folgendem Kommando die Adressübersetzung für Pakete einrichten.

ip route add nat <ext-addr>[/<masklen>] via <int-addr>

Diese Regel wird in allen eingehenden Paketen mit der Zieladresse »ext-addr« (also die Adresse, die von außen z.B. vom Internet sichtbar ist) die Zieladresse nach »int-addr« umändern (das ist eine Adresse im internen Netzwerk, hinter dem Gateway bzw. der Firewall). Das Paket wird dann gemäß der lokalen Routing Regeln weitergeleitet. Es ist möglich, entweder einzelne oder ganze Bereiche von Hostadressen zu verändern.

Beispiele:

ip route add nat 195.113.148.34 via 192.168.0.2
ip route add nat 195.113.148.32/27 via 192.168.0.0

Das erste Kommando macht die interne Adresse 192.168.0.2 nach außen hin als 195.113.148.34 zugänglich. Das zweite Beispiel zeigt das Abbilden des Adreßbereiches 192.168.0.0-31 auf den Bereich 195.113.148.32-63.

8.4 Kernel 2.2 ip Kommandoreferenz (in Arbeit)

Haben Sie das Paket iproute2 installiert, kann durch den einfachen Aufruf von ip die grundlegende Syntax angezeigt werden.

ip
Usage: ip [ OPTIONS ] OBJECT [ COMMAND [ ARGUMENTS ]]
where  OBJECT := { link | addr | route | rule | neigh | tunnel |
                   maddr | mroute | monitor }
       OPTIONS := { -V[ersion] | -s[tatistics] | -r[esolve] |
                    -f[amily] { inet | inet6 | dnet | link } | -o[neline] }

Zur Bedeutung der Parameter:

»OBJECT« spezifiert das Objekt, für das Informationen ermittelt oder mit dem anderen Kommandos durchgeführt werden sollen. Die von der aktuellen Implementation unterstützten Typen sind:

link

eine Netzwerkschnittstelle z.B. eth0 oder ppp0

address

die IP (IPv4 oder IPv6) Adresse der Schnittstelle

neigh

ein ARP oder NDISC Cache Eintrag

route

ein Eintrag der Routingtabelle

rule

eine Regel in der Routing Policy Datenbank

maddress

eine Multicast Adresse

mroute

ein Multicast Routing Cache Eintrag

tunnel

Objekt, um zu entscheiden, ob IP Tunneling verwendet wird

Der Umfang an möglichen Optionen jedes Objekttypes hängt vom Typ der durchzuführenden Aktion ab. Ganz grundlegend ist es für jedes Objekt möglich, ein »add«, »delete« oder ein »show« durchzuführen. Nicht alle Objekte bieten weitere Kommandos. Natürlich ist für alle Objekte das Kommando »help« möglich. Dieses gibt die Syntax für das jeweilige Objekt aus.

Wird kein Kommando angegeben, wird das Standardkommando ausgeführt. Das ist typischerweise »show«. Können keine Informationen zum abgefragten Objekt ausgegeben werden, wird nur die Hilfe ausgegeben.

»ARGUMENTS« ist eine Liste von Argumenten, die kommando- und objektspezifisch sind. Es gibt zwei Typen für Argumente:

»Flags« diese bestehen aus einem Schlüsselwort gefolgt von einem Wert. Für die einfachere Benutzung sind für Kommandoargumente oft Standardwerte vorgesehen. So ist der Parameter »dev>« standardmäßig auf »ip link« gesetzt.

Zur Bedeutung der Optionen

-V, -Version

Zeigt die Versionsnummer des benutzten ip Programmes an.

-s, -stats, -statistics

Diese Option führt dazu, daß zusätzliche Informationen ausgegeben werden. Wird die Option mehrfach angegeben, erfolgen noch mehr Ausgaben.

-f, -family {inet, inet6, link}

Ermöglicht das Angeben der zu verwendenden Protokollfamilie.

inet

IPv4 (der aktuelle Internetstandard)

inet6

IPv6 (der kommende IPv4 Nachfolger)

link

steht für eine physische Verbindung

Wird diese Option nicht angegeben, versucht das Programm die Protokollfamilie selbst zu bestimmen. Sind dafür nicht genug Informationen gegeben, werden die Standardeinstellungen verwendet.

-o, -oneline

Bei der Ausgabe wird pro Datensatz nur eine Zeile verwendet.

-r, -resolve

Mit dieser Option nutzt das Programm den lokalen Auflösungsdienst (z.B. DNS) um Namen statt IP Adressen auszugeben.

Anwenderfehler

Alle Operationen des ip Kommandos sind dynamisch. Ist die angegebene Syntax fehlerhaft, wird die Systemkonfiguration nicht verändert. Es gibt nur eine Ausnahme: das »ip link« Kommando, das zum Ändern der Schnittstelleneigenschaften genutzt wird.

Es ist schwierig, alle Fehlermeldungen anzugeben (speziell die bei Syntaxfehlern). Typischerweise sollte die Bedeutung einer Fehlermeldung im Kontext des Objektes klar sein.

Typische Fehler sind:

  1. Der Kernel untersützt Netlink nicht. Die Fehlermeldung:
    Cannot open netlink socket: Invalid value
    
  2. Der Kernel unterstützt RTNETLINK nicht. Je nach Kommando wird eine der folgenden Ausgaben angezeigt:
    Cannot talk to rtnetlink: Connection refused 
    Cannot send dump request: Connection refused
    
  3. Die Kerneloption CONFIG_IP_MULTIPLE_TABLES ist nicht aktiv. In diesem Fall schlägt jede Benutzung des Kommandos ip rule fehl. Beispiel:
    ip rule list RTNETLINK 
    error: Invalid argument 
    dump terminated
    


Inhalt