LINUX:Loadbalancing - Router de répartition (masq)

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche

retour aux Serveurs en Loadbalancing


But

Ce router aura pour tâche de rediriger et de répartir les requêtes venant des clients en fonction des disponibilités des serveurs du cluster.

Nous allons utiliser une fonctionnalité de Linux, le LVS ou Linux Virtual Server. l'outil Ldirectord va nous y aider.


Prérequis

Routage

Nous sommes en présence de deux LANs interconnectés par un router. Pour mettre en oeuvre correctement les différents aspects du routage; voyez l'article sur le Routage statique et spécialement le chapitre sur le "Second réseau privé".


Activation du routage

Il faut activer le routage sur le router "cluster.home.dom" en ajoutant un fichier, par exemple "router.conf", dans le répertoire "/etc/sysctl.d". Ce fichier doit contenir la ligne:


net.ipv4.ip_forward = 1

On active cette configuration soit en redémarrant la machine, soit avec la commande suivante:

sysctl -p /etc/sysctl.d/router.conf


Installation

Nous allons utiliser l'outil Ldirectord qu'il faut installer:

dnf install ldirectord

Par la même occasion, il installe toute une série de modules Perl en tant que dépendances:

dnf install perl-WWW-RobotRules
dnf install perl-Try-Tiny
dnf install perl-Tie
dnf install perl-Text-Balanced
dnf install perl-Parse-RecDescent
dnf install perl-Net-IMAP-Simple
dnf install perl-Net-IMAP-Simple-SSL
dnf install perl-Socket6
dnf install perl-IO-Socket-INET6
dnf install perl-Net-SMTP-SSL
dnf install perl-MailTools
dnf install perl-Net-HTTP
dnf install perl-HTTP-Negotiate
dnf install perl-HTTP-Cookies
dnf install perl-Digest-SHA
dnf install perl-Digest-HMAC
dnf install perl-NTLM
dnf install perl-Data-Dump
dnf install perl-libwww-perl
dnf install perl-Socket-GetAddrInfo

Il installe également le paquet suivant que nous utiliserons pour visualiser l'état du système:

dnf install ipvsadm

Par contre, tout un ensemble de paquets Perl ne sont pas installés mais sont nécessaires:

dnf install perl-Sys-Hostname
dnf install perl-Sys-Syslog
dnf install perl-Net-Ping
dnf install perl-LWP-Protocol-https
dnf install perl-Mail-POP3Client
dnf install perl-Mail-POP3Client
dnf install perl-Mail-IMAPClient
dnf install perl-Net-SMTP-SSL


Configuration en Failover

Nous allons utiliser cette machine de façon autonome mais il est très facile de l'utiliser dans une structure en Failover.

Il suffit de reprendre la configuration de l'article sur les Routers inter LAN en Failover. A la configuration de Pacemaker, on ajoute une ressource activant le service "ldirectord.service".

pcs resource create ClusterLdirectord systemd:ldirectord op monitor interval=30s

ou

pcs resource create ClusterLdirectord ocf:heartbeat:ldirectord configfile=/etc/ha.d/ldirectord.cf ldirectord=/usr/sbin/ldirectord op monitor interval=30s

et ensuite:

pcs constraint colocation add ClusterLdirectord  with    ClusterIPint score=INFINITY
pcs constraint order ClusterIPint then start ClusterLdirectord


Modification des sources

Le programme Ldirectord est installé dans le fichier "/usr/sbin/ldirectord". Il teste tout un ensemble de services. Les protocoles que l'on veut tester sur nos serveurs du cluster sont: HTTP, HTTPS, SMTP, SUBMISSION, SMTPS, POP, POPS, IMAP et IMAPS. Parmi ceux-ci, seul le protocole SMTPS n'est pas repris. Soit on crée un script externe qui fera ce travail, soit on ajoute au programme cette fonctionnalité.


Nous avons choisi la seconde solution.

La version actuelle pour Fedora 37 est "4.11.0-2". Il faut garder à l'esprit qu'une mise à jour entrainera un écrasement de nos modifications; il faut garder de côté notre nouvelle version et tenir à l'oeil toute mise à jour de ce paquet Ldirectord.

La pièce principale consiste à ajouter une fonction: "check_smtps" et ensuite il faut ajouter le nécessaire pour y faire référence et initialiser quelques mots clés et n° de protocole.


Voici le fichier qui sert à patcher:


--- ldirectord  2023-02-21 19:10:20.226935744 +0100
+++ ldirectord.new.fc37 2023-02-21 19:10:20.251934144 +0100
@@ -459,7 +459,7 @@
 On means no checking will take place and real servers will always be
 activated. Default is I<negotiate>.
 
