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/interfaces
sieht 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 eth0
inaktiv 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 eth0
und eins an wlan0
) und standardmäßig zum Standard-Gateway wechselt eth0
und wlan0
ob ausgefallen eth0
ist.
Ist das möglich? Was muss ich tun, um eine solche Funktionalität zu erreichen?
Antworten:
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:
Erster Schritt : Erstellen Sie eine neue Routentabelle für jede Schnittstelle in
/etc/iproute2/rt_tables
. Nennen wir sie rt1, rt2 und rt3Zweiter Schritt : Netzwerkkonfiguration in
/etc/network/interfaces
. Dies ist der Hauptteil und ich werde versuchen, so viel wie möglich zu erklären:Wenn Sie eingeben
ip rule show
, sollten Sie Folgendes sehen: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/interfaces
sind unkompliziert und Erklärungen finden Sie im Internet. Die fünfte und letzte Post-Up-Zeile ist diejenige, die Magie möglich macht: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
main
wir sie gesehen habenip 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
main
Routentabelle mitip route show
: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
eth0
die niedrigste Metrik vorliegt, ist dies die Standardroute, die verwendet wird, solange sie aktiveth0
ist. Bei einemeth0
Ausfall wird der ausgehende Verkehr auf umgeschaltetwlan1
.Mit diesem Setup können wir
ping 8.8.8.8
ein Terminal undifdown eth0
ein anderes eingeben.ping
sollte immer noch funktionieren, da dadurchifdown eth0
die Standardroute entfernt wird, auf die dereth0
ausgehende Verkehr umgeschaltet wirdwlan1
.Die nachgeordneten Zeilen stellen sicher, dass die zugehörigen Routentabellen beim Ausfall
ip rule show
der Schnittstelle aus der Routing-Richtliniendatenbank ( ) gelöscht werden, um Ordnung zu schaffen.Das Problem, das übrig bleibt, ist, dass, wenn Sie den Stecker von
eth0
der Standardroute für ziehen,eth0
immer noch da ist und ausgehender Verkehr fehlschlägt. Wir brauchen etwas, um unsere Schnittstellen zu überwachen und auszuführen,ifdown eth0
wenn 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/ifdown
wenn Sie den Stecker ziehen oder wenn es ein Problem mit der WLAN-Verbindung gibt/etc/default/ifplugd
:Sie können jetzt den Stecker ziehen
eth0
, der ausgehende Verkehr wird auf umgeschaltet,wlan1
und wenn Sie den Stecker wieder einstecken, wird der ausgehende Verkehr auf umgeschalteteth0
. 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.quelle
scp
Sitzung wird unterbrochen, da sich die IP-Adresse ändert. Sie könnten versuchen , mitwithsctp
der Verbindung am Leben in einem solchen Fall zu halten oder zu verwenden ,rsync
anstattscp
die Übertragung von dem Punkt contine wo es gestoppt.withsctp
funktioniert auch nur für eine Standardroute.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:
Sie können dieses Setup problemlos auf mehrere WLAN-Geräte erweitern. Das Setzen der
primary_reselect
Option aufbetter
(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
quelle