È possibile avere più gateway predefiniti per le connessioni in uscita?


15

Vorrei avere più schede di rete (eth0 e wlan0) nella stessa sottorete e fungere da backup per le applicazioni sull'host in caso di errore di una delle schede di rete. Per questo motivo ho creato una tabella di routing aggiuntiva. Ecco come /etc/network/interfacesappare:

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

Funziona per la connessione all'host: posso ancora SSH in esso se una delle interfacce fallisce. Tuttavia, le applicazioni sull'host non possono inizializzare una connessione al mondo esterno se eth0è inattivo. Questo è il mio problema

Ho studiato questo argomento e ho trovato le seguenti informazioni interessanti:

Quando un programma avvia una connessione in uscita è normale che utilizzi l'indirizzo di origine jolly (0.0.0.0), indicando nessuna preferenza su quale interfaccia viene utilizzata a condizione che sia raggiungibile l'indirizzo di destinazione pertinente. Questo non viene sostituito da un indirizzo di origine specifico fino a quando non viene presa la decisione di instradamento. Il traffico associato a tali connessioni non corrisponderà quindi a nessuna delle regole di politica sopra riportate e non verrà indirizzato a nessuna delle tabelle di routing appena aggiunte. Supponendo una configurazione altrimenti normale, passerà invece alla tabella di routing principale. http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html

Quello che voglio è che la tabella di route principale abbia più di un gateway predefinito (uno attivo eth0e uno attivo wlan0) e che passi al gateway predefinito tramite eth0impostazione predefinita e tramite wlan0se non eth0è attivo.

È possibile? Cosa devo fare per ottenere tale funzionalità?


Molto brevemente: diverse rotte predefinite sceglieranno un'interfaccia a caso, il che porta a problemi perché l'IP assegnato è diverso. Quello che vuoi è il multihoming o il raggruppamento , che è difficile da fare, vedi ad esempio qui
— Dirkt

1
È possibile utilizzare il failover dinamico con il bonding . Non è necessario armeggiare con percorsi predefiniti.
— Ingo,

Risposte:


17

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/interfacessono 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 maintabella 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 maintabella 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é eth0ha la metrica più bassa, questa è la route predefinita che verrà utilizzata fino a quando eth0è attiva . Se eth0diminuisce, il traffico in uscita passerà a wlan1.

Con questa configurazione possiamo digitare ping 8.8.8.8un terminale e ifdown eth0un altro. pingdovrebbe comunque funzionare perché, poiché ifdown eth0rimuoverà 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 eth0route 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 eth0caso 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/ifdownse 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 wlan1e 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.


Prova a stabilire una connessione che impiega più tempo (ad esempio scp un file di grandi dimensioni), guarda quale interfaccia di rete utilizza, disabilita quell'interfaccia e vedi cosa succede.
— Dirkt

La scpsessione si interromperà perché l'indirizzo IP cambia. È possibile provare a utilizzare withsctpper mantenere attiva la connessione in tal caso o utilizzare rsyncinvece di scplimitare il trasferimento dal punto in cui è stata interrotta.
— rosix,

Il punto è: se si interrompe, qual è il vantaggio della tua configurazione complicata rispetto ad avere una sola route predefinita, ad esempio sull'interfaccia di rete più veloce attualmente attiva? withsctpfunzionerà anche per una sola route predefinita.
— diretto il

1
"Qual è il vantaggio della tua complicata configurazione rispetto ad avere una sola route predefinita, ad esempio sull'interfaccia di rete più veloce attualmente attiva?" >> Questo è esattamente ciò che la mia configurazione sta facendo. Per impostazione predefinita viene utilizzato solo il percorso predefinito più veloce (eth0). Prego.
— rosix,

10

Linux offre una soluzione migliore rispetto alla soluzione alternativa tramite script: legame attivo-backup.

In questo modo la macchina avrà solo un indirizzo IP (e un indirizzo MAC) e in modo automatico e passare in modo trasparente le interfacce se un'unica interfaccia non è più disponibile. Nessuna interruzione di qualsiasi connessione TCP (né alla propria 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 laptop dalla docking station.

My / 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

È possibile estendere facilmente questa configurazione per includere più dispositivi WLAN. L'impostazione primary_reselectdell'opzione su better(seleziona automaticamente il collegamento più veloce) dovrebbe aiutare qui.

Per ulteriori informazioni consultare 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.