Das FreeBSD-Handbuch
Zurück | Kapitel 32. Weiterführende Netzwerkthemen | Weiter

# 32.2. Gateways und Routen

Beigetragen von Coranth Gryphon.

Damit ein Rechner einen anderen über ein Netzwerk finden kann, muss ein Mechanismus vorhanden sein, der beschreibt, wie man von einem Rechner zum anderen gelangt. Dieser Vorgang wird als Routing bezeichnet. Eine “Route” besteht aus einem definierten Adressenpaar: Einem “Ziel” und einem “Gateway”. Dieses Paar zeigt an, dass Sie über das Gateway zum Ziel gelangen wollen. Es gibt drei Arten von Zielen: Einzelne Rechner (Hosts), Subnetze und das “Standard”ziel. Die “Standardroute” wird verwendet, wenn keine andere Route zutrifft. Wir werden Standardrouten später etwas genauer behandeln. Außerdem gibt es drei Arten von Gateways: Einzelne Rechner (Hosts), Schnittstellen (Interfaces, auch als “Links” bezeichnet), sowie Ethernet Hardware-Adressen (MAC-Adressen).

## 32.2.1. Ein Beispiel

Um die verschiedenen Aspekte des Routings zu veranschaulichen, verwenden wir folgende Ausgaben von `netstat`:

    % netstat -r
    Routing tables

    Destination               Gateway            Flags       Refs     Use     Netif Expire

    default                   outside-gw         UGSc        37       418     ppp0
    localhost                 localhost          UH          0        181     lo0
    test0                     0:e0:b5:36:cf:4f   UHLW        5        63288   ed0    77
    10.20.30.255              link#1             UHLW        1        2421
    example.com               link#1             UC          0        0
    host1                     0:e0:a8:37:8:1e    UHLW        3        4601    lo0
    host2                     0:e0:a8:37:8:1e    UHLW        0        5       lo0 =>
    host2.example.com         link#1             UC          0        0
    224                       link#1             UC          0        0

Die ersten zwei Zeilen geben die Standardroute (die wir im nächsten Abschnitt behandeln), sowie die `localhost` Route an.

Das in der Routingtabelle für `localhost` festgelegte Interface (`Netif`-Spalte) `lo0`, ist auch als loopback-Gerät (Prüfschleife) bekannt. Das heißt, dass der ganze Datenverkehr für dieses Ziel intern (innerhalb des Gerätes) bleibt, anstatt ihn über ein Netzwerk (LAN) zu versenden, da das Ziel dem Start entspricht.

Der nächste auffällige Punkt sind die mit `0:e0:` beginnenden Adressen. Es handelt sich dabei um Ethernet Hardwareadressen, die auch als MAC-Adressen bekannt sind. FreeBSD identifiziert Rechner im lokalen Netz automatisch (im Beispiel `test0`) und fügt eine direkte Route zu diesem Rechner hinzu. Dies passiert über die Ethernet-Schnittstelle `ed0`. Außerdem existiert ein Timeout (in der Spalte `Expire`) für diese Art von Routen, der verwendet wird, wenn dieser Rechner in einem definierten Zeitraum nicht reagiert. Wenn dies passiert, wird die Route zu diesem Rechner automatisch gelöscht. Rechner im lokalen Netz werden durch einen als RIP (Routing Information Protocol) bezeichneten Mechanismus identifiziert, der den kürzesten Weg zu den jeweiligen Rechnern bestimmt.

FreeBSD fügt außerdem Subnetzrouten für das lokale Subnetz hinzu (`10.20.30.255` ist die Broadcast-Adresse für das Subnetz `10.20.30`, `example.com` ist der zu diesem Subnetz gehörige Domainname). Das Ziel `link#1` bezieht sich auf die erste Ethernet-Karte im Rechner. Sie können auch feststellen, dass keine zusätzlichen Schnittstellen angegeben sind.

Routen für Rechner im lokalen Netz und lokale Subnetze werden automatisch durch den routed Daemon konfiguriert. Ist dieser nicht gestartet, sind nur statisch definierte (explizit eingegebene) Routen vorhanden.

