Ist es möglich, mehrere Standardgateways für ausgehende Verbindungen zu haben?

14

Ich möchte mehrere Netzwerkkarten (eth0 und wlan0) im selben Subnetz haben und als Backup für die Anwendungen auf dem Host dienen, wenn eine der Netzwerkkarten ausfällt. Aus diesem Grund habe ich eine zusätzliche Routing-Tabelle angelegt. So /etc/network/interfacessieht es aus:

iface eth0 inet static
address 192.168.178.2
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.2
    post-up ip route add default via 192.168.178.1 dev eth0
    post-up ip rule add from 192.168.178.2/32
    post-up ip rule add to 192.168.178.2/32

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.3
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.3 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.3/32 table rt2
    post-up ip rule add to 192.168.178.3/32 table rt2

Das funktioniert für die Verbindung zum Host: Ich kann immer noch SSH verwenden, wenn eine der Schnittstellen ausfällt. Die Anwendungen auf dem Host können jedoch keine Verbindung zur Außenwelt herstellen, wenn sie eth0inaktiv sind. Das ist mein problem

Ich habe dieses Thema recherchiert und folgende interessante Informationen gefunden:

Wenn ein Programm eine ausgehende Verbindung initiiert, verwendet es normalerweise die Platzhalter-Quelladresse (0.0.0.0), wobei angegeben wird, welche Schnittstelle verwendet wird, sofern die entsprechende Zieladresse erreichbar ist. Dies wird erst durch eine bestimmte Quelladresse ersetzt, nachdem die Routing-Entscheidung getroffen wurde. Der mit solchen Verbindungen verbundene Datenverkehr entspricht daher keiner der oben genannten Richtlinienregeln und wird nicht an eine der neu hinzugefügten Routingtabellen weitergeleitet. Unter der Annahme einer ansonsten normalen Konfiguration wird sie stattdessen in die Hauptroutingtabelle übernommen. http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html

Was ich möchte, ist, dass die Hauptroutentabelle mehr als ein Standard-Gateway hat (eins an eth0und eins an wlan0) und standardmäßig zum Standard-Gateway wechselt eth0und wlan0ob ausgefallen eth0ist.

Ist das möglich? Was muss ich tun, um eine solche Funktionalität zu erreichen?

rosix
quelle
Sehr kurz: Mehrere Standardrouten wählen zufällig eine Schnittstelle aus, was zu Problemen führt, da die zugewiesene IP unterschiedlich ist. Was Sie wollen, ist Multihoming oder Bündelung , was schwierig ist, siehe z. B. hier
dirkt
1
Sie können dynamisches Failover beim Bonden verwenden . Es besteht keine Notwendigkeit, mit Standardrouten zu fummeln.
Ingo

Antworten:

16

Ich habe es selbst gelöst. Anscheinend gibt es nur sehr wenige Informationen über die Netzwerkfunktionen, die Sie mit Linux ausführen können. Ich habe mich daher entschlossen, meine Lösung detailliert zu dokumentieren und zu erläutern. Dies ist meine endgültige Einrichtung:

  • 3 Netzwerkkarten: eth0 (Draht), wlan0 (integriertes WLAN, schwach), wlan1 (USB-WLAN-Adapter, stärkeres Signal als wlan0)
  • Alle in einem einzigen Subnetz, jedes mit einer eigenen IP-Adresse.
  • eth0 sollte standardmäßig sowohl für eingehenden als auch für ausgehenden Datenverkehr verwendet werden.
  • Wenn eth0 fehlschlägt, sollte wlan1 verwendet werden.
  • Wenn wlan1 ausfällt, sollte wlan0 verwendet werden.

Erster Schritt : Erstellen Sie eine neue Routentabelle für jede Schnittstelle in /etc/iproute2/rt_tables. Nennen wir sie rt1, rt2 und rt3

#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1  inr.ruhep
1 rt1
2 rt2
3 rt3

Zweiter Schritt : Netzwerkkonfiguration in /etc/network/interfaces. Dies ist der Hauptteil und ich werde versuchen, so viel wie möglich zu erklären:

auto eth0 wlan0
allow-hotplug wlan1

iface lo inet loopback

