# [RESEAU] Partage de charge sur 2 FAI (résolu)

## Tony Clifton

Bonsoir,

je dois mettre en place au boulot un routeur soekris qui se chargera de partager deux connexions internet : une connexion orange (en ip dynamique) et une connexion free (en ip fixe).

Après quelques recherches, je suis tombé sur plusieurs tutoriels traitant de virtual server et quelques configurations à base de shorewall ou iptables. Mais je n'ai pas vraiment trouvé de tutoriel (en français notament) ayant la même problématique que moi. J'ai donc légèrement l'impression de faire fausse route avec ces deux solutions. Car virtual server me semble (comme son nom l'indique) plus adapté à partager la charge entre plusieurs serveurs, et iptables ne me semble pas (avec le peu de connaissances que j'ai sur cet outil) pouvoir gérer une telle tâche.

Avez-vous déjà mis en place de telle solution ? Dois-je essayer de persister dans une de ces deux voies ou fais-je fausse route ?

Merci.

----------

## guilc

Non, ipvs n'est pas pour toi.

Le terme que tu recherche est le bonding.

un exemple rapide : http://linux.developpez.com/bonding/

----------

## Tony Clifton

Merci pour ta réponse. J'étais effectivement aussi tombé sur des tuto qui parlaient (en anglais) du bonding mais j'avais juste compris que ça permettait de relier deux cartes réseaux d'un même serveur à un même switch. Donc merci pour le liens (en français en plus  :Wink:  ).

----------

## El_Goretto

Si le bonding peut faire ce qu'il demande en partie... il ne sera pas efficace du tout.

Je m'explique: si un lien internet tombe, concrètement il se passe quoi sur la machine routeur linux en bonding? Rien. Car le lien entre lui et la box du FAI est toujours up, donc il va quand même lui envoyer des paquets qui finiront à la poubelle.

Pour de la redondance de lien internet, on ne peut pas se passer d'une solution plus "lourde".

-

edit:

Sans aller jusqu'à un cluster, sur cette page il y a un script pour 2 FAI (veinard  :Smile: ) qui permet de jouer simplement sur la table de routage. A tester. Logiquement, je vais me pencher sur le sujet d'ici quelques temps, et peut être adapter ce script pour supporter + de FAI.

Un dernier lien sur la théorie (lartc.org).

----------

## Tony Clifton

C'est une problématique à laquelle j'avais (mal) pensé. Pour la connexion orange, j'utilise un modem DM111P de Netgear : mon interface eth (configurée en client DHCP) a donc mon adresse IP publique lorsque la connexion est active et une adresse de classe C lorsque que la connexion est interrompue. Par contre je ne sais pas comment il configure ma route par défaut lorsque la connexion est inactive.

Cependant je peux configurer mon modem (même si je préférais l'éviter) pour activer ppp sur mon routeur et ainsi n'avoir d'interface ppp0 que lorsque la connexion est active. Par contre je n'ai fait aucun tests sur la freebox (en mode modem), peut-être devrais-je la remplacer par le même modem (DM111P) pour pallier ce problème.

----------

## ultrabug

Salut, et si je peux me permettre d'apporter ma maigre contribution à ton problème, voici un article que j'ai écrit sur le sujet :

http://www.ultrabug.fr/wiki/index.php5?title=Routeur_haute_disponibilit%C3%A9_g%C3%A9rant_plusieurs_liens_internet

Hésites pas si tu as des questions, je me permet d'attirer ton attention sur la problématique de l'uRPF qui j'espère ne te touchera pas (mais au moins sois-en informé ça t'évitera des prises de tête) !

Bon courage  :Smile: 

----------

## Tony Clifton

Merci ultrabug pour ton article et pour ton soutien  :Wink: . J'ai déjà une première question bien que je n'ai toujours pas commencé la mise en place du routeur. Mes deux interfaces reliées à internet sont configurées en DHCP : pour la Freebox pas trop dramatique (je peux éventuellement la passer en statique) mais pour la connexion Orange je ne peux pas me passer du DHCP car j'ai une adresse IP dynamique. La solution à laquelle j'ai donc pensée est de spécifier au client DHCP de ne pas configurer de route par défaut (je pense que c'est réalisable). Puis ensuite de configurer ma route par défaut en utilisant les interfaces plutôt que les passerelles. Ce qui donnerait quelque chose comme :

```
ip route add default equalize \

                        nexthop dev eth2 weight 1 \

                        nexthop dev eth3 weight 1
```

Je crois me rappeler l'avoir déjà fait mais c'était pour un tunnel et il ny avait qu'une seule route.

----------

## Tony Clifton

J'ai mis le routeur en place aujourd'hui et le partage de charge fonctionne très bien, voire même trop bien : il fait vraiment n'importe quoi. Par exemple, lorsque je me connecte depuis l'extérieur en SSH sur l'adresse IP de free, il essaye de me répondre par la connection Orange forcement ça passe pas trop. De même lorsque j'essaye en interne de me connecter à un serveur SSH externe ; il se connecte bien au serveur, me demande mon mot de passe que je saisie puis il décide d'envoyer le mot de passe par l'autre connexion, là encore ça bloque.

Avez-vous des idées d'où cela pourrait provenir ?

----------

## ultrabug

Salut, j'aurais dû mettre ce topic en watchlist...

Pour ta première question, je n'ai jamais essayé de ne pas spécifier la passerelle donc dis nous si ça a marché stp, c'est toujours bon à savoir.

Pour la répartition des paquets entre tes deux cartes au contraire, il fait exactement ce qu'il doit faire ! Je t'invite à lire avec attention cette partie de mon article, où j'explique précisément cela :

http://www.ultrabug.fr/wiki/index.php5?title=Routeur_haute_disponibilit%C3%A9_g%C3%A9rant_plusieurs_liens_internet#Consid.C3.A9rations_techniques_importantes

Bon courage

----------

## Tony Clifton

Merci pour ta réponse.

Pour ma première question, la réponse est que ça peut marcher : sur la freebox, ça ne marche pas mais en revanche sur le modem Netgear ça fonctionne bien (mais je n'ai pas cherché à comprendre pourquoi ça marche dans un cas et pas dans l'autre). Cependant j'ai quand même passé le modem en mode routeur afin de faire toute la configuration de mes interfaces en statique.

Ensuite pour le deuxième problème voici quelques explications de ce que j'ai fait :

* J'ai créer deux tables de routage (une table orange et une table free) dans lesquelles j'ai spécifié les routes de chaque interface réseau puis les routes par défaut (via la passerelle orange pour la table orange et via la passerelle free pour la table free).

* Dans ma table principale (main) j'uilise la connexion orange comme route par défaut (pour l'instant)

* Puis j'ai mis des reglès de routage pour utiliser la table orange quand l'ip source est l'ip orange et idem pour la table free lorsque l'ip source est celle de free

=> Ca fonctionne très bien : lorsque que je me connecte au serveur SSH (de ma passerelle) depuis l'extérieur en utilisant l'@ ip free, il utilise bien la table free (et donc la connexion free) au lieu de prendre la route par défaut de la table main (qui est pour l'instant orange).

Mais le problème est le suivant : quand on se connecte de l'extérieur au serveur SSH on doit atterrir sur un autre serveur (pas la passerelle). J'ai donc ajouté une règle iptables :

```
$IPTABLES -A PREROUTING -i $FREE_DEV -p tcp -m tcp --dport 22 -j DNAT --to-destination $SSH_IP -t nat
```

Et là ça ne fonctionne pas ma passerelle reçoit bien la demande de connexion SSH mais ne la transmet pas au serveur SSH.

EDIT : je viens de refaire des tests et maintenant il essaye d'envoyer la réponse via la connexion orange avec l'ip source de free

----------

## ultrabug

 *Tony Clifton wrote:*   

> EDIT : je viens de refaire des tests et maintenant il essaye d'envoyer la réponse via la connexion orange avec l'ip source de free

 

Juste pour être sûr, tu utilises bien le connection tracking ? Je pense que le fichier /proc/net/ip_conntrack peut aider à comprendre ce qu'il se passe, tu vois quoi là dedans lors de tes tentatives ?

edits: typo, fatigue...

----------

## Tony Clifton

Voici les tests que j'ai effectués :

* En mettant /proc/sys/net/ipv4/conf/*/rp_filter à 1 :

Je me connecte de l'extérieur (avec l'ip 81.81.81.81) en SSH, la passerelle reçoit bien la demande mais il ne la retransmet pas au serveur SSH. Le fichier /proc/net/ip_conntrack ne contient aucune occurrence de l'adresse ip 81.81.81.81.

* En mettant /proc/sys/net/ipv4/conf/*/rp_filter à 0 :

Je me connecte toujours depuis l'ip 81.81.81.81 en SSH, la passerelle transmet bien les paquets au serveur SSH mais lorsque la passerelle transmet la réponse elle utilise la mauvaise route. Le fichier /proc/net/ip_conntrack laisse bien paraître des traces de la connexion :

```
tcp      6 55 SYN_RECV src=81.81.81.81 dst=87.163.160.30 sport=54153 dport=22 packets=1 bytes=60 src=192.168.1.100 dst=81.81.81.81 sport=22 dport=54153 packets=7 bytes=420 mark=0 use=2
```

ip correspondantes :

81.81.81.81 adresse de l'émetteur de la demande de connexion en SSH

87.163.160.30 adresse IP de Free

192.168.1.100 adresse du serveur SSH en interne

Dans ce deuxième cas je comprends bien le problème : la passerelle reçoit bien la demande de connexion qu'elle retransmet au serveur SSH. Mais lorsque le serveur SSH émet sa réponse, la passerelle la retransmet en utilisant la route par défaut (qui est par la connexion orange) puis fait son postrouting en lui collant l'ip de free en ip source.

La seule solution que je vois serait de faire le NAT en prerouting, ce qui permettrait de faire une règle ip en fonction de l'ip source pour qu'il utilise la bonne table de routage. Mais ce n'est pas possible avec iptables :-'(.

EDIT : même pas, le NAT en prerouting poserait bien d'autres problèmes, donc je ne vois vraiment pas LA solution.

----------

## El_Goretto

Il y a 2 façon pour dire à iptables de sourceNATer un paquet qui sort: masquerading (the way of the ip pas fixe ninja) ou source routing en sur une adresse WAN (celle de free a priori, the way of ip fixe samouraï)?

----------

## Tony Clifton

Oui effectivement, j'ai essayé les deux méthodes sans succès.

----------

## ultrabug

Bonsoir,

Déjà avant de tenter de répondre à ta question, il me semble (de mon point de vue extérieur bien sûr) que tu t'éloignes de ton but initial non ? D'un simple balancing sur deux routes, tu te retrouves a jouer avec des tables de routages distinctes pour scinder tes connexions alors qu'il me semblait que tu voulais au contraire les balancer.

Ceci étant dit, le fait que tu sois obligé de désactiver rp_filter pour que la connexion arrive bien vers le serveur NATé prouve que ton routeur sait a l'avance que la réponse ne reviendra pas par la bonne liaison. Sans avoir tes règles exactes en main ça va devenir un peu complexe a élucider mais je me suis demandé ce qu'il adviendrait si tu faisais ceci :

```
echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind
```

Cela permet a une interface d'envoyer un paquet avec une IP source qu'elle n'a pas, et pourrait donc permettre a ton interface orange de répondre avec l'IP free.

----------

## Tony Clifton

 *ultrabug wrote:*   

> Déjà avant de tenter de répondre à ta question, il me semble (de mon point de vue extérieur bien sûr) que tu t'éloignes de ton but initial non ? D'un simple balancing sur deux routes, tu te retrouves a jouer avec des tables de routages distinctes pour scinder tes connexions alors qu'il me semblait que tu voulais au contraire les balancer.

 

Je cherche effectivement toujours à partager la charge entre mes deux connexions internet. Mais les problèmes que je rencontre lorsque je l'active de manière simple sont que je ne peux plus faire de connexions SSH vers l'extérieur et que les services (interne) accessibles depuis l'extérieur sont très aléatoirement disponibles. Mais à part ces points là ça fonctionne très bien.

=> La solution à laquelle j'ai pensé et que j'essaye donc de mettre en oeuvre est de toujours utiliser le même FAI pour une connexion active et c'est là que je bloque sérieusement.

 *ultrabug wrote:*   

> Ceci étant dit, le fait que tu sois obligé de désactiver rp_filter pour que la connexion arrive bien vers le serveur NATé prouve que ton routeur sait a l'avance que la réponse ne reviendra pas par la bonne liaison. Sans avoir tes règles exactes en main ça va devenir un peu complexe a élucider

 

Voici mes règles iptables :

```
$IPTABLES -A POSTROUTING -o $FREE_DEV -j SNAT --to-source $FREE_IP -t nat

$IPTABLES -A INPUT -i $FREE_DEV -p tcp -m tcp --dport 22 -j ACCEPT

$IPTABLES -A PREROUTING -i $FREE_DEV -p tcp -m tcp --dport 22 -j DNAT --to-destination $SSH_IP -t nat
```

Pour la connexion Orange, le NAT est géré au niveau du modem.

 *ultrabug wrote:*   

> mais je me suis demandé ce qu'il adviendrait si tu faisais ceci :
> 
> ```
> echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind
> ```
> ...

 

Je viens de faire le test et j'ai le même résultat, le paquet n'est jamais reçu par le destinataire.

----------

## El_Goretto

Hop là!

Tombé sur une doc sysrescuecd (en fait yen a plein qui n'ont pas un rapport direct), qui parle de load balancing e lien WAN...

Du genre comment il faut marquer avec connmark les paquets entrant par un lien pour faire le masquerading correct quand ils ressortent.

Bref, ici: http://www.sysresccd.org/Sysresccd-networking_en_Iptables-and-netfilter-load-balancing-using-connmark

----------

## Tony Clifton

EXCELLENT, merci, ça m'a l'air fort intéressant. J'vais lire ça dès que j'aurais l'temps  :Wink: 

Quelle CD magique ce SystemRescueCD...

----------

## Tony Clifton

Voila, j'ai fini de mettre ça en place aujourd'hui et ça marche nickel   :Very Happy:  !

J'ai rajouté quelques petites règles et ça m'a permis de faire exactement ce que je voulais.

----------

## sympaval

Un nouveau thread a été ouvert avec mon post et est plutôt suivi ici:

https://forums.gentoo.org/viewtopic-p-6308846.html#6308846

MerciLast edited by sympaval on Tue Jun 08, 2010 9:05 am; edited 2 times in total

----------

## Tony Clifton

Effectivement, tu peux réaliser sans problème ton partage de charge. Le fonctionnement est assez simple : tu fais ton partage de charge avec iproute2 et ensuite iptables se charge de ne pas mélanger tout ça, à grand coup de marquage de paquet. Tu peux donc marquer tes paquets en PREROUTING, POSTROUTING, INPUT...  afin de contrôler ton réseau comme tu le désir.

Par contre je comprends pas trop pourquoi tu veux ajouter un nouveau routeur, il suffit simplement de connecter ton nouveau lien internet à ton routeur existant et de lui apprendre a gérer tout ça.

----------

## sd44

je suis aussi interressé par ce systeme, est ce que tu pourrais nous donner la conf que tu as mis en place ?

merci d'avance.

----------

## Tony Clifton

Salut sd44,

si tu as des questions précises, je peux essayer d'y répondre.

Pour le fonctionnement, c'est assez simple :

* le partage de charge s'effectue grâce à iproute2 :

```
ip route add default scope global nexthop via $IP1  dev eth1 weight 1 nexthop via $IP2  dev eth2 weight 1
```

* ensuite les paquets sont marqués à la sortie avec iptables ;

* puis pour finir lorsque ces paquets reviennent, on récupère le marquage qu'ils avaient.

Et voila on ne s'emèle pas les pinceaux et tout est routé par le bon tuyau.

----------

## sd44

merci pour ta reponse,

as tu aussi les commandes iptable ?

merci d'avance.

----------

## Tony Clifton

voici quelques commandes

```

############### CREATION DES CHAINES DE MARQUAGE DES PAQUETS ###############

# Connexion Orange

$IPTABLES -t mangle -N CONNMARK_ORANGE

$IPTABLES -t mangle -A CONNMARK_ORANGE -j MARK --set-mark $ORANGE_MARK

$IPTABLES -t mangle -A CONNMARK_ORANGE -j CONNMARK --save-mark

#$IPTABLES -t mangle -A CONNMARK_ORANGE -j LOG --log-prefix "iptables-mark$ORANGE_MARK: " --log-level info

# Connexion Free

$IPTABLES -t mangle -N CONNMARK_FREE

$IPTABLES -t mangle -A CONNMARK_FREE -j MARK --set-mark $FREE_MARK

$IPTABLES -t mangle -A CONNMARK_FREE -j CONNMARK --save-mark

#$IPTABLES -t mangle -A CONNMARK_FREE -j LOG --log-prefix "iptables-mark$FREE_MARK: " --log-level info

# Récupération du marqueur

$IPTABLES -t mangle -N RESTOREMARK

$IPTABLES -t mangle -A RESTOREMARK -j CONNMARK --restore-mark

#$IPTABLES -t mangle -A RESTOREMARK -j LOG --log-prefix 'restore-mark: ' --log-level info

############### CREATION DES CHAINES POUR LE NAT ###############

# NAT de la connexion Orange

$IPTABLES -t nat -N SNAT_ORANGE

#$IPTABLES -t nat -A SNAT_ORANGE -j LOG --log-prefix "snat-to-$ORANGE_IP: " --log-level info

$IPTABLES -t nat -A SNAT_ORANGE -j SNAT --to-source $ORANGE_IP

# NAT de la connexion Free

$IPTABLES -t nat -N SNAT_FREE

#$IPTABLES -t nat -A SNAT_FREE -j LOG --log-prefix "snat-to-$FREE_IP: " --log-level info

$IPTABLES -t nat -A SNAT_FREE -j SNAT --to-source $FREE_IP

############### APPLICATION DES MARQUAGES  ###############

# Récupération du marquage pour les connexions qui ont déjà été etablies

$IPTABLES -t mangle -A PREROUTING -p tcp -m state --state ESTABLISHED,RELATED -j RESTOREMARK

# Partage des connexions Internet

$IPTABLES -t nat -A POSTROUTING -o $ORANGE_DEV -j SNAT_ORANGE

$IPTABLES -t nat -A POSTROUTING -o $FREE_DEV -j SNAT_FREE

```

Après tu n'as plus qu'à ajouter tes règles spécifiques

----------

## dapsaille

Salut à tous.

 désolé de déterrer ce topic mais je voudrais avoir juste confirmation avant de foutre en l'air tout mon bastringue pseudo-fonctionnel.

 Est-ce que cette solution me permettrais de pouvoir avoir un routeur sous gentoo avec 3 interfaces eth dont une lan et 2 wan de type adsl chez free (mode bridge sur les box du coup) et de pouvoir aggréger mes 2 lignes ? je ne recherche aucunement le failover mais bel et bien l'augmentation de débit.

 exemple, je veux dl le dernier livecd gentoo histoire de me marrer et au lieu de dl à 120ko/sec sur une ligne comme actuellement je serais pas loin du double ?

EDIT 

```

The purpose of this article is to show how we can balance the connections on Jupiter to use the [b]whole available bandwidth provided by the two adsl links[/b]. All the connections are initiated by the desktops connected to the local network, and all connections are made to Neptune. Of course, it would work on any remote server, but we just need one machine to act as the remote server for the tests. 

```

 j'ai rien compris ou c'est le cas ? ^^

----------

## El_Goretto

Je ne suis pas sûr que ce que tu cherches à faire soit possible: tu n'aurais pas une vitesse de DL sur un unique fichier (1 seule "connexion" au sens couche 4) qui ira  2 fois plus vite... par contre, avoir 2 DL en parallèle chacun au maximum d'une ligne, ça oui. Ou alors il faut passer par des systèmes de DL genre P2P (multi-connexions).

----------

## dapsaille

Edit = création d'un nouveau sujet.

----------

