Ich habe es selbst gelöst. Es scheint sehr wenig Informationen über die Netzwerkfunktionen zu geben, die Sie mit Linux machen können, also habe ich mich entschlossen, meine Lösung im Detail zu dokumentieren und zu erklären. Dies ist mein letztes Setup:
- 3 NICs:eth0 (Kabel), wlan0 (integriertes WLAN, schwach), wlan1 (USB-WLAN-Adapter, stärkeres Signal als wlan0)
- Alle in einem einzigen Subnetz, jeder mit seiner 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 fehlschlägt, sollte wlan0 verwendet werden.
Erster Schritt :Erstellen Sie eine neue Routing-Tabelle 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 ip rule show
eingeben Sie sollten 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 sagt uns, dass der von der IP-Adresse "192.168.178.99" ein- oder ausgehende Datenverkehr die rt1-Routing-Tabelle verwendet. So weit, ist es gut. Aber Verkehr, der lokal generiert wird (z. B. wenn Sie von der Maschine zu einem anderen Ort pingen oder ssh möchten), erfordert eine besondere Behandlung (siehe das große Zitat in der Frage).
Die ersten vier Post-up-Zeilen in /etc/network/interfaces
sind einfach und Erklärungen können im Internet gefunden werden, die fünfte und letzte Post-up-Zeile ist diejenige, die Magie geschehen lässt:
post-up ip r add default via 192.168.178.1 metric 100 dev eth0
Beachten Sie, dass wir für diese Postup-Zeile keine Routing-Tabelle angegeben haben. Wenn Sie keine Routing-Tabelle angeben, werden die Informationen in main
gespeichert Routing-Tabelle, die wir in ip rule show
gesehen haben . Diese Postup-Zeile fügt eine Standardroute in die "Haupt"-Routentabelle ein, die für lokal generierten Datenverkehr verwendet wird, der keine Antwort auf eingehenden Datenverkehr ist. (Zum Beispiel ein MTA auf Ihrem Server, der versucht, eine E-Mail zu senden.)
Die drei Schnittstellen setzen alle eine Standardroute in die Hauptroutentabelle, wenn auch mit unterschiedlichen Metriken. Werfen wir einen Blick auf die main
Routing-Tabelle 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 hat, wenn auch mit unterschiedlichen Metriken. Die höchste Priorität ist eth0, dann wlan1 und dann wlan0, da niedrigere Metrikzahlen eine höhere Priorität anzeigen. Seit eth0
die niedrigste Metrik hat, ist dies die Standardroute, die verwendet wird, solange eth0
ist oben. Wenn eth0
ausfällt, wechselt der ausgehende Datenverkehr zu wlan1
.
Mit diesem Setup können wir ping 8.8.8.8
eingeben in einem Terminal und ifdown eth0
in einem anderen. ping
sollte trotzdem funktionieren, weil ifdown eth0
entfernt die Standardroute in Bezug auf eth0
, wird der ausgehende Datenverkehr auf wlan1
umgestellt .
Die Postdown-Zeilen stellen sicher, dass die zugehörigen Routing-Tabellen aus der Routing-Richtliniendatenbank gelöscht werden (ip rule show
), wenn die Schnittstelle ausfällt, um alles aufgeräumt zu halten.
Das Problem, das übrig bleibt, ist, dass wenn Sie den Stecker von eth0
ziehen die Standardroute für eth0
ist immer noch da und der ausgehende Datenverkehr schlägt fehl. Wir brauchen etwas, um unsere Schnittstellen zu überwachen und ifdown eth0
auszuführen wenn es ein Problem mit der Schnittstelle gibt (z. B. NIC-Fehler oder jemand, der den Stecker zieht).
Letzter Schritt :Geben Sie ifplugd
ein . Das ist ein Daemon, der Schnittstellen überwacht und ifup/ifdown
ausführt wenn 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 auf eth0
ziehen , wird der ausgehende Datenverkehr auf wlan1
umgestellt und wenn Sie den Stecker wieder einstecken, wechselt der ausgehende Datenverkehr zurück zu eth0
. Ihr Server bleibt online, solange eine der drei Schnittstellen funktioniert. Um sich mit Ihrem Server zu verbinden, können Sie die IP-Adresse von eth0 verwenden und falls dies fehlschlägt, die IP-Adresse von wlan1 oder wlan0.
Linux bietet eine bessere Lösung als Ihre Skriptumgehung:Active-Backup-Bonding.
Auf diese Weise hat Ihre Maschine nur einen IP-Adresse (und eine MAC-Adresse) und schaltet Schnittstellen automatisch und transparent um, wenn eine Schnittstelle nicht mehr verfügbar ist. Keine Unterbrechung einer TCP-Verbindung (weder zu Ihrem internen LAN noch zum Internet).
Ich verwende dieses Setup selbst, um auf meinem Debian-Laptop automatisch von eth0 auf wlan0 umzuschalten, wenn ich meinen Laptop von der Dockingstation trenne.
Mein /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 um mehrere WLAN-Geräte erweitern. Einstellen des
primary_reselect
Option zu better
(Automatisch den schnellsten Link auswählen) sollte hier helfen.
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