iface eth0 inet static
address 192.168.178.99
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.99 table rt1
    post-up ip route add default via 192.168.178.1 dev eth0 table rt1
    post-up ip rule add from 192.168.178.99/32 table rt1
    post-up ip rule add to 192.168.178.99/32 table rt1
    post-up ip route add default via 192.168.178.1 metric 100 dev eth0
    post-down ip rule del from 0/0 to 0/0 table rt1
    post-down ip rule del from 0/0 to 0/0 table rt1

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.97
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.97 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.97/32 table rt2
    post-up ip rule add to 192.168.178.97/32 table rt2
    post-up ip route add default via 192.168.178.1 metric 102 dev wlan0
    post-down ip rule del from 0/0 to 0/0 table rt2
    post-down ip rule del from 0/0 to 0/0 table rt2

iface wlan1 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.98
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan1 src 192.168.178.98 table rt3
    post-up ip route add default via 192.168.178.1 dev wlan1 table rt3
    post-up ip rule add from 192.168.178.98/32 table rt3
    post-up ip rule add to 192.168.178.98/32 table rt3
    post-up ip route add default via 192.168.178.1 metric 101 dev wlan1
    post-down ip rule del from 0/0 to 0/0 table rt3
    post-down ip rule del from 0/0 to 0/0 table rt3

Wenn Sie eingeben ip rule show, sollten Sie Folgendes sehen:

0:  from all lookup local 
32756:  from all to 192.168.178.98 lookup rt3 
32757:  from 192.168.178.98 lookup rt3 
32758:  from all to 192.168.178.99 lookup rt1 
32759:  from 192.168.178.99 lookup rt1 
32762:  from all to 192.168.178.97 lookup rt2 
32763:  from 192.168.178.97 lookup rt2 
32766:  from all lookup main 
32767:  from all lookup default 

Dies teilt uns mit, dass eingehender oder ausgehender Verkehr von der IP-Adresse "192.168.178.99" die Route-Tabelle rt1 verwendet. So weit, ist es gut. Datenverkehr, der lokal generiert wird (zum Beispiel, wenn Sie einen Ping-Befehl oder einen SSH-Befehl von der Maschine an eine andere Stelle senden möchten), muss jedoch speziell behandelt werden (siehe das große Zitat in der Frage).

Die ersten vier Post-Up-Zeilen /etc/network/interfacessind unkompliziert und Erklärungen finden Sie im Internet. Die fünfte und letzte Post-Up-Zeile ist diejenige, die Magie möglich macht:

post-up ip r add default via 192.168.178.1 metric 100 dev eth0

Beachten Sie, dass wir für diese Post-Up-Zeile keine Routentabelle angegeben haben. Wenn Sie keine Routentabelle angeben, werden die Informationen in der Routentabelle gespeichert, in der mainwir sie gesehen haben ip rule show. Diese Post-Up-Zeile fügt eine Standardroute in die "Haupt" -Routentabelle ein, die für lokal generierten Verkehr verwendet wird, der keine Antwort auf eingehenden Verkehr ist. (Zum Beispiel ein MTA auf Ihrem Server, der versucht, eine E-Mail zu senden.)

Die drei Schnittstellen fügen alle eine Standardroute in die Hauptroutentabelle ein, allerdings mit unterschiedlichen Metriken. Werfen wir einen Blick auf die mainRoutentabelle mit ip route show:

default via 192.168.178.1 dev eth0  metric 100 
default via 192.168.178.1 dev wlan1  metric 101 
default via 192.168.178.1 dev wlan0  metric 102 
192.168.178.0/24 dev wlan0  proto kernel  scope link  src 192.168.178.97 
192.168.178.0/24 dev eth0  proto kernel  scope link  src 192.168.178.99 
192.168.178.0/24 dev wlan1  proto kernel  scope link  src 192.168.178.98

Wir können sehen, dass die Hauptroutentabelle drei Standardrouten enthält, allerdings mit unterschiedlichen Metriken. Die höchste Priorität ist eth0, dann wlan1 und dann wlan0, da niedrigere Metrikzahlen eine höhere Priorität anzeigen. Da eth0die niedrigste Metrik vorliegt, ist dies die Standardroute, die verwendet wird, solange sie aktiv eth0ist. Bei einem eth0Ausfall wird der ausgehende Verkehr auf umgeschaltet wlan1.

Mit diesem Setup können wir ping 8.8.8.8ein Terminal und ifdown eth0ein anderes eingeben. pingsollte immer noch funktionieren, da dadurch ifdown eth0die Standardroute entfernt wird, auf die der eth0ausgehende Verkehr umgeschaltet wird wlan1.

