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 schede di rete: eth0 (filo), 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 dovrebbe essere usato sia per il traffico in entrata che in uscita per impostazione predefinita.
- Se eth0 fallisce, dovrebbe essere usato wlan1.
- Se wlan1 fallisce, allora dovrebbe essere usato wlan0.
Primo passo : creare una nuova tabella di instradamento per ogni interfaccia in /etc/iproute2/rt_tables
. Chiamiamoli 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 della 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 route rt1. Fin qui tutto bene. Ma il traffico generato localmente (ad esempio si desidera eseguire il ping o ssh dalla macchina verso un altro luogo) richiede un trattamento speciale (vedere la grande citazione nella domanda).
Le prime quattro righe di post-up /etc/network/interfaces
sono semplici e le spiegazioni possono essere trovate su Internet, la quinta e ultima riga di 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 route per questa riga di post-up. Se non specifichi una tabella di route, le informazioni verranno salvate nella main
tabella di route che abbiamo visto ip rule show
. Questa riga di 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 server che tenta di inviare un'e-mail.)
Le tre interfacce inseriscono tutte una route predefinita nella tabella delle route principali, sebbene con metriche diverse. Diamo un'occhiata alla main
tabella dei percorsi 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 delle rotte principali ha tre rotte predefinite, sebbene con metriche diverse. La priorità più alta è eth0, quindi wlan1 e quindi wlan0 perché numeri di metrica inferiori indicano una priorità più alta. Poiché eth0
ha la metrica più bassa, questa è la route predefinita che verrà utilizzata fino a quando eth0
è attiva . Se eth0
diminuisce, il traffico in uscita passerà a wlan1
.
Con questa configurazione possiamo digitare ping 8.8.8.8
un terminale e ifdown eth0
un altro. ping
dovrebbe comunque funzionare perché, poiché ifdown eth0
rimuoverà il percorso predefinito correlato eth0
, il traffico in uscita passerà a wlan1
.
Le righe di post-down assicurano che le relative tabelle di route vengano eliminate dal database dei criteri di routing ( ip rule show
) quando l'interfaccia si interrompe, al fine di mantenere tutto in ordine.
Il problema che rimane è che quando si estrae la spina dalla eth0
route predefinita per eth0
è ancora lì e il traffico in uscita non riesce. Abbiamo bisogno di qualcosa per monitorare le nostre interfacce ed eseguire in ifdown eth0
caso di problemi con l'interfaccia (es. Errore della scheda di rete o qualcuno che stacca la spina).
Ultimo passo : invio ifplugd
. Questo è un demone che guarda le interfacce ed esegue ifup/ifdown
se si stacca 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 è possibile staccare la spina eth0
, il traffico in uscita passerà a wlan1
e se si reinserisce la spina, il traffico in uscita tornerà a eth0
. Il tuo server rimarrà online finché una delle tre interfacce funzionerà. Per la connessione al server è possibile utilizzare l'indirizzo IP di eth0 e, in caso contrario, l'indirizzo IP di wlan1 o wlan0.