Die Zeile `host1` bezieht sich auf unseren Rechner, der durch seine Ethernetadresse bekannt ist. Da unser Rechner der Sender ist, verwendet FreeBSD automatisch das Loopback-Gerät (`lo0`), anstatt den Datenverkehr über die Ethernetschnittstelle zu senden.

Die zwei `host2` Zeilen sind ein Beispiel dafür, was passiert, wenn wir ein ifconfig(8) Alias verwenden (Lesen Sie dazu den Abschnitt über Ethernet, wenn Sie wissen wollen, warum wir das tun sollten.). Das Symbol `=>` (nach der `lo0`-Schnittstelle) sagt aus, dass wir nicht nur das Loopbackgerät verwenden (da sich die Adresse auf den lokalen Rechner bezieht), sondern dass es sich zusätzlich auch um ein Alias handelt. Solche Routen sind nur auf Rechnern vorhanden, die den Alias bereitstellen; alle anderen Rechner im lokalen Netz haben für solche Routen nur eine einfache `link#1` Zeile.

Die letzte Zeile (Zielsubnetz `224`) behandelt das Multicasting, das wir in einem anderen Abschnitt besprechen werden.

Schließlich gibt es für Routen noch verschiedene Attribute, die Sie in der Spalte `Flags` finden. Nachfolgend finden Sie eine kurze Übersicht von einigen dieser Flags und ihrer Bedeutung:

U | Up: Die Route ist aktiv.
H | Host: Das Ziel der Route ist ein einzelner Rechner (Host).
G | Gateway: Alle Daten, die an dieses Ziel gesendet werden, werden von diesem System an ihr jeweiliges Ziel weitergeleitet.
S | Static: Diese Route wurde manuell konfiguriert, das heißt sie wurde nicht automatisch vom System erzeugt.
C | Clone: Erzeugt eine neue Route, basierend auf der Route für den Rechner, mit dem wir uns verbinden. Diese Routenart wird normalerweise für lokale Netzwerke verwendet.
W | WasCloned: Eine Route, die automatisch konfiguriert wurde. Sie basiert auf einer lokalen Netzwerkroute (Clone).
L | Link: Die Route beinhaltet einen Verweis auf eine Ethernetkarte (MAC-Adresse).

## 32.2.2. Standardrouten

Wenn sich der lokale Rechner mit einem entfernten Rechner verbinden will, wird die Routingtabelle überprüft, um festzustellen, ob bereits ein bekannter Pfad vorhanden ist. Gehört dieser entfernte Rechner zu einem Subnetz, dessen Pfad uns bereits bekannt ist (Cloned route), dann versucht der lokale Rechner über diese Schnittstelle eine Verbindung herzustellen.

Wenn alle bekannten Pfade nicht funktionieren, hat der lokale Rechner eine letzte Möglichkeit: Die Standardroute (Defaultroute). Bei dieser Route handelt es sich um eine spezielle Gateway-Route (gewöhnlich die einzige im System vorhandene), die im Flags-Feld immer mit `C` gekennzeichnet ist. Für Rechner im lokalen Netzwerk ist dieses Gateway auf welcher Rechner auch immer eine Verbindung nach außen hat gesetzt (entweder über eine PPP-Verbindung, DSL, ein Kabelmodem, T1 oder eine beliebige andere Netzwerkverbindung).

Wenn Sie die Standardroute für einen Rechner konfigurieren, der selbst als Gateway zur Außenwelt funktioniert, wird die Standardroute zum Gateway-Rechner Ihres Internetanbieter (ISP) gesetzt.

Sehen wir uns ein Beispiel für Standardrouten an. So sieht eine übliche Konfiguration aus:

Die Rechner `Local1` und `Local2` befinden sich auf Ihrer Seite. `Local1` ist mit einem ISP über eine PPP-Verbindung verbunden. Dieser PPP-Server ist über ein lokales Netzwerk mit einem anderen Gateway-Rechner verbunden, der über eine Schnittstelle die Verbindung des ISP zum Internet herstellt.

Die Standardrouten für Ihre Maschinen lauten:

