Load-Balancing et Fail-Over Web avec Pfsense

I. Présentation

Les serveurs web se doivent aujourd'hui d'avoir une haute disponibilité et de supporter une haute charge au vue de l'importance qu'ils ont pour les entreprises. Il est souvent conseillé pour accroitre cette disponibilité de mettre en place plusieurs serveurs ayant le même rôle avec la possibilité de répartir la charge entre ceux-ci (ce que l'on appelle le Load-Balancing) mais également de prendre toute la charge sur un serveur si l'autre vient à être indisponible (ce que l'on appelle le Fail-Over).

Dans ce tutoriel, nous allons apprendre à mettre en place du Load-Balancing et du Fail-Over entre deux serveurs web avec la plate-forme libre et open-source Pfsense.

II. Architecture globale

Nous allons donc travailler sur l'architecture suivante :

LBpfsense01

Celle-ci est plutôt basique pour un soucis de clarté du tutoriel. Il faut savoir qu'au lieu de mettre des serveurs web en place, on pourrait utiliser n'importe quel autre service. Le service web est ici pris car il correspond à la majorité des contextes de mise en place. Nous allons travailler avec une Pfsense version 2.1.

Note : Les deux serveurs web seront quant à eux des serveurs Apache 2.2 sous Linux. Nous y mettrons volontairement deux pages web différentes sur l'un et l'autre pour illustrer le fonctionnement du Load-Balancing ainsi que du Fail-Over. Nous partons du principe que le réseau au niveau IP et les serveurs web sont déjà configurés.

III. Création du Pool de load Balancing

On va commencer par créer un pool, c'est à dire un groupe, dans lequel nous mettrons ensuite nos serveurs. La gestion par pool permet de travailler avec des groupes ce qui est plus simple et plus efficace lors de configurations complexes. On se rend donc dans  "Services" puis dans "Load Balancer" :

LBpfsense02

On se retrouve ensuite face à un tableau qui est le tableau de gestion des Pools. On cliquera sur le "+" à droite de ce tableau pour en créer un nouveau :

LBpfsense03
Tableau de gestion de pools de serveur dans Pfsense

On arrivera sur un formulaire sur lequel on pourra créer notre pool de serveur :

LBpfsense04
Formulaire Load-Balancer

Dans ce nouveau formulaire nous allons remplir le premier cadre dans lequel nous saisirons le nom de notre Pool, le mode (ici Load-Balance), éventuellement une description et le port sur lequel il agira. Etant donné que nous mettons deux serveurs web derrière, on mettra 80. On saisi ensuite la valeur "Retry" qui permet d'indiquer combien de fois un serveur va être vérifié avant d'être déclaré hors service. Ici "3" signifie qu'au bout de 3 réponses de suite invalides de la part d'un serveur, celui-ci sera considéré comme hors service et s'appliquera alors le Fail-over, le seul serveur restant prendra toute la charge. En seconde partie de se formulaire nous indiquerons sur quel protocole le Pfsense doit faire ses vérifications, attention le choix est limité  :

LBpfsense05
Formulaire Load-Balancer

Puis on ajoutera les différentes IP de nos serveurs web. Ici j'en ai deux, je les saisis puis cliquer sur "Add to pool". On cliquera ensuite sur "Save" puis sur "Apply Change" sur la page suivante. On pourra alors voir un récapitulatif de notre pool dans le tableau des Pools :

LBpfsense06
Tableau récapitulatif des pools de serveur

Il faut également savoir que l'on peut voir et modifier les métriques de base qui gèrent le load-balancing et le fail-over dans l'onglet "Settings" :

LBpfsense14
Dans l'onglet Settings, on voit les métriques de base appliquées au load-balancing

On voit ici donc trois métriques :

  • timeout : Permet de fixer en milliseconde le délai toléré pour la réponse à une vérification. Cela signifie qu'un service qui répond en plus de XX milliseconde sera considéré comme hors-service après un nombre défini auparavant de réponse "négative". Par défaut ce délai est de 1000ms, soit 1 seconde.
  • interval : Permet de fixer le délai entre chaque vérification d'hôte, on indique le délai en seconde et il est par défaut de 10 secondes.
  • prefork : Permet de fixer le nombre de processus utilisé par relayd, l'agent de load balancing. Par défaut, 5 processus lui sont dédiés.

IV. Le serveur virtuel

Maintenant que notre pool est créé, nous allons faire ce que l'on appelle un serveur virtuel. C'est un serveur qui va représenter notre pool sur l'interface WAN sur lequel les requêtes web client arrivons. On va se rendre dans le tableau "Virtual Server" puis cliquer sur le "+" à droite du tableau pour arriver sur ce formulaire :

LBpfsense07
Formulaire de création d'un virtual server

Ici nous allons indiquer le nom du serveur virtuel qui n'est qu'à titre indicatif, aucun rapport avec le nom DNS, une description puis l'adresse IP sur laquelle les requêtes clients arriveront. Ici , il s'agit de l'adresse IP WAN de mon serveur. On va ensuite lier notre pool web à ce serveur virtuel et indiquer le protocole de transport qui est ici TCP. Une fois de plus nous cliquerons sur "Submit" puis sur "Apply Change".

Dans notre cas, les requêtes arrivent de l'extérieur, il faut donc créer une règle qui permettra aux requêtes d'arriver et d'être acceptées. Nous allons donc dans "Firewall" puis "Rules" on cliquera sur le "+" à droite du tableau pour ajouter une règle :

LBpfsense08

La seule à modifier par rapport à ce qui est donné par défaut est le port de destination que l'on doit mettre en HTTP. On s’assurera que la règle est bien en "Pass" et on pourra ajouter des conditions supplémentaires si besoin est.

V. Test du Load-Balancing et du Fail-Over

Pfsense met en place différents outils permettant de voir l'état du Pool de serveur. On peut aller dans "Status" puis dans "Load Balancer :LBpfsense09

Ici on verra l'état des serveurs du pools ainsi que leur disponibilité actuelle et cumulée. Le pourcentage présent représente le temps global de disponibilité de chacun des serveurs par rapport au protocole de vérification indiqué.

LBpfsense10

Nous verrons plus globalement dans l'onglet "Virtual Servers" l'état actuelle du ou des serveurs virtuels :LBpfsense11

On peut également aller "Status" puis "System Logs" et aller dans l'onglet "Load Balancer" pour voir les logs concernant le Load balancing :

LBpfsense12

Enfin pour tester notre serveur virtuel et notre load-balancing, il suffit d'aller plusieurs fois sur l'IP WAN de notre serveur Pfsense (celle configurée dans notre serveur web virtuel) et voir que l'on arrive parfois sur un serveur, parfois sur un autre. Il faut bien sûr pour cela avoir mis en place une différence sur les pages web des deux serveurs pour pouvoir s'en apercevoir, ce qui n'est pas forcément le but final.

Comme test final, on pourra tout simple arrêter un serveur ou le service monitoré par Pfsense (ici le service web) et voir que cela ne cause aucune perturbation car tout le flux va sur l'autre serveur toujours opérationnel.

VI. Aller plus loin : Fail-Over des frontaux Pfsense

Dans cette architecture, nous pouvons identifier un SPOF (Single Point of Failure), c'est à dire un point unique et donc critique qui pourrait mettre à mal nos efforts pour la haute disponibilité. Il s'agit de l'unique serveur Pfsense, en effet, celui-ci étant l'unique passage pour aller vers les serveurs web qui sont eux redondés. Pour cela, je vous invite à mettre en place une redondance Pfsense en amont de vos serveurs web, ceux-ci partageront une IP coté "WAN" et permettra la mise en place d'une redondance des serveurs web mais également des serveurs Pfsense. Je vous invite à suivre ce tutoriel pour apprendre à mettre deux serveurs Pfsense en redondance .

On pourra alors avoir quelque chose qui ressemble à ce schéma au niveau fonctionnel :

LBpfsense13

 Ici on voit bien les deux couches (Pfsense & Web) qui sont chacune redondées pour prévoir la panne d'un des éléments des deux blocs de façon simultanée.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Mickael Dorigny

Fondateur d'IT-Connect.fr et d'Information-security.fr. Auditeur sécurité chez Amossys.

    mickael a publié 475 articles sur IT-Connect.See all posts by mickael

    5 réactions sur “Load-Balancing et Fail-Over Web avec Pfsense

    • 16/06/2014 à 09:15
      Permalink

      Bonjour Mickael,

      Merci pour se bon tuto c’est une preuve que pfsense peut remplacer pas mal de firewalls « privatives » même dans des grandes plate-formes…

      Moula.

      Répondre
    • 23/02/2015 à 18:06
      Permalink

      C’est intéressant mais je ne peux m’empêcher, en lisant un article comme celui-ci, compte tenu de l’exemple retenu et donc du protocole mis en jeu, de penser qu’un reverse proxy serait tout à fait adapté. L’avantage étant que la session du client s’arrête au serveur qui écoute (ici le reverse proxy) et donc pas de règle qui autorise de « passer » de l’extérieur à l’intérieur en HTTP et qu’il est possible avec ce type de composant, de faire des contrôles plus fins au niveau « applicatif ». Pour rester avec Pfsense, Squid fait ça très bien.

      L’article reste cependant très bien et didacticiel en ce qui concerne la mise en œuvre d’un pool de serveurs.

      Répondre
    • 20/06/2015 à 10:50
      Permalink

      Hello,
      Merci pour le tuto !

      Je souhaiterais maintenant NAT mon interface WAN sur l’IP LoadBalancer.
      J’ai donc configuré le NAT et NAT outbound mais rien n’a faire.. pas de http.

      Je sais pas si c’est la bonne méthode mais c’est comme ça que j’ai fait la configuration pour NAT directement sur mon serveur web et tout fonctionnait.

      Répondre
    • 11/10/2017 à 14:28
      Permalink

      Merci pour le tuto 🙂

      Cependant, le statue du pool et du serveur virtuel sont bien actifs, mais une fois que je rentres l’IP du WAN pour pour le test je n’ai pas de réponse du serveur…
      Quelqu’un a une idée ?

      Merci d’avance.

      Répondre

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *