|
|
(17 versions intermédiaires par le même utilisateur non affichées) |
Ligne 1 : |
Ligne 1 : |
| ---- | | ---- |
| ''→ [[LINUX:Pacemaker - Serveurs en Loadbalancing|retour aux Serveurs en Loadbalancing]]'' | | ''→ [[LINUX:Pacemaker - Serveurs en Loadbalancing (masq)|retour aux Serveurs en Loadbalancing (masq)]]'' |
| ---- | | ---- |
| =But= | | =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. | | 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. | | Nous allons utiliser une fonctionnalité de Linux, le LVS ou Linux Virtual Server. L'outil Ldirectord va nous y aider. Nous avons vu sont installation dans l'article sur [[LINUX:Ldirectord|Ldirectord]]. |
| | |
| | |
| | Cet outil vérifie la disponibilité des services des serveurs du cluster. Ensuite toute requête lui venant de la part de clients sera redirigée vers un des deux serveurs du cluster en fonction des disponibilités. |
|
| |
|
|
| |
|
Ligne 22 : |
Ligne 25 : |
| On active cette configuration soit en redémarrant la machine, soit avec la commande suivante: | | On active cette configuration soit en redémarrant la machine, soit avec la commande suivante: |
| sysctl -p /etc/sysctl.d/router.conf | | 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-IMAPClient
| |
| dnf install perl-Net-SMTP-SSL
| |
|
| |
|
|
| |
|
Ligne 72 : |
Ligne 38 : |
| pcs constraint order ClusterIPint then start ClusterLdirectord | | pcs constraint order ClusterIPint then start ClusterLdirectord |
|
| |
|
|
| |
| =Modification de la source=
| |
| 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.
| |
|
| |
|
| |
| Le fichier suivant contient un patch à appliquer sur le fichier "ldirectord":
| |
| [[Media:LINUX:Ldirectord.patch.zip|Télécharger le fichier ZIP]]
| |
| On doit décompresser ce fichier téléchargé:
| |
| unzip Ldirectord.patch.zip
| |
| Il faut avoir installé l'utilitaire "patch":
| |
| dnf install patch
| |
| Pour appliquer ce patch, copiez le fichier "/usr/sbin/ldirectord" dans le même répertoire que le fichier "ldirectord.patch" que vous venez de décompresser puis exécutez la commande:
| |
| patch < ldirectord.patch
| |
| Le fichier local "ldirectord" sera mis à jour; il suffit de le recopier dans le répertoire "/usr/sbin".
| |
|
| |
|
| |
| Le fichier suivant contient le fichier "ldirectord" modifié:
| |
| [[Media:LINUX:Ldirectord.zip|Télécharger le fichier ZIP]]
| |
| On doit décompresser ce fichier téléchargé:
| |
| unzip Ldirectord.zip
| |
| Le fichier résultant est à placer dans le répertoire "/usr/sbin".
| |
|
| |
|
| |
| Voici une liste des modification:
| |
| *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.
| |
| ----
| |
| 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;
| |
| }
| |
| }
| |
| ----
| |
| * Ajouter les mots en gras en fin de la ligne 462:
| |
| ----
| |
| 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>'''
| |
| ----
| |
| * Ajouter ces lignes en ligne 495:
| |
| ----
| |
| =item * Virtual server port is 465: smtps, submissions
| |
|
| |
| ----
| |
| * Ajouter ces lignes en ligne 1563:
| |
| ----
| |
| $1 eq "smtps" ||
| |
| $1 eq "submissions" ||
| |
| ----
| |
| * Ajouter cette ligne en ligne 1578:
| |
| ----
| |
| "submissions, smtps " .
| |
| ----
| |
| * Ajouter cette ligne en ligne 1873:
| |
| ----
| |
| if ($port eq 465) { return "smtps"; }
| |
| ----
| |
| * Ajouter cette ligne en ligne 1897:
| |
| ----
| |
| if ($service eq "smtps") { return 465; }
| |
| ----
| |
| * Ajouter cette ligne en ligne 1905:
| |
| ----
| |
| if ($service eq "submissions") { return 587; }
| |
| ----
| |
| * Ajouter ces lignes en ligne 2883:
| |
| ----
| |
| } elsif ($$v{service} eq "smtps" or $$v{service} eq "submissions") {
| |
| $$r{num_connects} = 0 if (check_smtps($v, $r) == $SERVICE_UP);
| |
| ----
| |
|
| |
| <!--
| |
| 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;'''
| |
| + '''}'''
| |
| +'''}'''
| |
|
| |
| ----
| |
| -->
| |
|
| |
|
| =Fichier de configuration= | | =Fichier de configuration= |
Ligne 381 : |
Ligne 158 : |
| Ensuite viennent divers blocs, un par protocol analysé: | | Ensuite viennent divers blocs, un par protocol analysé: |
| * '''virtual''' : chaque bloc débute par ce mot; il est suivi de l'adresse IP virtuelle utilisée par le client qui fait sa requête suivie du port du protocol utilisé par le client. Cette adresse correspond au nom de machine du router "cluster.home.dom" et à l'adresse IP du router "192.168.1.73". | | * '''virtual''' : chaque bloc débute par ce mot; il est suivi de l'adresse IP virtuelle utilisée par le client qui fait sa requête suivie du port du protocol utilisé par le client. Cette adresse correspond au nom de machine du router "cluster.home.dom" et à l'adresse IP du router "192.168.1.73". |
| * '''real''' : est présent plusieurs fois, une ligne par serveur qui procure ce service. Dans notre cas, nous avons deux serveurs dans le cluster. Le premier paramètre est l'adresse IP réelle du serveur suivie par le n° du port de ce service sur ce serveur. Elle est suvie du type de redirection; nous utilisons le type "mask" qui est le plus simple et qui correspond à notre schéma. Enfin on attribue un poids pour la sélection; par exemple, pour le protocole HTTP (port 80), la machine "fo1.home.dom" ("192.168.3.71") recevra 100 fois moins de requêtes que la machine "fo2.home.dom" ("192.168.3.72"). | | * '''real''' : est présent plusieurs fois, une ligne par serveur qui procure ce service. Dans notre cas, nous avons deux serveurs dans le cluster. Le premier paramètre est l'adresse IP réelle du serveur suivie par le n° du port de ce service sur ce serveur. Elle est suvie du type de redirection; nous utilisons le type "'''masq'''" ou "masquerading" qui est le plus simple et qui correspond à notre schéma. Enfin on attribue un poids pour la sélection; par exemple, pour le protocole HTTP (port 80), la machine "fo1.home.dom" ("192.168.3.71") recevra 100 fois moins de requêtes que la machine "fo2.home.dom" ("192.168.3.72"). |
| * '''checktype''' : définit le type de traitement; nous utilisons le type "negotiate"; ce type va utiliser les routines de vérification incluses dans le programme. On peut utiliser le type "external" qui va utiliser un script externe créé par vous-même pour faire la vérification du bon fonctionnement du service sur la machine désignée. | | * '''checktype''' : définit le type de traitement; nous utilisons le type "negotiate"; ce type va utiliser les routines de vérification incluses dans le programme. On peut utiliser le type "external" qui va utiliser un script externe créé par vous-même pour faire la vérification du bon fonctionnement du service sur la machine désignée. |
| * '''service''' : dans cas de "checktype=negotiate", il définit la routine interne qui sera utilisée. | | * '''service''' : dans cas de "checktype=negotiate", il définit la routine interne qui sera utilisée. |
Ligne 397 : |
Ligne 174 : |
|
| |
|
|
| |
|
| =Problème= | | =SSL= |
| Si vous rencontrez un problème avec un protocole donné, j'utilie cette méthode:
| | Quatre services utilisent le cryptage SSL et les certificats associés: HTTPS, SMTPS, POPS et IMAPS. Pour valiser ces connexions, Ldirectord doit aussi valider leurs certificats. |
| * arrêtez le service "ldirectord.service"
| |
| * dans le fichier "/etc/ldirectord.cf", isolez le bloc concernant ce protocole
| |
| * lancez interactivement Ldirectord en mode debugger
| |
| ldirectord -d start
| |
| * après quelques secondes, quand il a fait son premier cycle de vérifications, arrêtez-le ("^C")
| |
| * analysez la sortie
| |
| Dans plusieurs cas, une fonction Perl n'était pas installée; il ne la trouve pas.
| |
| | |
| | |
| | |
|
| |
|
| | Mais les certificats utilisés n'ont pas été validés par une authorité de certification officielle (CA). Il nous faut l'intégrer à la liste officielle du router comme expliqué dans l'article sur les [[LINUX:Cryptage sous Linux|Certificats sous Linux]]. |
|
| |
|
| | Dans l'article sur le [[LINUX:Pacemaker - Paramétrage des services en Failover|Paramétrage des services en Failover]], nous avions créé les certificats. Le certificat de l'authorité de certification (CA) se nomme "ca.home.crt". On va le copier dans le répertoire "/etc/pki/ca-trust/source/anchors" du router "cluster.home.dom". Ensuite on exécute la commande: |
| | update-ca-trust |
| | pour l'intégrer à la liste officielle des authorités de certification officielle (CA). |
|
| |
|
|
| |
|
Ligne 418 : |
Ligne 189 : |
| systemctl start ldirectord.service | | systemctl start ldirectord.service |
|
| |
|
| | |
| | =Statut= |
| | Pour visualiser l'état du système, on utilise la commande suivante: |
| | ipvsadm |
| | qui donne: |
| | ---- |
| | IP Virtual Server version 1.2.1 (size=4096) |
| | Prot LocalAddress:Port Scheduler Flags |
| | -> RemoteAddress:Port Forward Weight ActiveConn InActConn |
| | TCP cluster.home.dom:smtp lblcr persistent 3600 |
| | -> fo1.home.dom:smtp Masq 65000 0 0 |
| | -> fo2.home.dom:smtp Masq 650 0 0 |
| | TCP cluster.home.dom:http lblcr persistent 3600 |
| | -> fo1.home.dom:http Masq 650 0 0 |
| | -> fo2.home.dom:http Masq 65000 0 0 |
| | TCP cluster.home.dom:pop3 lblcr persistent 3600 |
| | -> fo1.home.dom:pop3 Masq 65000 0 0 |
| | -> fo2.home.dom:pop3 Masq 65000 0 0 |
| | TCP cluster.home.dom:imap lblcr persistent 3600 |
| | -> fo1.home.dom:imap Masq 65000 0 0 |
| | -> fo2.home.dom:imap Masq 65000 0 0 |
| | TCP cluster.home.dom:https lblcr persistent 3600 |
| | -> fo1.home.dom:https Masq 650 0 0 |
| | -> fo2.home.dom:https Masq 65000 0 0 |
| | TCP cluster.home.dom:smtps lblcr persistent 3600 |
| | -> fo1.home.dom:smtps Masq 65000 0 0 |
| | -> fo2.home.dom:smtps Masq 650 0 0 |
| | TCP cluster.home.dom:submission lblcr persistent 3600 |
| | -> fo1.home.dom:submission Masq 65000 0 0 |
| | -> fo2.home.dom:submission Masq 650 0 0 |
| | TCP cluster.home.dom:imaps lblcr persistent 3600 |
| | -> fo1.home.dom:imaps Masq 65000 0 0 |
| | -> fo2.home.dom:imaps Masq 65000 0 0 |
| | TCP cluster.home.dom:pop3s lblcr persistent 3600 |
| | -> fo1.home.dom:pop3s Masq 65000 0 0 |
| | -> fo2.home.dom:pop3s Masq 65000 0 0 |
| | ---- |
| | |
| | |
| | =Accès pour les clients= |
| | Notons que sur les machines clients, le nom de machine "cluster.home.dom" doit être connu et lié à l'adresse IP "192.168.1.73". (serveur DNS ou fichiers "hosts" local) |
| | |
| | |
| | Pour accéder au site Web, l'URL est: |
| | <nowiki>https://cluster.home.dom</nowiki> |
| | qui affichera: |
| | ---- |
| | Nom du serveur: fo1.home.dom |
| | ---- |
| | |
| | |
| | Du côté de la messagerie, Le serveur est "cluster.home.dom". Par exemple pour l'utilisateur "pdupont", l'adresse mail est "pdupont@failover.dom" et le nom de compte est "pdupont" accompagné du mot de passe Linux associé. Le reste est classique. |
|
| |
|
|
| |
|
Ligne 428 : |
Ligne 251 : |
|
| |
|
| ---- | | ---- |
| ''→ [[LINUX:Pacemaker - Serveurs en Loadbalancing|retour aux Serveurs en Loadbalancing]]'' | | ''→ [[LINUX:Pacemaker - Serveurs en Loadbalancing (masq)|retour aux Serveurs en Loadbalancing (masq)]]'' |
| ---- | | ---- |
| __NOEDITSECTION__ | | __NOEDITSECTION__ |
| [[Category:LINUX]] | | [[Category:LINUX]] |