Host | Standard Gateway | Schnittstelle
--- | --- | ---
Local2 | Local1 | Ethernet
Local1 | T1-GW | PPP

Eine häufig gestellte Frage lautet: “Warum (oder wie) sollten wir `T1-GW` als Standard-Gateway für `Local1` setzen, statt den (direkt verbundenen) ISP-Server zu verwenden?”.

Bedenken Sie, dass die PPP-Schnittstelle für die Verbindung eine Adresse des lokalen Netzes des ISP verwendet. Daher werden Routen für alle anderen Rechner im lokalen Netz des ISP automatisch erzeugt. Daraus folgt, dass Sie bereits wissen, wie Sie `T1-GW` erreichen können! Es ist also unnötig, einen Zwischenschritt über den ISP-Server zu machen.

Es ist üblich, die Adresse `X.X.X.1` als Gateway-Adresse für ihr lokales Netzwerk zu verwenden. Für unser Beispiel bedeutet dies Folgendes: Wenn Ihr lokaler Klasse-C-Adressraum `10.20.30` ist und Ihr ISP `10.9.9` verwendet, sehen die Standardrouten so aus:

Rechner (Host) | Standardroute
--- | ---
Local2 (10.20.30.2) | Local1 (10.20.30.1)
Local1 (10.20.30.1, 10.9.9.30) | T1-GW (10.9.9.1)

Sie können die Standardroute ganz einfach in der Datei `/etc/rc.conf` festlegen. In unserem Beispiel wurde auf dem Rechner `Local2` folgende Zeile in `/etc/rc.conf` eingefügt:

    defaultrouter="10.20.30.1"

Die Standardroute kann über route(8) auch direkt gesetzt werden:

    # route add default 10.20.30.1

Weitere Informationen zum Bearbeiten von Netzwerkroutingtabellen finden Sie in route(8).

## 32.2.3. Rechner mit zwei Heimatnetzen

Es gibt noch eine Konfigurationsmöglichkeit, die wir besprechen sollten, und zwar Rechner, die sich in zwei Netzwerken befinden. Technisch gesehen, zählt jeder als Gateway arbeitende Rechner zu den Rechnern mit zwei Heimatnetzen (im obigen Beispiel unter Verwendung einer PPP-Verbindung). In der Praxis meint man damit allerdings nur Rechner, die sich in zwei lokalen Netzen befinden.

Entweder verfügt der Rechner über zwei Ethernetkarten und jede dieser Karten hat eine Adresse in einem separaten Subnetz, oder der Rechner hat nur eine Ethernetkarte und verwendet ifconfig(8) Aliasing. Die erste Möglichkeit wird verwendet, wenn zwei physikalisch getrennte Ethernet-Netzwerke vorhanden sind, die zweite, wenn es nur ein physikalisches Ethernet-Netzwerk gibt, das aber aus zwei logisch getrennten Subnetzen besteht.

In beiden Fällen werden Routingtabellen erstellt, damit jedes Subnetz weiß, dass dieser Rechner als Gateway zum anderen Subnetz arbeitet (inbound route). Diese Konfiguration (der Gateway-Rechner arbeitet als Router zwischen den Subnetzen) wird häufig verwendet, wenn es darum geht, Paketfilterung oder eine Firewall (in eine oder beide Richtungen) zu implementieren.

Soll dieser Rechner Pakete zwischen den beiden Schnittstellen weiterleiten, müssen Sie diese Funktion manuell konfigurieren und aktivieren. Lesen Sie den nächsten Abschnitt, wenn Sie weitere Informationen zu diesem Thema benötigen.

## 32.2.4. Einen Router konfigurieren

Ein Netzwerkrouter ist einfach ein System, das Pakete von einer Schnittstelle zur anderen weiterleitet. Internetstandards und gute Ingenieurspraxis sorgten dafür, dass diese Funktion in FreeBSD in der Voreinstellung deaktiviert ist. Sie können diese Funktion aktivieren, indem Sie in rc.conf(5) folgende Änderung durchführen:

    gateway_enable="YES"          # Auf YES setzen, wenn der Rechner als Gateway arbeiten soll

