È 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.