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 am Internet oder in einem grösseren Netzwerk (WAN) angeschlossen, ist die Aufgabe schon etwas schwieriger, denn wenn der Ziel-Rechner (bzw. Ziel-IP-Nummer) nicht im lokalen Ethernet erreichbar ist, so muss 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 (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: (die Beispiele werden unter konkretisiert)
Hier wird angeben, wie ein komplettes Netz erreichbar ist. Beispiel für ein lokales Ethernet:
Bsp 1: Das Netz 192.168.1.0 mit der Maske 255.255.255.0 ist
über das Device eth0 erreichbar.
Man definiert, wie ein einzelner Rechner erreichbar ist. Beispiel für eine syncPPP Verbindung:
Bsp 2: Der Rechner 192.168.0.1 ist über das
Device ippp0 erreichbar.
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:
Bsp 3: Alle IP-Nummern, für die keine spezielle
Regel vorhanden ist, schicke an den Rechner mit
der IP-Nummer 192.168.0.1.
Man beachte: es macht i.A. keinen Sinn, mehr als
eine Default-Route anzugeben.
Die Routingeinträge werden dem Kernel zur Laufzeit
mit dem Kommando route
mitgeteilt (und wieder entzogen).
Bei S.u.S.E. können die Routingeinträge fest in die Datei
/etc/route.conf
eingetragen werden, die beim Booten oder durch einen
Runlevelwechsel vom Script
/sbin/init.d/route
ausgewertet wird.
Die Einträge für die obigen Beispiele sehen so aus:
# Bsp 1:
192.168.1.0 0.0.0.0 255.255.255.0 eth0
# Bsp 2:
192.168.0.1 0.0.0.0 255.255.255.255 ippp0
# Bsp 3:
default 192.168.0.1
Die 1. Spalte gibt das Ziel an, also das Netz, die IP-Nummer,
oder das Schlüßelwort default
.
In der 3. Spalte steht die zugehörige Netzmaske
(falls notwendig).
In der 2. Spalte steht der Gatewayrechner, 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 selbststämdig 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. Merke: Die Reihenfolge
ist wichtig.
Manuelles Setzen und Löschen der Routingtabelle:
/sbin/init.d/route start
/sbin/init.d/route stop
# Bsp 1:
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0
# Bsp 2:
route add -host 192.168.0.1 dev ippp0
# Bsp 3:
route add default gw 192.168.0.1
Mehr Infos: man route
.
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 ungewünschten Nebeneffekt.
Der ipppd
baut die Verbindung auf und bekommt eine
neue IP-Nummer vom Server zugewiesen, wobei selbstständig
eine neue Hostroute auf die IP-Nummer des Gegners
eingerichtet wird.
Allerdings wird eine ev. vorhandene Defaultroute über dieses Device gelöscht.
Durch die PPP-Option defaultroute
könnte man sich automatisch wieder eine 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
Script gestartet, siehe
Kontrollieren der Routingtabelle beim Verbindungsauf- und abbau.
Der ipppd
bietet die einfache Möglichkeit
beim Verbindungsaufbau das Script
/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 Scripte kann also die Default-Route neu gesetzt werden. Die Scripte könnten jeweils so aussehen:
#!/bin/sh
/sbin/route add default gw $5
Bei S.u.S.E. wird ein Script /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 (z.B. Mails
verschicken).
Das Script ip-down
ist ein symbolischer Link auf
ip-up
, so daß man nur eine Datei zu verwalten hat.
Es wird geprüft. ob das Interface ippp? ist, sollte also bei Analog-PPP nicht stören, wer dort etwas eintragen will, sollte die Stelle leicht finden.
Wenn es als ip-up
aufgerufen wird (also nach dem
Verbindungsaufbau),
wird eine Default-Route auf die gerade zugewiesene IP-Nummer
gesetzt.
Wenn es als ip-up
aufgerufen wird (also nach dem
Verbindungsabbau), 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 Defaultroute angegeben, wird auch keine gesetzt.
In der /etc/route.conf
(bzw. in YaST) wird keine
Default-Route (Default-Gateway) angeben, 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 Script) durch
isdnctrl dial ippp0
aufgebaut werden
(oder durch manuelles setzen der Default-Route).
Dadurch kann z.B. auch erreicht werden, dass mit verschiedenen
Providern gearbeitet wird, in dem Fall muss man ja
sowieso entscheiden, welche
Verbindung nun hochgefahren werden soll, z.B.
isdnctrl dial ippp17
/var/log/messages
überwachen
Siehe Betrachte messages
ip-up
und ip-down
glen:/root # 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
Installation
glen:/root # 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
glen:/root # 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
Man kann entweder ein Pakete verschicken (z.B.
ping 141.1.1.1
oder das Wählen direkt verlangen
isdnctrl dial ippp0
Als Beispiel bekommen wir die IP-Nummer
1.2.3.4
zugewiesen, der Gegner habe die
IP-Nummer 5.6.7.8
(siehe messages).
glen:/root # 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
glen:/root # 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
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
.
betrachte /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
sie müssen jetzt wieder genausogesetzt sein, wie vor dem Verbindungsaufbau.