Inhalt

7. Routing

7.1 Was ist Routing?

In einem lokalen Netzwerk ist das Leben einfach: wenn ein TCP/IP-Paket zu einem anderen Rechner gesendet werden soll, wird dieses auf dem Ethernet verschickt.

Ist der Rechner an das Internet oder an ein größeres Netzwerk (WAN) angeschlossen, ist die Aufgabe schon etwas schwieriger, denn wenn der Ziel-Rechner bzw. die Ziel-IP-Nummer nicht im lokalen Ethernet erreichbar ist, so muß dem Kernel gesagt werden, daß alle nicht lokal zustellbaren Pakete freundlicherweise von einem Gatewayrechner weitergeleitet werden.

Komplizierter ist es, wenn der betreffende Rechner selbst ein Gatewayrechner ist und mehrere Netzdevices wie Ethernetkarten, Modems, ISDN-Karten etc. zur Verfügung hat und jeweils über diese Devices unterschiedliche Rechner/Netze erreichbar sind. Das ist die Aufgabe vom Routing:

Für jede IP-Nummer muß definiert werden, auf welchem Weg (Route) diese erreicht werden kann.

Man unterscheidet folgende Typen:

Netzrouten

Hier wird angeben, wie ein komplettes Netz erreichbar ist. Als Beispiel 1 wollen wir von einem lokalen Ethernet ausgehen, wobei das Netz 192.168.1.0 mit der Netmask 255.255.255.0 über das Device eth0 erreichbar ist.

Hostrouten

Man definiert, wie ein einzelner Rechner erreichbar ist. So ist der Rechner 192.168.0.1 in Beispiel 2 mittels einer syncPPP Verbindung über das Device ippp0 erreichbar.

Default-Route

Im Internet gibt es recht viele IP-Nummern - es ist daher mühsam und langweilig, für alle einzelnen IP-Nummern oder Netze einzelne Routing-Einträge zu machen. Daher gibt es die Möglichkeit, zu sagen, daß alle IP-Nummern, für die keine spezielle Regel vorhanden ist, an den Rechner mit der IP-Nummer 192.168.0.1 geschickt werden sollen. Dieses ist Beispiel 3.

Wobei beachtet werden sollte, daß es im allgemeinen keinen Sinn macht, mehr als eine Default-Route anzugeben.

7.2 Wie konfiguriert man das Routing?

Die Routingeinträge werden dem Kernel zur Laufzeit mit dem Kommando route mitgeteilt und wieder entzogen.

SuSE Methode

Bei SuSE können die Routingeinträge fest in die Datei /etc/route.conf eingetragen werden, die beim Booten oder durch einen Runlevelwechsel vom Skript /sbin/init.d/route ausgewertet wird.

Die Einträge für die obigen Beispiele sehen so aus:

# Beispiel 1:
192.168.1.0     0.0.0.0     255.255.255.0   eth0
# Beispiel 2:
192.168.0.1     0.0.0.0     255.255.255.255 ippp0
# Beispiel 3:
default         192.168.0.1
            

Die 1. Spalte gibt das Ziel an, also das Netz, die IP-Nummer, oder das Schlüsselwort default. In der 3. Spalte steht, falls notwendig, die zugehörige Netmask. Die 2. Spalte legt den Gatewayrechner fest, an den die Anfragen geschickt werden sollen. In der 4. Spalte steht das zu verwendene Device.

Hier sieht man auch in der 3. Zeile, daß bei Verwendung eines Gatewayrechners die Angabe des Devices nicht nötig ist, da sie selbständig ermittelt wird. Allerdings muß in diesem Beispiel die Hostroute auf 192.168.0.1 definiert sein, bevor man sie zum Setzen der Defaultroute nutzen kann. Die Reihenfolge ist wichtig.

Um die Routingtabelle manuell zu setzen oder zu löschen, gibt man folgendes ein:

/sbin/init.d/route start
/sbin/init.d/route stop
            