Die nachgeordneten Zeilen stellen sicher, dass die zugehörigen Routentabellen beim Ausfall ip rule showder Schnittstelle aus der Routing-Richtliniendatenbank ( ) gelöscht werden, um Ordnung zu schaffen.

Das Problem, das übrig bleibt, ist, dass, wenn Sie den Stecker von eth0der Standardroute für ziehen, eth0immer noch da ist und ausgehender Verkehr fehlschlägt. Wir brauchen etwas, um unsere Schnittstellen zu überwachen und auszuführen, ifdown eth0wenn ein Problem mit der Schnittstelle vorliegt (z. B. NIC-Fehler oder Ziehen des Steckers).

Letzter Schritt : eintreten ifplugd. Das ist ein Daemon, der Interfaces überwacht und ausführt, ifup/ifdownwenn Sie den Stecker ziehen oder wenn es ein Problem mit der WLAN-Verbindung gibt /etc/default/ifplugd:

INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"

Sie können jetzt den Stecker ziehen eth0, der ausgehende Verkehr wird auf umgeschaltet, wlan1und wenn Sie den Stecker wieder einstecken, wird der ausgehende Verkehr auf umgeschaltet eth0. Ihr Server bleibt online, solange eine der drei Schnittstellen funktioniert. Für die Verbindung zu Ihrem Server können Sie die IP-Adresse von eth0 verwenden, und wenn dies fehlschlägt, die IP-Adresse von wlan1 oder wlan0.

rosix
quelle
Versuchen Sie, eine Verbindung herzustellen, die länger dauert (z. B. scp einer großen Datei), beobachten Sie, welche Netzwerkschnittstelle verwendet wird, deaktivieren Sie diese Schnittstelle und sehen Sie, was passiert.
Dirkt
Die scpSitzung wird unterbrochen, da sich die IP-Adresse ändert. Sie könnten versuchen , mit withsctpder Verbindung am Leben in einem solchen Fall zu halten oder zu verwenden , rsyncanstatt scpdie Übertragung von dem Punkt contine wo es gestoppt.
Rosix
Der springende Punkt ist: Wenn es kaputt geht, was ist der Vorteil Ihres komplizierten Setups gegenüber nur einer einzigen Standardroute, beispielsweise auf der schnellsten Netzwerkschnittstelle, die derzeit aktiv ist? withsctpfunktioniert auch nur für eine Standardroute.
Dirkt
1
"Was ist der Vorteil Ihres komplizierten Setups gegenüber nur einer einzigen Standardroute, beispielsweise auf der schnellsten Netzwerkschnittstelle, die derzeit aktiv ist?" >> Genau das macht mein Setup. Standardmäßig wird nur die schnellste Standardroute (eth0) verwendet. Bitte.
Rosix
10

Linux bietet eine bessere Lösung als Ihre skriptbasierte Problemumgehung: Active-Backup-Bonding.

Auf diese Weise verfügt Ihr Computer nur über eine IP-Adresse (und eine Mac-Adresse) und wechselt automatisch und transparent die Schnittstelle, wenn eine Schnittstelle nicht mehr verfügbar ist. Keine Unterbrechung einer TCP-Verbindung (weder zu Ihrem internen LAN noch zum Internet).

Ich benutze dieses Setup selbst, um auf meinem Debian-Laptop automatisch ein Failover von eth0 auf wlan0 durchzuführen, wenn ich meinen Laptop von der Dockingstation trenne.

Meine / etc / network / interfaces:

# The primary network interface
allow-hotplug eth0
iface eth0 inet manual
        bond-master bond0
        bond-primary eth0

# The secondary network interface
allow-hotplug wlan0
iface wlan0 inet manual
        pre-up sleep 5
        wpa-conf /etc/wpa_supplicant.conf
        bond-master bond0
        bond-primary eth0

# The bonding interface
allow-hotplug bond0
iface bond0 inet dhcp
        bond-slaves eth0 wlan0
        bond-primary eth0
        bond-mode active-backup
        bond-miimon 10
        bond_downdelay 10
        bond_updelay 4000

Sie können dieses Setup problemlos auf mehrere WLAN-Geräte erweitern. Das Setzen der primary_reselectOption auf better(automatisch den schnellsten Link auswählen) sollte hier Abhilfe schaffen.

Weitere Informationen finden Sie unter https://wiki.linuxfoundation.org/networking/bonding und https://wiki.debian.org/Bonding

Und (natürlich) die Linux-Kernel-Dokumentation unter https://www.kernel.org/doc/Documentation/networking/bonding.txt

Thilo
quelle