Équilibrage de charge et NAT-ing plusieurs connexions ISP sur Linux

15

J'ai deux connexions Internet de deux FAI différents et j'ai besoin d'équilibrer le trafic en provenance et à destination de mon réseau entre les deux FAI. J'utilise Debian GNU / Linux.

Ma configuration est comme ça -

eth0 (192.168.0.0/24) - Réseau local

eth1 (192.168.1.0/24) - FAI # 1

eth2 (192.168.2.0/24) - FAI # 2

Mon réseau local est connecté à ce serveur via eth0 et la boîte est le serveur DHCP cum Gateway pour toutes les machines du LAN.

Le serveur doit effectuer un équilibrage de charge entre les deux FAI et doit également effectuer un NAT.

J'ai suivi les instructions de routage sur lartc.org mais j'ai encore besoin d'instructions pour faire le NAT-ing correctement.

Toute aide serait appréciée.

PS - Je connais pFsense mais j'ai besoin d'utiliser Linux.

Baishampayan Ghose
la source
2
de quel type d'instructions avez-vous besoin? tout est expliqué sur lartc.org. Avez-vous un problème en particulier?
Lorenzog

Réponses:

19

J'ai fait l'équilibrage de charge en utilisant à la fois les méthodes lartc.org et iptables , et je trouve que la méthode iptables est plus facile à comprendre et à implémenter. Le seul inconvénient est que vous avez besoin d'une version iptables assez récente pour pouvoir utiliser le module statistique

Supposons quelques éléments:

LAN: eth0: 192.168.0.1/24

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

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

Voici donc comment je ferais en utilisant la méthode iptables:

Tables de routage

Modifiez d'abord les / etc / iproute2 / rt_tables pour ajouter une carte entre les numéros de table de routage et les noms des FAI

...
10 ISP1
20 ISP2
...

Les tableaux 10 et 20 concernent donc ISP1 et ISP2, respectivement. J'ai besoin de remplir ces tables avec des routes de la table principale avec cet extrait de code (que j'ai pris de 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

Et ajoutez la passerelle par défaut à ISP1 via la passerelle de ce ISP1:

ip route add default via 192.168.1.2 table ISP1

Faites de même pour ISP2

Alors maintenant, j'ai 2 tables de routage, 1 pour chaque FAI.

Iptables

OK maintenant j'utilise iptables pour distribuer uniformément les paquets à chaque table de routage. Plus d'informations sur la façon dont ce travail peut être trouvé ici ( http://www.diegolima.org/wordpress/?p=36 ) et ici ( 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

Eh bien, NAT est facile:

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
mefat
la source
3
Bonne réponse avec des liens. Vous n'avez pas nécessairement besoin d'un nouvel iptables pour le faire car avant la correspondance des statistiques , il y avait les correspondances aléatoires et nièmes qui servaient le même rôle.
SiegeX
1
J'ai une question concernant les marques sur iptables. Sur le lien affiché, ils marquent uniquement les paquets qui correspondent au nouvel état. Pourquoi le faites-vous différemment?
Matías
Puis-je utiliser un autre réseau, comme ISP3, ISP4, etc.?
Vitor Mazuco
3

La réponse de mefat m'a beaucoup aidé mais plutôt qu'une copie unique de toutes les règles de la table principale dans les deux tables ISP, une meilleure approche peut être d'utiliser la règle prio pour ajouter les règles par défaut après la table principale.

Configurez / etc / iproute2 / rt_tables comme d'habitude:

...
10 ISP1
20 ISP2
...

Notez que

ip rule show

Affiche les règles 0-> local, 32766-> principal et 32767-> par défaut. Voir man ippour plus de détails.

Fondamentalement, le processus de routage fonctionnera de règles de faible valeur à des valeurs de valeur élevée ... mais 32767 n'est pas le numéro de règle le plus élevé. Donc, si la table de routage principale n'a pas de route par défaut (mais peut contenir toutes sortes de routes à changement dynamique pour les VPN, etc.), si une correspondance n'est pas établie, elle passe à la valeur par défaut (normalement vide) et recherche ensuite des règles de priorité plus élevées.

Voir la section 'throw' ici: http://linux-ip.net/html/routing-tables.html

Alors maintenant, configurez

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

et pour s'assurer qu'ils sont regardés après la table principale:

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

Utilisation

ip rule show

à nouveau pour vérifier que ces règles sont plus élevées que les principales

Utilisez ensuite CONNMARK mangling comme mefat l'a dit:

# 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

Choses à noter: pppd a besoin nodefaultroutesinon il s'installe dans main; lorsqu'un périphérique redémarre, les tables ISP1 / ISP2 sont nettoyées et doivent donc être restaurées à l'aide d'un script.

J'utilise un script dans /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

Il s'agit d'un équilibrage de charge basé sur la connexion, je vais donc examiner l'utilisation de la charge pour surveiller et remplacer la règle de statistiques: iptables -t mangle -R PREROUTING <n>depuis l'espace utilisateur. Donc, s'il y a un téléchargement de longue durée sur une connexion et que l'autre connexion est légèrement chargée, nous devrions préférer la connexion légèrement chargée.

lbt
la source