Manuelle Methode

Natürlich kann man die einzelnen Routing-Einträge auch manuell mit dem route Befehl setzen:

# Beispiel 1:
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0
# Beispiel 2:
route add -host 192.168.0.1 dev ippp0
# Beispiel 3:
route add default gw 192.168.0.1 
            

Weitere Informationen zu route finden sich in man route.

Löschen von Routing-Einträgen

Routing-Einträge können zum einem direkt gelöscht werden, sie werden aber auch automatisch gelöscht, wenn das zugrundeliegende Netzdevice gelöscht oder umkonfiguriert wird.

Dies hat in diesem Zusammenhang einen unerwünschten Nebeneffekt. Der ipppd baut die Verbindung auf und bekommt eine neue IP-Nummer vom Server zugewiesen, wobei selbständig eine neue Hostroute auf die IP-Nummer des Gegners eingerichtet wird.

Allerdings wird eine eventuell vorhandene Defaultroute über dieses Device gelöscht.

Durch die PPP-Option defaultroute könnte man sich automatisch wieder eine Defaultroute anlegen lassen. Allerdings ist diese Methode nicht sehr flexibel, vielleicht will man ja doch keine Defaultroute, und man hätte hiermit keine Möglichkeit zu steuern, wie sich beim Verbindungsabbau verhalten werden soll. Daher wird beim Verbindungauf- und abbau jeweils ein Skript gestartet, siehe Abschnitt Kontrollieren der Routingtabelle beim Verbindungsauf- und abbau.

7.3 Kontrollieren der Routingtabelle beim Verbindungsauf- und abbau

Die Skripte ip-up/ip-down

Der ipppd bietet die einfache Möglichkeit, beim Verbindungsaufbau das Skript /etc/ppp/ip-up und beim Abbau /etc/ppp/ip-down zu starten, wobei jeweils die folgenden Parameter über den neuen Zustand übergeben werden:

Durch Installation geeigneter Skripte kann also die Default-Route neu gesetzt werden. Die Skripte könnten jeweils so aussehen:

#!/bin/sh
/sbin/route add default gw $5
        

Bei SuSE gibt es ein Skript /etc/ppp/ip-up, welches für den Hausgebrauch ausreicht. Die Routen werden aufgrund der Konfigurationsdateien gesetzt und wieder hergestellt. Weitere Kommandos können vom Administrator eingefügt werden, um z.B. E-Mails zu verschicken.

Das Skript ip-down ist ein symbolischer Link auf ip-up, so daß man nur eine Datei zu verwalten hat.

Was machen die Skripte ip-up/ip-down?

Es wird geprüft, ob das Interface ipppx ist; sollte also bei Analog-PPP nicht stören. Wer dort etwas eintragen will, sollte die Stelle leicht finden.

Wenn das Skript nach dem Verbindungsaufbau als ip-up aufgerufen wird, wird eine Default-Route auf die gerade zugewiesene IP-Nummer gesetzt.

Wenn das Skript nach dem Abbau der Verbindung als ip-down aufgerufen wird, dann wird das Interface gelöscht. Das Interface wird wie in /etc/rc.config wieder neu angelegt, es wird also wieder auf die ursprünglichen IP-Nummer gesetzt. Nach den Angaben in /etc/route.conf werden die Routingeinträge für dieses Device neu eingerichtet. Somit ist dial-on-demand wieder möglich. Ist dort keine Default-Route angegeben, wird auch keine gesetzt.

Falls dial-on-demand nicht gewünscht wird, so darf in der Datei /etc/route.conf bzw. in YaST keine Default-Route (Default-Gateway) angegeben werden. Dadurch existiert nur während einer Verbindung eine Default-Route; diese wird beim Verbindungsabbau gelöcht und nicht neu angelegt. Die Verbindung kann dann manuell oder durch ein Skript mit dem Kommando

