Archiv/Multiple Uplink Routing

Archivierte Anleitung

Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Ein Terminal öffnen

  2. Einen Editor öffnen

  3. Rechte für Dateien und Ordner ändern

Inhaltsverzeichnis
  1. Verbindungsteilung
    1. Definitionen zum Umgang mit den Variable...
    2. Deklaration
    3. Routing
  2. Datenaufteilung
  3. Automatisierung

Diese Anleitung basiert auf diesem Howto 🇬🇧 auf lartc.org und erklärt die Benutzung mehrerer Internetprovider über einen Computer.

./mpa.jpg

Was ist nach dieser Anleitung möglich?

Was ist nach dieser Anleitung nicht möglich?

Die Anfragen, die der Rechner an das Internet stellt, werden nacheinander auf beide Uplinks verteilt, das heißt, dass häufige Anfragen zu ein und derselben Internetseite meist über den selben Provider abgewickelt werden.

Verbindungsteilung

Als erstes bearbeitet man die Datei /etc/iproute2/rt_tables in einem Editor mit Root-Rechten [2]. Dort erstellt man zwei neue Routing-Tabellen "T1" und "T2", indem man die Zeilen

1     T1
2     T2

an das Dateiende anfügt und die Datei speichert.

Definitionen zum Umgang mit den Variablen

IF Name der Netzwerkschnittstelle z.B. eth0
IP IP - Adresse der Netzwerkschnittstelle z.B. 192.168.0.22
P IP - Adresse des Gateways z.B. 192.168.0.1
P_NET Adressbereich, in dem sich P befindet z.B. 192.168.0.0
P0_NET Lokaler Adressbereich z.B. 127.0.0.0
IF0 Lokale Netzwerkschnittstelle z.B. lo

Alle nötigen Informationen können der Ausgabe [1] von

ifconfig 

entnommen werden.

Deklaration

Da man für die Befehle unten dauerhaft Root-Rechte benötigt, sollte man ein Root-Terminal [1] öffnen (oder andernfalls sudo vor alle Befehle anstellen). Nun legt man oben genannte Variablen fest, um später Tipparbeit zu sparen. Die Platzhalter [] müssen entsprechend angepasst werden.

export IF1=[eth0]
export IP1=[192.168.0.22]
export P1=[192.168.0.1]
export P1_NET=[192.168.0.0]

export IF2=[eth1]
export IP2=[192.168.1.33]
export P2=[192.168.1.1]
export P2_NET=[192.168.1.0]

export IF0=[lo]
export P0_NET=[127.0.0.0] 

Wenn alle Werte korrekt übernommen sind, können folgende Befehle einfach in das Terminal kopiert werden.

Routing

Eventuell müssen noch vorhandene Default-IP-Routen gelöscht werden. Dies geschieht per

ip route delete default 

Achtung!

Die Internetverbindung geht hierbei verloren und ist erst nach einem Neustart oder dem erneuten Festlegen wieder verfügbar.

Bei mehreren Default-Routen muss der Befehl mehrmals ausgeführt werden. Wieviele vorhanden sind, lässt sich mittels

ip route show 

feststellen. Nun wird das Routing in den Tabellen "T1" und "T2" festgelegt:

ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2 

Um den korrekten Ursprung der Pakete zu bewahren, nutzt man Folgendes:

ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2 

Nun wird eingestellt, welche Routing-Tabellen genutzt werden:

ip rule add from $IP1 table T1
ip rule add from $IP2 table T2 

Folgende Befehle stellen sicher, dass der eingehende Verkehr über ein bestimmtes Interface auch von diesem beantwortet wird:

ip route add $P0_NET dev $IF0 table T1
ip route add $P2_NET dev $IF2 table T1
ip route add 127.0.0.0/8 dev lo table T1
ip route add $P0_NET dev $IF0 table T2
ip route add $P1_NET dev $IF1 table T2
ip route add 127.0.0.0/8 dev lo table T2 

Datenaufteilung

Anstelle eines Providers, der als Standard festgelegt wird, wird der Datenstrom nun über beide verteilt. Dies ist also der eigentliche und kürzeste Teil der Arbeit.

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1 

Die weight-Kriterien können je nach Bedarf angepasst werden. Soll z.B. Provider I zu 3/4 und Provider II zu 1/4 genutzt werden, so wären weight 75 und weight 25 einzustellen.

Automatisierung

Die Einstellungen gehen nach jedem Neustart verloren, deshalb ist es sinnvoll sie mit einem Skript zu automatisieren. Außerdem bekommt man von seinem Provider auch oft nur dynamische IPs zugewiesen. Das folgende Skript parst die nötigen Informationen automatisch. Man muss lediglich die Namen der Schnittstellen ändern. Man erstellt dazu eine neue Datei in einem Editor [2] mit folgendem Inhalt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/sh

export IF1="raub0"; ### <<< Hier ändern
export IP1=`ifconfig $IF1 | grep "inet Adresse:"|cut -d":" -f2|cut -d" " -f1`;
export P1="`echo $IP1| cut -d"." -f 1-3`.1";
export P1_NET="`echo $IP1| cut -d"." -f 1-3`.0"

export IF2="eth1"; ### <<< Hier ändern
export IP2=`ifconfig $IF2 | grep "inet Adresse:"|cut -d":" -f2|cut -d" " -f1`;
export P2="`echo $IP2| cut -d"." -f 1-3`.1";
export P2_NET="`echo $IP2| cut -d"." -f 1-3`.0"

export IF0="lo";
export P0_NET="127.0.0.0";

ip route delete default;
ip route delete default;

ip route add $P1_NET dev $IF1 src $IP1 table T1;
ip route add default via $P1 table T1;
ip route add $P2_NET dev $IF2 src $IP2 table T2;
ip route add default via $P2 table T2;

ip route add $P1_NET dev $IF1 src $IP1;
ip route add $P2_NET dev $IF2 src $IP2;

ip rule add from $IP1 table T1;
ip rule add from $IP2 table T2;

ip route add $P0_NET dev $IF0 table T1;
ip route add $P2_NET dev $IF2 table T1;
ip route add 127.0.0.0/8 dev lo table T1;
ip route add $P0_NET dev $IF0 table T2;
ip route add $P1_NET dev $IF1 table T2;
ip route add 127.0.0.0/8 dev lo table T2;

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1

echo "done.";

exit

In dem Skript müssen die Variablen entsprechend angepasst werden. Anschließend speichert man die Datei ab und macht sie ausführbar [3]. Das Skript lässt sich im Terminal mittels

sudo /PFAD/ZUM/SKRIPTNAMEN 

starten. Die Automatisierung sollte über die rc.local-Datei geschehen. Dabei ist Folgendes einzufügen:

/PFAD/ZUM/SKRIPTNAMEN

Danach wird das Skript bei jedem Systemstart automatisch ausgeführt.