Risolto da solo. Sembra che ci siano pochissime informazioni sulle cose di rete che puoi fare con Linux, quindi ho deciso di documentare e spiegare la mia soluzione in dettaglio. Questa è la mia configurazione finale:
- 3 NIC:eth0 (wire), wlan0 (wifi integrato, debole), wlan1 (adattatore wifi usb, segnale più forte di wlan0)
- Tutti su una singola sottorete, ognuno con il proprio indirizzo IP.
- eth0 deve essere utilizzato per impostazione predefinita sia per il traffico in entrata che per quello in uscita.
- Se eth0 fallisce, dovrebbe essere usato wlan1.
- Se wlan1 fallisce, dovrebbe essere usato wlan0.
Primo passo :Crea una nuova tabella di instradamento per ogni interfaccia in /etc/iproute2/rt_tables
. Chiamiamole rt1, rt2 e rt3
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 rt1
2 rt2
3 rt3
Secondo passaggio :configurazione di rete in /etc/network/interfaces
. Questa è la parte principale e cercherò di spiegare il più possibile:
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
Se digiti ip rule show
dovresti vedere quanto segue:
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
Questo ci dice che il traffico in entrata o in uscita dall'indirizzo IP "192.168.178.99" utilizzerà la tabella di instradamento rt1. Fin qui tutto bene. Ma il traffico generato localmente (ad esempio, vuoi eseguire il ping o ssh dalla macchina a un'altra destinazione) necessita di un trattamento speciale (vedi la citazione grande nella domanda).
Le prime quattro righe post-up in /etc/network/interfaces
sono semplici e le spiegazioni possono essere trovate su Internet, la quinta e ultima riga post-up è quella che fa accadere la magia:
post-up ip r add default via 192.168.178.1 metric 100 dev eth0
Nota come non abbiamo specificato una tabella di instradamento per questa riga di post-up. Se non specifichi una tabella di instradamento, le informazioni verranno salvate nel main
tabella di route che abbiamo visto in ip rule show
. Questa riga post-up inserisce una route predefinita nella tabella di route "principale" utilizzata per il traffico generato localmente che non è una risposta al traffico in entrata. (Ad esempio un MTA sul tuo server che tenta di inviare un'e-mail.)
Le tre interfacce inseriscono tutte una route predefinita nella tabella di route principale, anche se con metriche diverse. Diamo un'occhiata al main
tabella di instradamento con 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
Possiamo vedere che la tabella di instradamento principale ha tre instradamenti predefiniti, anche se con metriche diverse. La priorità più alta è eth0, quindi wlan1 e quindi wlan0 perché i numeri di metrica più bassi indicano una priorità più alta. Dal eth0
ha la metrica più bassa questo è il percorso predefinito che verrà utilizzato fino a eth0
è su. Se eth0
scende, il traffico in uscita passerà a wlan1
.
Con questa configurazione possiamo digitare ping 8.8.8.8
in un terminale e ifdown eth0
in un altro. ping
dovrebbe ancora funzionare perché perché ifdown eth0
rimuoverà il percorso predefinito relativo a eth0
, il traffico in uscita passerà a wlan1
.
Le righe post-down assicurano che le relative tabelle di instradamento vengano eliminate dal database delle politiche di instradamento (ip rule show
) quando l'interfaccia non funziona, per mantenere tutto in ordine.
Il problema che rimane è che quando stacchi la spina da eth0
il percorso predefinito per eth0
è ancora presente e il traffico in uscita non riesce. Abbiamo bisogno di qualcosa per monitorare le nostre interfacce ed eseguire ifdown eth0
se c'è un problema con l'interfaccia (ad es. errore NIC o qualcuno che stacca la spina).
Ultimo passaggio :inserisci ifplugd
. Questo è un demone che controlla le interfacce ed esegue ifup/ifdown
se stacchi la spina o se c'è un problema con la connessione wifi /etc/default/ifplugd
:
INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"
Ora puoi staccare la spina da eth0
, il traffico in uscita passerà a wlan1
e se reinserisci la spina, il traffico in uscita tornerà a eth0
. Il tuo server rimarrà online finché una delle tre interfacce funzionerà. Per connetterti al tuo server puoi utilizzare l'indirizzo IP di eth0 e, se fallisce, l'indirizzo IP di wlan1 o wlan0.
Linux fornisce una soluzione migliore rispetto alla tua soluzione alternativa con script:l'associazione del backup attivo.
In questo modo la tua macchina ne avrà solo una indirizzo ip (e un indirizzo mac) e cambia automaticamente e in modo trasparente le interfacce se un'interfaccia non è più disponibile. Nessuna interruzione di alcuna connessione TCP (né alla tua LAN interna né a Internet).
Sto usando questa configurazione per eseguire automaticamente il failover da eth0 a wlan0 sul mio laptop debian quando disconnetto il mio laptop dalla docking station.
Le mie /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
Puoi facilmente estendere questa configurazione per includere più dispositivi WLAN. Impostazione del
primary_reselect
opzione a better
(seleziona automaticamente il collegamento più veloce) dovrebbe essere d'aiuto.
Per maggiori informazioni vedere https://wiki.linuxfoundation.org/networking/bonding e https://wiki.debian.org/Bonding
E (ovviamente) la documentazione del kernel Linux su https://www.kernel.org/doc/Documentation/networking/bonding.txt