Diese Option setzt die sysctl(8)-Variable `net.inet.ip.forwarding` auf `1`. Wenn Sie das Routing kurzzeitig unterbrechen wollen, können Sie die Variable auf `0` setzen.

Ihr neuer Router benötigt nun noch Routen, um zu wissen, wohin er den Verkehr senden soll. Haben Sie ein (sehr) einfaches Netzwerk, können Sie statische Routen verwenden. FreeBSD verfügt über den Standard BSD-Routing-Daemon routed(8), der RIP (sowohl Version 1 als auch Version 2) und IRDP versteht. BGP v4, OSPF v2 und andere Protokolle werden von `net/zebra` unterstützt. Es stehen auch kommerzielle Produkte wie gated zur Verfügung.

## 32.2.5. Statische Routen einrichten

Beigetragen von Al Hoang.

### 32.2.5.1. Manuelle Konfiguration

Nehmen wir an, dass wir über folgendes Netzwerk verfügen:

`RouterA`, ein FreeBSD-Rechner, dient als Router für den Zugriff auf das Internet. Die Standardroute ist auf `10.0.0.1` gesetzt, damit ein Zugriff auf das Internet möglich wird. Wir nehmen nun an, dass `RouterB` bereits konfiguriert ist und daher weiß, wie er andere Rechner erreichen kann. Dazu wird die Standardroute von `RouterB` auf `192.168.1.1` gesetzt, da dieser Rechner als Gateway fungiert.

Sieht man sich die Routingtabelle für `RouterA` an, erhält man folgende Ausgabe:

    % netstat -nr
    Routing tables

    Internet:
    Destination        Gateway            Flags    Refs      Use  Netif  Expire
    default            10.0.0.1           UGS         0    49378    xl0
    127.0.0.1          127.0.0.1          UH          0        6    lo0
    10.0.0/24          link#1             UC          0        0    xl0
    192.168.1/24       link#2             UC          0        0    xl1

Mit dieser Routingtabelle kann `RouterA` unser internes Netz 2 nicht erreichen, da keine Route zum Rechner `192.168.2.0/24` vorhanden ist. Um dies zu korrigieren, kann die Route manuell gesetzt werden. Durch den folgenden Befehl wird das interne Netz 2 in die Routingtabelle des Rechners `RouterA` aufgenommen, indem `192.168.1.2` als nächster Zwischenschritt verwenden wird:

    # route add -net 192.168.2.0/24 192.168.1.2

Ab sofort kann `RouterA` alle Rechner des Netzwerks `192.168.2.0/24` erreichen.

### 32.2.5.2. Routen dauerhaft einrichten

Das obige Beispiel ist für die Konfiguration einer statischen Route auf einem laufenden System geeignet. Diese Information geht jedoch verloren, wenn der FreeBSD-Rechner neu gestartet werden muss. Um dies zu verhindern, wird diese Route in `/etc/rc.conf` eingetragen:

    # Add Internal Net 2 as a static route
    static_routes="internalnet2"
    route_internalnet2="-net 192.168.2.0/24 192.168.1.2"

Die Variable `static_routes` enthält eine Reihe von Strings, die durch Leerzeichen getrennt sind. Jeder String bezieht sich auf den Namen einer Route. In unserem Beispiel hat `static_routes` `internalnet2` als einzigen String. Zusätzlich verwendet man die Konfigurationsvariable `route_`internalnet2``, in der alle sonstigen an route(8) zu übergebenden Parameter festgelegt werden. In obigen Beispiel hätte man folgenden Befehl verwendet:

    # route add -net 192.168.2.0/24 192.168.1.2

Daher wird `"-net 192.168.2.0/24 192.168.1.2"` als Parameter der Variable `route_` angegeben.

Wie bereits erwähnt, können bei `static_routes` auch mehrere Strings angegeben werden. Dadurch lassen sich mehrere statische Routen anlegen. Durch folgende Zeilen werden auf einem imaginären Rechner statische Routen zu den Netzwerken `192.168.0.0/24` sowie `192.168.1.0/24` definiert:

    static_routes="net1 net2"
    route_net1="-net 192.168.0.0/24 192.168.0.1"
    route_net2="-net 192.168.1.0/24 192.168.1.1"

