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:

Load balance

Premesso che:

  • la Linux box è gia configurata a fare il masquerading della LAN
  • le interfacce LAN, Provider 1 e Provider 2 sono gia configurate e funzionanti
  • tutto funziona correttamente verso il gateway di default

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!