c'e' solo un modo di fare le cose: farle bene
Spesso Linux viene usato come router e quelli che definiscono tale soluzione “casalinga” si sbagliano di grosso perché grazie alla potenzilità di netfilter e di iproute linux si trasforma un un avanzatissimo router dalle mille funzionalità.
In questo articolo descriverò com’è possibile dividire il traffico proveniente dalla vostra LAN verso due gateway di due provider distinti in modo tale da velocizzare il download dei client.
Schemattizzando la rete, dovremmo avere questo:

Premesso che:
Sarà necessario installare iproute:
apt-get install iproute
Adesso aggiungiamo le due nuove tabelle di routing nel file /etc/iproute2/rt_tables:
255 local
254 main
253 default
#Righe aggiunte
252 ngi
251 fastweb
#Fine
0 unspec
Come potete vedere, ho aggiunto due tabelle che si chiamano ngi e fastweb così non ho difficoltà a ricordare i provider che utilizzo.
Una volta salavato il file sarà necessario creare questo script:
#!/bin/bash
### VARIABILI DA SETTARE
#Interfaccia LAN
IF0="eth0";
# Network dell'interfaccia LAN
P0_NET="";
# Interfaccia provider 1
IF1="eth1";
# IP dell'interfaccia associata al provider 1
IP1="";
# Gateway del provider 1
P1="";
# Network del provider 1
P1_NET="";
# Tabella di routing provider 1
T1="fastweb";
# Interfaccia provider 2
IF2="eth2";
# IP dell'interfaccia associata al provider 2
IP2="";
# Gateway del provider 2
P2="";
# Network del provider 2
P2_NET="";
# Tabella di routing provider 2
T2="ngi";
## FINE VARIABILI DA SETTARE
# Attivazione ip_forward e rp_filter...
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
ip route add $P1_NET dev $IF1 src $IP1 table $T1
ip route add default via $P1 table $T1
ip route add $P2_NET dev $IF2 src $IP2 table $T2
ip route add default via $P2 table $T2
ip rule add from $IP1 table $T1
ip rule add from $IP2 table $T2
ip route add $P0_NET dev $IF0 table $T1
ip route add $P2_NET dev $IF2 table $T1
ip route add 127.0.0.0/8 dev lo table $T1
ip route add $P0_NET dev $IF0 table $T2
ip route add $P1_NET dev $IF1 table $T2
ip route add 127.0.0.0/8 dev lo table $T2
# Rimuovo il gateway di default
route del default
# Load balance tra le connessioni
ip route add default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1
Salvate lo script settando le variabili con le impostazioni attinenti la vostra rete ed assegnate i permessi di esecuzione:
chmod +x nome_script
Eseguite lo script e le vostre richieste verso Internet saranno bilanciate verso i due gateway e quindi, specie nei software p2p avrete degli ottimi benefici.
Se si ha la necessità di raggiungere un determinato host attraverso uno specifico provider potete usare il marking dei pacchetti, quindi vanno aggiunte allo script visto sopra queste due righe:
ip rule add fwmark 1 lookup fastweb
ip rule add fwmark 2 lookup ngi
Nel mio caso, ho assegnato il mark 1 alla tabella di routing chiamata fastweb e 2 a quella chiamata ngi.
Configurato il routing è necessario markare i pacchetti tramite iptables:
# Vincoliamo le richieste verso Google ad essere instradate tramite Fastweb:
iptables -t mangle -I INPUT -i eth0 -d www.google.com -j MARK --set-mark 1
# Mentre le richieste verso IdeaFactory transiteranno per NGI:
iptables -t mangle -I INPUT -i eth0 -d www.ideafactory.it -j MARK --set-mark 2
Come potete vedere, le regole di firewall sono inserite nella tabella mangle di INPUT perché è la prima che viene presa in considerazione all’arrivo di un pacchetto e quindi precedente al routing.
Spero di aver reso la vostra connessione più veloce…spendendo due abbonamenti ad Internet!
RT @lddio: La mafia teme più la scuola della giustizia. L'istruzione toglie erba sotto i piedi della cultura mafiosa. (A. Caponnetto, 19 ... [gianlucagentile]
RT @gzaffagnini: @riotta Dio accolga coloro che lo #Stato non riesce a proteggere [gianlucagentile]
RT @donati_giacomo: Solo delle Merde possono piazzare una bomba davanti una scuola! #brindisi [gianlucagentile]
Powered by Lifestream.
| L | M | M | G | V | S | D |
|---|---|---|---|---|---|---|
| « nov | ||||||
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 | |||
31 Responses for "iproute: load balance verso 2 gateway"
Non si potrebbe andare al doppio della velocità pagando UNA e dico UNA solo connessione??
WHAAAHAHAH!!!
p.s. Ottima speigazione, ma non hai detto come “splittare” e dividere le connessioni in base al tipo di:
- protocollo
- porta
- source IP e dest IP
Sarebbe quindi carino approfondire l’argomento facendo una esempio di configurazione per ogni punto da me succitato.
CIAUZ!
Per andare al doppio della velocità pagando una sola connessione devi pregare che Telecom faccia l’upgrade di banda gratuito…Non aspettare NGI che non ti conviene ,vero? Tu ne sai qualcosa…
Per quanto riguarda gli esempi, ho spiegato come raggiungere (destination ip) specifici host passando tassativamente per un gateway scelto.
Quelli che conoscono minimamente iptables non troveranno difficoltà ad adattare quella regola agli altri esempi che chiedi, basta un -s invece del -d per il source ip oppure un bel -p per specificare il protocollo.
Prima o poi scriverò una guida ad iptables che farà invidia anche a quelli di SonicWall…ogni riferimento è puramente casuale!:)
Beh allora se dobbiamo dirla tutta ricordati di fare LA guida di IPTABLES, per fare funzionare le cose IN LAN!! eh eh…
Eh? Non ti seguo…
Solo un cosa: Complimenti !
How to, breve preciso, conciso ed eficace !
LATRTC HOWTO a confronto e una fraccata di parole e teorie inutili !!!
Grazie e ancora complimenti !
Grazie mille!:)
Complimenti bella guida semplice, precisa e molto efficace. ottimo lavoro
Grazie!:)
Complimenti per l’ottimo post su iproute e il bilanciamento delle connessioni verso due gateway.
Avrei bisogno di un chiarimento a proposito del tuo script:
Nella zona delle variabili definisci
#Network dell’interfaccia LAN
$P0_NET=
La ho settata come 192.168.0.0/24 giusto ?
Non ti riferisci all’ indirizzo del network della rete (192.168.0.0) vero ?
# Network del provider 1
P1_NET=”";
In questo caso a cosa ti riferisci ?
a 0.0.0.0 oppure all’ indirizzo IP del network della rete wan?
P0_NET e P1_NET sono le classi IP rispettivamente della rete che collega la LAN (P0_NET) e la rete che collega la linux box al provider 1 (P1_NET).
Se ad esempio la LAN è 192.168.0.0/24 P0_NET sarà 192.168.0.0/24 e se P1 è una connessione con Alice il quale router ha come IP 192.168.1.1 la rete è 192.168.1.0/24 quindi P1_NET è 192.168.1.0/24.
Spero di esserti stato d’aiuto, per qualsiasi cosa scrivi!:)
Gianluca, grazie, lo sei stato moltissimo !
mi permetto però di fare notare che credo manchi un passaggio fondamentale.
I pacchetti in uscita NON sono ancora mascherati.
Almeno questo è ciò che riporta tcpdump ascoltando una delle due interfacce wan: i pacchetti hanno tutti origine 192.168.0.xx (nel mio caso) e destinazione la vera destinazione.
Il problema è quindi che i pacchetti non tornano indietro !!
Cito da lartc: [i] It will work for all processes running on the router itself, and for the local network, if it is masqueraded. [/i]
domanda: come effettuo quindi il masquerading ? è possibile fare un esempio ?
avevo pensato ad iptables con SNAT … ma non può andare bene poicè con SNAT devo definire io l’origine e quindi si perdono i vantaggi del bilanciamento. non credi ?
grazie ancora !
Per mascherare i pacchetti in uscita dalle due interfacce WAN devi avere queste due regole di firewall:
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
Ovviamente se eth1 ed eth2 sono le interfacce verso i due gateway altrimenti cambia i valori in base alla tua rete.
Non dimenticarti di abilitare l’ip forward e di disabilitare l’rp_filter:
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
Spero adesso ti funzioni tutto!:)
Buon week-end.
Ultima info: per iptables bisogna utilizzare
–set-mark 0×2 (al posto di –set-mark 2)
–set-mark 0×1 (al posto di –set-mark 1)
E’ la stessa cosa. Se si usa un volore decimale sarà iptables a trasformarlo in modo corretto.
Rigurado al SNAT, è strano che hai quei problemi. Il MASQUERADE è un SNAT che prende in automatico l’ip dell’interfaccia mentre con l’SNAT deve essere specificato un IP d’uscita. Il problema sarà da qualche altra parte.
Ottimo articolo perfetto in ogni sua parte voglio aggiungere solo una cosa, cosi progettato va tenuto conto che tale bilanciamento consentirà di andare al doppio della connessione piu lenta che compone il bilanciamento, consiglio vi valutare quindi le simmetrie delle connessioni a disposizzione e varire adeguatamente il weight.
Ancora complimenti Gianluca.
Ciao, volevo dirti che ho seguito le tue istruzioni.
Quando stacco l’adsl da uno dei router l’ip (lo vedo con route -e) cambia bene in modo automatico, ma se provo a navigare (ho sulla macchina un proxy squid) mi da “no route to host”.
Qualcuno ha idea?
Il problema è dovuto al fatto che il sistema cerca di instradare pacchetti verso una connessione che è andata giu. Io ho risolto mettendo uno script nel crond che controllava se le connessioni erano up. Quando veniva rilevato qualcosa di anomalo il sistema usava una solo connessione DISABILITANDO il load balance.
Lo script effettuava un ping verso due host esterni.
Avevo messo dello regole di iptables che marcavano i pacchetti verso i due host in maniera diversa e quindi con iproute imponevo loro di passare per l’una e l’altra connessione.
Quando il ping non rispondeva, diabilitavo il balance e passavo solo per un host.
Spero di esserti stato d’aiuto.
[...] MARK packets, so, iproute2 can decided how to route the packets correctly. you can read how to here http://www.ideafactory.it/2008/03/27…rso-2-gateway/ bye [...]
Ciao e grazie per la guida.
E se una delle interfaccia utilizzasse dhcp ?
fastweb ha il suo hag con ip dinamico anche in lan.
Una soluzione immediata ma un pò spartana è mettere un router ethernet con interfaccia WAN verso fastweb e LAN statica verso il gateway Linux così hai la scheda di rete con IP statico e il router che prende in automatico l’IP da Fastweb.
Ciao, se entrambi i gateway sono nella stessa subnet la regole così settate con iproute funzionano lo stesso o bisogna modificare qualcosa?
GW1 192.168.1.200
GW2 192.168.1.250
all’interno della stessa subnet 255.255.255.0
Grazie in anticipo
Secondo me non basta cambiare solo i gateway visto che le tabelle di instradamento sono configurate per la stessa rete. E’ necessario fare qualche regola di marking del pacchetto partendo dal mac address della scheda di rete.
Può darsi che mi sbaglio, spero di provare tale configurazione molto presto così potro consigliarti meglio attraverso una guida specifica.
Se hai già risolto sarebbe carino inviare la tua soluzione.
credo che il punto più corretto per marcare i pacchetti sia nella tabella di mangle nella chain OUTPUT ( correggetemi se sbaglio )
iptables -t mangle -A OUTPUT -p tcp –dport 80 -j MARK –set-mark 1
iptables -t mangle -A OUTPUT -p tcp –dport 22 -j MARK –set-mark 2
a breve faccio una prova con l’attuale conf
[...] un precedente post avevo spiegato come è possibile fare load balance su una linux box collegata a due provider [...]
Ho appena fatto un post dove spiego come fare il loadbalance su gateway appartenenti alla stessa rete:
Bell’articolo, vorrei applicare gli stessi concetti dell’instradamento a un server web con 2 gw (ip pubblici) su 2 adsl distinte, ma non so di preciso come adattare le tue istruzioni al mio caso.
Grazie
Gabriele
Il server web sfrutta banda un uplink e purtroppo non si può instradare una “risposta” su di un canale dove non è transitata la “domanda”. Spero di esserti stato utile.
[...] iproute: load balance verso 2 gateway (IMPORTANTISSIMO!) [...]
Ciao, approfitto della tua competenza e disponiblità per una domanda, lo stesso discorso si può fare anche in ingresso nel senso che avendo due linee che fanno riferimento a carrier differenti (e quindi classi ip pubblici differenti) è possibile avere un failover in modo tale che, ad esempio, il server sia sempre raggiungibile dall’esterno anche in presenza di un down della linea principale ?
Grazie.
-
Salvatore.
Si è possibile.
Per una configurazione ad hoc scrivimi una mail attraverso il form dei contatti spiegandomi la tua infrastruttura di rete.
OK!
ma ho problemi con le vpn in ingresso da una o dall’altra wan.
Devo forse utilizzare il mark con la porta utilizzata?
Leave a reply