## 32.2.6. Verteilung von Routing-Informationen

Wir haben bereits darüber gesprochen, wie wir unsere Routen zur Außenwelt definieren, aber nicht darüber, wie die Außenwelt uns finden kann.

Wir wissen bereits, dass Routing-Tabellen so erstellt werden können, dass sämtlicher Verkehr für einen bestimmten Adressraum (in unserem Beispiel ein Klasse-C-Subnetz) zu einem bestimmten Rechner in diesem Netzwerk gesendet wird, der die eingehenden Pakete im Subnetz verteilt.

Wenn Sie einen Adressraum für Ihre Seite zugewiesen bekommen, richtet Ihr Diensteanbieter seine Routingtabellen so ein, dass der ganze Verkehr für Ihr Subnetz entlang Ihrer PPP-Verbindung zu Ihrer Seite gesendet wird. Aber woher wissen die Seiten in der Außenwelt, dass sie die Daten an Ihren ISP senden sollen?

Es gibt ein System (ähnlich dem verbreiteten DNS), das alle zugewiesenen Adressräume verwaltet und ihre Verbindung zum Internet-Backbone definiert und dokumentiert. Der “Backbone” ist das Netz aus Hauptverbindungen, die den Internetverkehr in der ganzen Welt transportieren und verteilen. Jeder Backbone-Rechner verfügt über eine Kopie von Haupttabellen, die den Verkehr für ein bestimmtes Netzwerk hierarchisch vom Backbone über eine Kette von Diensteanbietern bis hin zu Ihrer Seite leiten.

Es ist die Aufgabe Ihres Diensteanbieters, den Backbone-Seiten mitzuteilen, dass sie mit Ihrer Seite verbunden wurden. Durch diese Mitteilung der Route ist nun auch der Weg zu Ihnen bekannt. Dieser Vorgang wird als Bekanntmachung von Routen (routing propagation) bezeichnet.

## 32.2.7. Problembehebung

Manchmal kommt es zu Problemen bei der Bekanntmachung von Routen, und einige Seiten sind nicht in der Lage, Sie zu erreichen. Vielleicht der nützlichste Befehl, um festzustellen, wo das Routing nicht funktioniert, ist traceroute(8). Er ist außerdem sehr nützlich, wenn Sie einen entfernten Rechner nicht erreichen können (lesen Sie dazu auch ping(8)).

traceroute(8) wird mit dem zu erreichenden Rechner (Host) ausgeführt. Angezeigt werden die Gateway-Rechner entlang des Verbindungspfades. Schließlich wird der Zielrechner erreicht oder es kommt zu einem Verbindungsabbruch (beispielsweise durch Nichterreichbarkeit eines Gateway-Rechners).

Weitere Informationen finden Sie in traceroute(8).

## 32.2.8. Multicast-Routing

FreeBSD unterstützt sowohl Multicast-Anwendungen als auch Multicast-Routing. Multicast-Anwendungen müssen nicht konfiguriert werden, sie laufen einfach. Multicast-Routing muss in der Kernelkonfiguration aktiviert werden:

    options MROUTING

Zusätzlich muss mrouted(8), der Multicast-Routing-Daemon, über die Datei `/etc/mrouted.conf` eingerichtet werden, um Tunnel und DVMRP zu aktivieren. Weitere Informationen zu diesem Thema finden Sie in mrouted(8).

> Anmerkung: mrouted(8), der Multicast Routing Daemon, verwendet das DVMRP Multicast Routing Protocol, das inzwischen in den meisten Multicast-Installationen durch pim(4) ersetzt wurde. mrouted(8) sowie die damit in Verbindung stehenden Werkzeuge map-mbone(8) und mrinfo(8)können über die FreeBSD-Ports-Sammlung (genauer den Port `net/mrouted`) installiert werden.

Zurück | Zum Anfang | Weiter
Weiterführende Netzwerkthemen | Nach oben | Drahtlose Netzwerke

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.