-B<service = >B<dns> | B<ftp> | B<http> | B<https> | B<http_proxy> | B<imap> | B<imaps> | B<ldap> | B<ldaps> | B<mysql> | B<nntp> | B<none> | B<oracle> | B<pgsql> | B<pop> | B<pops> | B<radius> | B<simpletcp> | B<sip> | B<smtp> | B<submission>
+B<service = >B<dns> | B<ftp> | B<http> | B<https> | B<http_proxy> | B<imap> | B<imaps> | B<ldap> | B<ldaps> | B<mysql> | B<nntp> | B<none> | B<oracle> | B<pgsql> | B<pop> | B<pops> | B<radius> | B<simpletcp> | B<sip> | B<smtp> | B<submission> | B<smtps> | B<submissions>
 
 The type of service to monitor when using checktype=negotiate. None denotes
 a service that will not be monitored.
@@ -493,6 +493,8 @@
 
 =item * Virtual server port is 587: submission
 
+=item * Virtual server port is 465: smtps, submissions
+
 =item * Virtual server port is 636 ldaps
 
 =item * Virtual server port is 993: imaps
@@ -1560,6 +1562,8 @@
                                                          $1 eq "sip"   ||
                                                          $1 eq "smtp"  ||
                                                          $1 eq "submission"    ||
+                                                         $1 eq "smtps" ||
+                                                         $1 eq "submissions"   ||
                                                          $1 eq "simpletcp")
                                            or &config_error($line,
                                                             "service must " .
@@ -1575,6 +1579,7 @@
                                                             "pgsql, "       .
                                                             "simpletcp, "   .
                                                             "sip, smtp "    .
+                                                            "submissions, smtps "    .
                                                             "or submission");
                                        $vsrv{service} = $1;
                                        if($vsrv{service} eq "ftp" and
@@ -1870,6 +1875,7 @@
        if ($port eq 143)       { return "imap"; }
        if ($port eq 389)       { return "ldap"; }
        if ($port eq 443)       { return "https"; }
+       if ($port eq 465)       { return "smtps"; }
        if ($port eq 587)       { return "submission"; }
        if ($port eq 636)       { return "ldaps"; }
        if ($port eq 995)       { return "pops"; }
@@ -1895,6 +1901,7 @@
 
        if ($service eq "ftp")          { return 21; }
        if ($service eq "smtp")         { return 25; }
+       if ($service eq "smtps")        { return 465; }
        if ($service eq "dns")          { return 53; }
        if ($service eq "http")         { return 80; }
        if ($service eq "pop")           { return 110; }
@@ -1903,6 +1910,7 @@
        if ($service eq "ldap")         { return 389; }
        if ($service eq "https")        { return 443; }
        if ($service eq "submission")   { return 587; }
+       if ($service eq "submissions")  { return 587; }
        if ($service eq "ldaps")        { return 636; }
        if ($service eq "imaps")        { return 993; }
        if ($service eq "pops")         { return 995; }
@@ -2880,6 +2888,8 @@
                        $$r{num_connects} = 0 if (check_imaps($v, $r) == $SERVICE_UP);
                } elsif ($$v{service} eq "smtp" or $$v{service} eq "submission") {
                        $$r{num_connects} = 0 if (check_smtp($v, $r) == $SERVICE_UP);
+               } elsif ($$v{service} eq "smtps" or $$v{service} eq "submissions") {
+                       $$r{num_connects} = 0 if (check_smtps($v, $r) == $SERVICE_UP);
                } elsif ($$v{service} eq "ftp") {
                        $$r{num_connects} = 0 if (check_ftp($v, $r) == $SERVICE_UP);
                } elsif ($$v{service} eq "ldap") {
@@ -5463,3 +5473,26 @@
 
        return $str;
 }
+
+sub check_smtps
+{
+       require Net::SMTP;
+       require Net::SMTP::SSL;
+
+       my ($v, $r) = @_;
+       my $port = ld_checkport($v, $r);
+
+       &ld_debug(2, "Checking $$v{service}: server=$$r{server} port=$port");
+
+       my $smtp = new Net::SMTP::SSL($$r{server}, Port => $port,
+                       Timeout => $$v{negotiatetimeout});
+
+       if ($smtp) {
+               $smtp->quit;
+               service_set($v, $r, "up", {do_log => 1});
+               return $SERVICE_UP;
+       } else {
+               service_set($v, $r, "down", {do_log => 1});
+               return $SERVICE_DOWN;
+       }
+}











retour aux Serveurs en Loadbalancing