isdnctrl dial ippp0
aufgebaut werden. Alternativ geht dieses auch durch das manuelle Setzen der Default-Route.

Dadurch kann z.B. auch erreicht werden, daß mit verschiedenen Providern gearbeitet wird. In dem Fall muß man ja sowieso entscheiden, welche Verbindung nun hochgefahren werden soll, z.B.:

isdnctrl dial ippp17

7.4 Übung: Kontrolliere die IP-Nummer und die Routing-Tabelle

Folgende Übung sollte jetzt durchlaufen werden:

  1. Überwache, wie in Abschnitt Betrachte messages beschrieben, die Datei /var/log/messages.
  2. Prüfe ip-up und ip-down:

    # ls -la /etc/ppp/ip-*
    lrwxrwxrwx   1 root     root            5 Mar 20 10:16 /etc/ppp/ip-down -> ip-up
    -rwxr-xr-x   1 root     root         1813 Mar 24 23:03 /etc/ppp/ip-up
                
    
    Siehe auch Abschnitt Installation.

  3. Prüfe die IP-Nummern und die Routingtabelle vor einer Verbindung

    # ifconfig ippp0
    ippp0     Link encap:Point-Point Protocol  
    inet addr:192.168.0.99  P-t-P:192.168.0.1  Mask:255.0.0.0
    UP POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0
    TX packets:0 errors:0 dropped:0 overruns:0
                
    

    # route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    192.168.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 ippp0
    127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        2 lo
    0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 ippp0
                
    

  4. Nun sollte man eine Verbindung initiieren. Dazu kann man entweder ein Paket z.B. mit ping 141.1.1.1 verschicken oder das Wählen direkt mit dem Befehl
    isdnctrl dial ippp0
    
    verlangen. Als Beispiel bekommen wir die IP-Nummer 1.2.3.4 zugewiesen, der Gegner habe die IP-Nummer 5.6.7.8 .
  5. Prüfe die IP-Nummer und die Routingtabelle während einer Verbindung

    # ifconfig ippp0
    ippp0     Link encap:Point-Point Protocol  
    inet addr:1.2.3.4  P-t-P:5.6.7.8  Mask:255.0.0.0
    UP POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
    RX packets:2 errors:0 dropped:0 overruns:0
    TX packets:3 errors:0 dropped:0 overruns:0
                
    

    # route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    5.6.7.8         0.0.0.0         255.255.255.255 UH    0      0        0 ippp0
    127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        2 lo
    0.0.0.0         5.6.7.8         0.0.0.0         UG    0      0        0 ippp0
                
    

  6. Wir gehen in die große weite Welt:

    Bestimme eine existierende IP-Nummer; die einzige, die ich mir merken kann, ist die des DNS-Server von ECRC:

    traceroute -n 141.1.1.1
    
    Man beachte, daß wir noch keinen DNS-Servive benutzen können, daher -n.

  7. Jetzt wartet man auf den Timeout, bis aufgelegt wird, und betrachtet die Datei /var/log/messages, z.B.:
    kernel: isdn_net: local hangup ippp0
    kernel: ippp0: Chargesum is 0
    isdnlog: Apr 03 09:20:49   tei 70 calling Eunet-N with KfrI I  Normal call clearing (User) 
    ipppd[135]: Modem hangup
    ipppd[135]: Connection terminated.
    ipppd[135]: taking down PHASE_DEAD link 0, linkunit: 0
    ipppd[135]: sent [0][LCP TermReq id=0x2 6c 69 6e 6b 20 63 6 c 6f 73 65 64]
    ipppd[135]: LCP is down
    ipppd[135]: link 0 closed , linkunit: 0
    ipppd[135]: reinit_unit: 0 
    ipppd[135]: Connect[0]: /dev/ippp0, fd: 6
                
    
  8. IP-Nummern und Routing prüfen:

    sie müssen jetzt wieder genauso gesetzt sein, wie vor dem Verbindungsaufbau.


Inhalt