Bilanciamento del carico e NAT con più connessioni ISP su Linux


15

Ho due connessioni Internet da due diversi ISP e devo bilanciare il traffico che proviene da e verso la mia rete tra i due ISP. Sto usando Debian GNU / Linux.

Il mio set-up è così:

eth0 (192.168.0.0/24) - Rete locale

eth1 (192.168.1.0/24) - ISP n. 1

eth2 (192.168.2.0/24) - ISP n. 2

La mia rete locale è connessa a questo server tramite eth0 e la casella è il server DHCP cum Gateway per tutte le macchine nella LAN.

Il server deve eseguire il bilanciamento del carico tra i due ISP e deve anche eseguire NAT-ing.

Ho seguito le istruzioni di routing su lartc.org ma ho ancora bisogno di istruzioni per eseguire correttamente il NAT.

Qualsiasi aiuto sarà apprezzato.

PS: conosco pFsense ma devo usare Linux.


2
che tipo di istruzioni ti servono? tutto è spiegato su lartc.org. Hai qualche problema in particolare?
Lorenzog,

Risposte:


19

Ho eseguito il bilanciamento del carico utilizzando entrambi i metodi lartc.org e iptables e trovo che il metodo iptables sia più facile da capire e da implementare. L'unico aspetto negativo è che è necessario disporre di una versione iptables abbastanza recente per poter utilizzare il modulo statistico

Supponiamo alcune cose:

LAN: eth0: 192.168.0.1/24

ISP1: eth1: 192.168.1.1/24, gateway: 192.168.1.2/24

ISP2: eth2: 192.168.2.1/24, gateway: 192.168.2.2/24

Quindi ecco come farei usando il metodo iptables:

Tabelle di percorso

Prima modifica il file / etc / iproute2 / rt_tables per aggiungere una mappa tra i numeri della tabella di instradamento e i nomi ISP

...
10 ISP1
20 ISP2
...

Quindi le tabelle 10 e 20 sono rispettivamente per ISP1 e ISP2. Ho bisogno di popolare queste tabelle con percorsi dalla tabella principale con questo frammento di codice (che ho preso da hxxp: //linux-ip.net/html/adv-multi-internet.html)

ip route show table main | grep -Ev '^default' \
   | while read ROUTE ; do
     ip route add table ISP1 $ROUTE
done

E aggiungi il gateway predefinito all'ISP1 tramite il gateway dell'ISP1:

ip route add default via 192.168.1.2 table ISP1

Fare lo stesso per ISP2

Quindi ora ho 2 tabelle di route, 1 per ciascun ISP.

iptables

OK ora uso iptables per distribuire uniformemente i pacchetti su ciascuna tabella di instradamento. Maggiori informazioni su come questo lavoro può essere trovato qui ( http://www.diegolima.org/wordpress/?p=36 ) e qui ( http://home.regit.org/?page_id=7 )

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

NAT

Bene, NAT è facile:

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

3
Buona risposta con i link. Non è necessario necessariamente un nuovo iptables per fare ciò poiché prima che ci fosse la corrispondenza delle statistiche c'erano le partite casuali e l' ennesima che avevano lo stesso ruolo nel server.
SiegeX,

1
Ho una domanda relativa ai marchi su iptables. Sul link pubblicato, stanno marcando solo i pacchetti che corrispondono al nuovo stato. Perché lo stai facendo diversamente?
Matías,

Posso usare un'altra rete, come ISP3, ISP4, ecc.?
Vitor Mazuco,

3

La risposta di mefat mi ha aiutato molto, ma piuttosto che una copia una tantum di tutte le regole della tabella principale nelle due tabelle ISP, un approccio migliore potrebbe essere quello di utilizzare la regola prio per aggiungere le regole predefinite dopo la tabella principale.

Configurare / etc / iproute2 / rt_tables come di consueto:

...
10 ISP1
20 ISP2
...

Nota che

ip rule show

Mostra le regole 0-> locale, 32766-> principale e 32767-> predefinito. Vedi man ipper maggiori dettagli.

Fondamentalmente il processo di routing funzionerà da regole prio basse a regole prio alte ... ma 32767 non è la regola più alta #. Quindi, se la tabella di routing principale non ha route predefinita (ma può contenere tutti i tipi di route che cambiano in modo dinamico per VPN, ecc.), Se non viene effettuata una corrispondenza, questa passa all'impostazione predefinita (normalmente vuota) e quindi cerca regole prio più elevate.

Vedi la sezione 'lancio' qui: http://linux-ip.net/html/routing-tables.html

Quindi ora l'installazione

ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2

e per assicurarsi che siano esaminati dopo il tavolo principale:

ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000

Uso

ip rule show

di nuovo per verificare che queste regole siano più alte delle principali

Quindi usa CONNMARK mangling come diceva mefat:

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

Cose da notare: pppd ha bisogno nodefaultroutealtrimenti si configura principalmente; quando un dispositivo si riavvia, le tabelle ISP1 / ISP2 vengono pulite, quindi è necessario ripristinarle utilizzando uno script.

Uso uno script in /etc/ppp/ip-{up,down}.d/dual-routing

# One of my connections is ~2x faster than the other
BALANCED=0.3
ALL_ISP1=0
ALL_ISP2=1

RULENUM=4
set_balance() {
    iptables -t mangle -R PREROUTING $RULENUM -m statistic --mode random --probability $0 -j MARK --set-mark 2
}

# if both up
set_balance $BALANCED
# if ppp1 down:
set_balance $ALL_ISP1
# if ppp0 down:
set_balance $ALL_ISP2

Questo è il bilanciamento del carico basato sulla connessione, quindi esaminerò l'utilizzo del carico per monitorare e sostituire la regola delle statistiche: iptables -t mangle -R PREROUTING <n>dallo spazio utente. Quindi, se c'è un download a lungo termine su una connessione e l'altra connessione è leggermente caricata, dovremmo preferire la connessione leggermente caricata.

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.