IPTABLES - Load Balancing

Fermé
Wes - 22 juin 2008 à 00:15
tempus1894 Messages postés 62 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 5 mars 2010 - 20 juin 2009 à 10:46
Bonjour,

Je suis en train de mettre au point une solution de load balancing pour le boulot.
Une solution qui permettra de répartir les connexions sortantes entre deux lignes ADSL

Pour ca, je me sert de iptables, qui va marquer les paquets concernant les nouvelles connexions d'un 1 ou d'un 2
Ensuite, avec une regle dans iproute2, les paquets marqués 1 passeront par la ligne ADSL1, et les 2 par la ligne ADSL2

Comme je suis en phase "experimentale", je simule mes deux lignes ADSL a l'aide de deux machines virtuelles NAT, situés dans un réseau virtuel 172.16.0.0/16
Meme chose pour la machine de test, dans un réseau virtuel 10.10.10.0/24

Un petit schema du réseau ne ferait pas de tort :

http://www.black-templars.net/loadbalancing.JPG

R1 - IPTABLES : la machine qui va faire le load balancing :D
NAT : les deux machines qui "émulent" mes deux lignes ADSL ...
Le reste ca devrait aller :p

Alors, la liste de commandes effectuées (les machines sont des slackware) :

Sur la machine R1 IPTABLES

Ajout de tables ADSL1 et ADSL2 dans /etc/iproute2/rt_tables

ip route add default via 172.16.1.2 table ADSL1
ip route add default via 172.16.1.3 table ADSL2

ip rule add fwmark 1 table ADSL1
ip rule add fwmark 2 table ADSL2


=> désormais le routeur utiliseras la table ADSL1 (passerelle 172.16.1.2) pour router les paquets marqués 1, et la table ADSL2 (passerelle 172.16.1.3) pour les paquets marqués 2

iptables -t mangle -A PREROUTING -m state --state new -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m state --state new -m statistic --mode random --probability 0.5 -j MARK --set-mark 2


=> les paquets arrivant sur la machine pour etre routés, et dont l'etat est NEW ( nouvelle connexion ) seront marqués 1, et 50% de chances qu'ils soient marqués 2


Sur les machines NAT :
on configure le nat, simplement :
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 172.16.1.2
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


et on ajoute une route statique pour 10.10.10.0/24, et une passerelle par défaut
ip route add 10.10.10.0/24 via 172.16.1.1
ip route add default via 192.168.1.1



Voila, en théorie ca devrait marcher du tonnerre, mais c'est pas le cas ...
En jettant un coup d'oeil avec wireshark, qui analyse tout ce qui ressort de ma machine physisque ( et donc situé sur Real LAN, juste avant le routeur adsl réel ) :

En tapant une adresse dans le browser de la machine 10.10.10.5 :
- Les requetes DNS passent bien dans les deux sens( parce que c'est de l'UDP ? )
- Le paquet TCP SYN sur le port 80 du site web que je cherche a atteindre passe aussi
- Le paquet TCP SYN ACK arrive sur ma machine physique, mais il n'ira pas plus loin, car le site web m'en renvoi plusieurs avec le meme numéro...

image ici : http://www.black-templars.net/winpcap.JPG

Les pings passent bien aussi !

Ce que j'en conclus : [u]pas moyen d'etablir de connexion TCP, car les ACK n'arrivent pas a remonter a la machine demandeuse..

Avez vous une idée ? :D

5 réponses

Bonjour,

En faite c'est plus complexe que ca.

Tu as une repartition de charge qui ce fait sur les 2 lignes quand aucune regle n'est définit
pour tel ou tel protocol et en plus tu peux dire par exemple que le SMTP doit systematiquement
par la ligne 1 et le FTP par la ligne 2. Pour les requètes DNS elles sont
envoyé par tel ou tel provider suivant le serveur demandé.

Et au niveau des regles tu peux faire un peu ce que tu veux en fonction de la source de la
destination et des protocoles

Pour les connexion au site web qui prennent en consideration l'adresse IP cela ne pose de pas
de probleme avec shorewall tout dépend des options que tu mets lors de
la déclaration des tes différents FAI, l'option qui concerne ce pb est "track".
En faite toute connexion inititiée avec un serveur distant continu de passer par la
même ligne ADSL.

Tiens moi au courant
1
Salut,

Je te conseil d'utiliser shorewall, il est basé sur IPTables, (Version 3.2 mini) pour ton installation, il prend en charge l'acces internet avec multi ISP. Personellement je l'ai mis en production pour l'un de mes clients avec répartition de la charge sur les 2 lignes et router certain protocol par une ligne plutot que l'autre.

Ca fonctionne a merveille !!!!!

Une petite chose quand même mais qui n'est pas réellement un probleme, c'est que lorsuque la ligne internet principale tombe il n'y a plus d'acces internet ( car route par default ), pour ce la il faut faire un petit script rien de bien mechant.

A+
0
Bonjour
tu as réussi à répartir la charge en séparant les flux selon leur protocole. mais si on voulait faire du load balancing sans considérer le type du flux.?
personnellement, j'ai testé le load balancing avec OpenBSD (packet filter) ... le flux et bien réparti entre les deux connexions..... mais un problème survient.....:
y a des site WEB qui prennent on considération l'adresse IP de la source (pour maintenir les sessions ou bien pour des raisons de sécurité )....ces site posent problème car ils interrompent la connexion ... et on n'accede aux page web qu'après plusieurs rafraichissement...
exemple:
sur ce lien: http://www.openbsd.org/ftp.html#ftp
vous avez (à 80% de chance) ce message "your data coming from different source"


un feedback de votre part serait le bienvenu
merci
0
tempus1894 Messages postés 62 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 5 mars 2010 3
10 juin 2009 à 16:25
Bonjour wawan56

Je dois mettre en place de la repartition de charge entre 2 ou 3 serveurs pour des acces web et BDD sur ubuntu server.
Je cherche une bonne solution a implémenter et g vu ton post, je vais m'orienter sur la repartition avec iptables... et shorewall...?
aurais tu des liens vers des tutos ou de la doc a me proposer?
Ce serait super sympa!
Merci bcp!
0
Salut,

Vu ce que tu veux faire, ce n'est pas la solution a adopter penche toi plus tot vers keepalived. C'est relativement simple a mettre en place. shorewall et iptable sont destinés pour faire du filtrage et du routage, de la repartition de charge sur sortie WAN mais pas de la repartition de la charge comme tu souhaite le faire.

Dsl du retard de la reponse.

Bon courage pour la config de keepalived, mais normallement ça devrait etre tranquil.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tempus1894 Messages postés 62 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 5 mars 2010 3
20 juin 2009 à 10:46
Salut,

Merci pour ta réponse meme si c tard ^^
C bien noté, mais du coup y a eu un ptit peu de changement et je vais simplement faire du Round-Robin par DNS. C plus simple, et au final ca sera bien suffisant.
Jme documenterais qd meme sur le keepalived pour une prochaine fois. Merci
BYe
0