SphynxHauteDispo

Un article de EoleWiki.

Sommaire

Introduction

Ce document à pour but d'expliquer la mise en place d'un système de redondance materiel avec répartition de charge sur Sphynx.

Il s'appuie sur les travaux et le document réalisés par G.Guérin de l'académie de Creteil.

Il a aussi comme objectif de faire un état des lieux précis des modifications à apporté sur Sphynx pour une éventuelle intégration de la solution.


Principe de fonctionnement

Image:haute_dispo.png

Les Amons se connectent sur l'un ou l'autre des Sphynx. La répartition de charge est ici faite de manière statique. C'est à l'administrateur de choisir sur quel Sphynx il désir que l'Amon se connecte.

En cas de défaillance de l'un des deux Sphynx, c'est le second qui prend automatiquement le relais du premier (dans ce cas, il gère ses Amons "habituels" + ceux de l'autre Sphynx).

La configuration de toutes les connexions (comprendre tous les réseaux amons) se fait à partir du même Sphynx. Elle est ensuite répliquée sur le Sphynx secondaire.

Tests de mise en oeuvre sur la plateforme

Platefome :

  • 2 PC Intel p4
  • 3 cartes réseaux
  • Sphynx 1.1 état technique c
  • Installation de Heartbeat, Mon et rsync sur les 2 machines
  • Ajout des modules pour gérer la troisième carte réseau dans /etc/modules.conf sur les 2 machines
  • Création du fichiers /etc/sysconfig/network-script/ifcfg-eth2 sur les 2 machines

Configuration Heartbeat :

  • Création fichier /etc/ha.d/authkeys
 #
 #       Must have exactly one auth directive at the front.
 #       auth    send authentication using this method-id
 #
 #       Then, list the method and key that go with that method-id
 #
 #       Available methods: crc sha1, md5.  Crc doesn't need/want a key.
 #
 #       You normally only have one authentication method-id listed in this file
 #
 #       Put more than one to make a smooth transition when changing auth
 #       methods and/or keys.
 #
 #
 #       sha1 is believed to be the "best", md5 next best.
 #
 #       crc adds no security, except from packet corruption.
 #               Use only on physically secure networks.
 #
 auth 2
 1 crc 
 2 sha1 HI!
 3 md5 Hello!
  • Création fichier /etc/ha.d/ha.cfg
 #
 #     File to write debug messages to 
 debugfile /var/log/ha-debug
 #
 #
 #     File to write other messages to 
 #
 logfile       /var/log/ha-log
 #
 #
 #     Facility to use for syslog()/logger
 #
 logfacility   local0
 #
 #
 #     A note on specifying "how long" times below...
 #
 #     The default time unit is seconds
 #             10 means ten seconds
 #
 #     You can also specify them in milliseconds
 #             1500ms means 1.5 seconds
 #
 #
 #     keepalive: how long between heartbeats? (Délais entre 2 battement de pouls)
 #
 keepalive 1
 #
 #     deadtime: how long-to-declare-host-dead? (temps à partir duquel on estime la mort du Heartbeat distant)
 #
 #             If you set this too low you will get the problematic
 #             split-brain (or cluster partition) problem.
 #             See the FAQ for how to use warntime to tune deadtime.
 #
 deadtime 3
 #
 #
 #     What UDP port to use for bcast/ucast communication? 
 #     (port de communication sur le lien Heartbeat)
 udpport       694
 #
 # Interface définissant le lien Heartbeat
 bcast   eth2
 # [...]
 #
 #     Tell what machines are in the cluster
 #     node    nodename ...    -- must match uname -n
 #node ken3
 #node kathy
 # Description des noeuds du cluster a mettre en place.
 # Attention, il faut que le nom défini ici soit identique à celui renvoyé par la commande uname -n
 node sphynx2.local
 node sphynx.local
 #
  • Création des fichiers /etc/ha.d/haresources
 #
 sphynx1.local 192.168.230.125 172.18.0.3 ipsec_alive_heartbeat
 sphynx2.local 192.168.230.124 172.18.0.4 ipsec_alive_heartbeat

Ce fichier à pour but de décrire les interfaces virtuelles, les serveurs de rattachement et les actions à effectuer en cas de défaillance de l'un des noeuds.

  • Création et mises en place du fichier ipsec_alive_heartbeat dans le repertoire /etc/init.d des 2 serveurs.
    • Ces services permettent à Heartbeat de libérer et/ou de récupérer les ip virtuelles.
  • Modification du fichier /etc/hosts sur les 2 machines
 /etc/hosts sur Sphynx1
 127.0.0.1               localhost.localdomain localhost
 10.250.250.1            sphynx1.local
 10.250.250.2            sphynx2.local
 
 192.168.230.121         sphynx1.eole.lan sphynx1
 172.18.0.1              sphynx1.eole.lan sphynx1
 /etc/hosts sur Sphynx2
 127.0.0.1               localhost.localdomain localhost
 10.250.250.1            sphynx1.local
 10.250.250.2            sphynx2.local
 
 192.168.230.123         sphynx2.eole.lan sphynx2
 172.18.0.2              sphynx2.eole.lan sphynx2


  • Modification du script de firewall (/sbin/lance.firewall)
 ## interface connecte au reseau Heartbeat
 INT_HEART="eth2"
 
 ## creation de la chaine Heartbeat 
 /sbin/iptables -N int-heart
 
 
 ## definition de la chaine int-heart
 /sbin/iptables -A int-heart -m state --state ESTABLISHED,RELATED -j ACCEPT
 /sbin/iptables -A int-heart -i $INT_HEART -j ACCEPT
 
 
 /sbin/iptables -A INPUT -j int-heart

Lancement du service Heartbeat

  • Visualisation du résultat :
 [root@sphynx2 /]# ifconfig
 eth0      Lien encap:Ethernet  HWaddr 00:11:2F:61:72:A8
           inet adr:192.168.230.123  Bcast:192.168.230.255  Masque:255.255.255.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:9430 errors:0 dropped:0 overruns:0 frame:0
           TX packets:3321 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 lg file transmission:1000
           RX bytes:995960 (972.6 Kb)  TX bytes:644298 (629.1 Kb)
           Interruption:22 Adresse de base:0xfc00
 
 eth0:0    Lien encap:Ethernet  HWaddr 00:11:2F:61:72:A8
           inet adr:192.168.230.125  Bcast:192.168.230.255  Masque:255.255.255.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           Interruption:22 Adresse de base:0xfc00
 
 eth1      Lien encap:Ethernet  HWaddr 00:0A:5E:49:67:C8
           inet adr:172.18.0.2  Bcast:172.18.0.255  Masque:255.255.255.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:28 errors:0 dropped:0 overruns:0 frame:0
           TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 lg file transmission:1000
           RX bytes:1740 (1.6 Kb)  TX bytes:2160 (2.1 Kb)
           Interruption:22 Adresse de base:0xdc00
 
 eth1:0    Lien encap:Ethernet  HWaddr 00:0A:5E:49:67:C8
           inet adr:172.18.0.5  Bcast:172.18.0.255  Masque:255.255.255.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           Interruption:22 Adresse de base:0xdc00
 
 eth2      Lien encap:Ethernet  HWaddr 00:03:47:3A:DD:A4
           inet adr:10.250.250.2  Bcast:10.250.250.255  Masque:255.255.255.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:134 errors:0 dropped:0 overruns:0 frame:0
           TX packets:140 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 lg file transmission:1000
           RX bytes:24773 (24.1 Kb)  TX bytes:26024 (25.4 Kb)
           Interruption:21 Adresse de base:0x4000

Mise en place de la configuration pour faire les rsync

  • Modification fichier /etc/hosts.allow
 #
 sshd:172.18.0.0/255.255.255.0,192.168.230.0/255.255.255.0,10.250.250.1
 
  • Modification fichier /sbin/lance.firewall pour autoriser le maitre à se connecter
 [...]
 ## interface connecte au reseau Heartbeat
 INT_HEART="eth2"
 [...]
 ## adresse ip cote Heartbeat
 IPAD_HEART="10.250.250.2"
 [...]
 ## creation de la chaine Heartbeat
 /sbin/iptables -N int-heart
[...]
 ## definition de la chaine int-heart
 /sbin/iptables -A int-heart -m state --state ESTABLISHED,RELATED -j ACCEPT
 /sbin/iptables -A int-heart -i $INT_HEART -s 10.250.250.1 -d $IPAD_HEART -j ACCEPT
[...]
/sbin/iptables -A INPUT -j int-heart
  • Création d'un bi-clef rsa (sans mot de passe) sur le maitre pour permettre les connexion ssh vers le secondaire
 [root@sphynx1 root]# ssh-keygen -t rsa -b 2048
 Generating public/private rsa key pair.
 Enter file in which to save the key (/root/.ssh/id_rsa):
 Enter passphrase (empty for no passphrase):
 Enter same passphrase again:
 Your identification has been saved in /root/.ssh/id_rsa.
 Your public key has been saved in /root/.ssh/id_rsa.pub.
  • Modification fichier conf ssh /etc/ssh/sshd_config pour que le serveur écoute sur toutes les interfaces
  • Copie de la clef vers le secondaire :
 [root@sphynx1 root]# scp .ssh/id_rsa.pub root@sphynx2.local:.ssh/authorized_keys

Configuration Freeswan

  • On intervient uniquement sur un des 2 Sphynx (le maître). La configuration du second est obtenue en synchronisant les 2 machines.
  • Initialisation du concentrateur VPN maître (Sphynx1) avec la commande init-sphynx.sh
  • Renseignement des paramètres demandés. L'adresse IP publique correspond à son adresse principale.
  • Ajout d'un établissement dans la base.

Visualisation du résultat dans le fichier /etc/freeswan/ipsec.conf :

 config setup
       interfaces=%defaultroute
       klipsdebug=none
       plutodebug=none
       plutoload=%search
       plutostart=%search
       syslog=daemon.debug
       uniqueids=yes
 
 conn %default
       keyingtries=3
       keylife=8h
       ikelifetime=3h
       authby=rsasig
       rightid="@/C=fr/O=gouv/OU=education/OU=ac-dijon/CN=sphynx"
       right=192.168.230.121
       rightrsasigkey=%cert
       leftrsasigkey=%cert
       rightcert=/etc/freeswan/ipsec.d/sphynx.pem
       rightnexthop=192.168.230.254
       #rightupdown="ipsec_updown_etab-sphynx"
       pfs=yes
       ike=aes128-sha2_256-modp2048
       esp=aes128-sha2_256
       pfsgroup=modp2048
 
 #DEB:amon1-0
 # configuration de connexion pour amon1
 conn C-amon1-0-sphynx
       leftid="@/C=fr/O=gouv/OU=education/OU=ac-dijon/CN=amon1"
       left=192.168.230.120
       leftsubnet=10.21.11.0/255.255.255.0
       leftnexthop=192.168.230.254
       rightsubnet=172.18.0.0/255.255.255.0
       auto=add
 #FIN:amon1-0
  • Modification des fichiers de conf ipsec pour l'amon.
    • Il faut changer l'adresse IP de sphynx par son ip virtuelle (ou par celle du secondaire si on veut que l'amon aille se connecter sur le secondaire au lieu du primaire afin de faire de la répartition de charge). De ce fait, l'amon utilise toujours l'ip virtuel du sphynx.
 [root@sphynx1 root]# cd /home/data/amon1/
 [root@sphynx1 amon1]# for file in $(echo -e "ipsec.conf_amon1");do sed s/"192.168.230.121"/"192.168.230.125"/g 
 $file >$file.tmp; mv -f $file.tmp $file; done


  • Création du fichier /etc/freeswan/ipsec.loadbalancing
    • Ce fichier reflète la répartition statique des Amons sur les 2 Sphynx. C'est dans ce fichier qu'on va définir sur quel Sphynx on veut qu'un Amon se connecte.
 sphynx1:C-amon1-sphynx
 sphynx1:C-amon2-sphynx
 sphynx2:C-amon3-sphynx
 sphynx2:C-amon4-sphynx
 ...
  • Mise en place de règles de redirections des ip virtuelles vers l'ip principale dans le fichier /sbin/lance.firewall
 ## Redirection des IP virtuelles vers l'IP réelle du serveur
 # 192.168.230.125 : Master ip
 # 192.168.230.124 : Slave ip
 /sbin/iptables -t nat -A PREROUTING -d 192.168.230.125 -j DNAT --to 192.168.230.121
 /sbin/iptables -t nat -A PREROUTING -d 192.168.230.124 -j DNAT --to 192.168.230.121
  • Synchronisation des fichiers sur le serveur secondaire (création fichier sync_conf.sh)
 #!/bin/bash
 # Synchronisation du master sur le slave via le lien Heartbeat
 
 serveur="sphynx2.local"
 RepBase="/usr/share/eole/sphynx-vpn/xml/"
 RepFreeswan="/etc/freeswan/"
 
 /usr/bin/rsync -e ssh --recursive --links --perms --times --delete $RepBase $serveur:$RepBase
 /usr/bin/rsync -e ssh --recursive --links --perms --times --delete $RepFreeswan $serveur:$RepFreeswan
 
 ##Changement ip (eth0) principale du sphynx par son ip virtuelle maitre dans le fichier ipsec.conf de l'amon
 ssh root@$serveur "/bin/sed s/"right=192.168.230.121"/"right=192.168.230.123"/g /etc/freeswan/ipsec.conf \
 >/etc/freeswan/ipsec.conf.tmp; mv -f /etc/freeswan/ipsec.conf.tmp /etc/freeswan/ipsec.conf;"
 
 ##Changement ip (eth1) principale du sphynx par son ip virtuelle maitre dans test-rvp
 ssh root@$serveur "/bin/sed s/"fping 172.18.0.1"/"fping 172.18.0.4"/g /usr/share/eole/test-rvp \
 >/usr/share/eole/test-rvp.tmp; mv -f /usr/share/eole/test-rvp.tmp /usr/share/eole/test-rvp;"
  • Copie des fichiers sur l'amon et activation du VPN

Mise en place de la surveillance des services

La surveillance du service ipsec est effectué par le démon Mon.

  • Configuration de Mon (/etc/mon/mon.cf)
 # Extremely basic mon.cf file
 #
 # global options
 cfbasedir   = /etc/mon
 pidfile     = /var/run/mon.pid
 statedir    = /var/lib/mon/state.d
 logdir      = /var/lib/mon/log.d
 dtlogfile   = /var/lib/mon/log.d/downtime.log
 alertdir    = /usr/lib/mon/alert.d
 mondir      = /usr/lib/mon/mon.d
 maxprocs    = 20
 histlength  = 100
 randstart   = 60s
 authtype    = pam
 userfile    = /etc/mon/userfile
 # group definitions (hostnames or IP addresses)
 hostgroup servers localhost
 watch servers
 service rvp
 interval 5s
 monitor ipsec.monitor
 period NORMAL: wd {Sun-Sat}
 numalerts 1
 alertafter 4
 alert heartbeat.alert
 upalert heartbeat.alert
 alert mail.alert samuel.morin@ac-dijon.fr
  • Création du script de surveillance d'ipsec (/usr/lib/mon/mon.d/ipsec.monitor) sur les 2 sphynx.
  #!/bin/bash
 ## testing according to 'ipsec verify command'
 # Checking for KLIPS support in kernel
 [ ! -f /proc/net/ipsec_eroute ] && exit 1  # ipsec ne fonctionne pas
 
 # Checking for RSA private key /etc/freeswan/ipsec.secrets
 [ ! -f /etc/freeswan/ipsec.secrets ] && exit 1  # ipsec ne fonctionne pas
 # Checking that pluto is running
 [ ! ipsec whack --status > /dev/null ] && exit 1  # ipsec ne fonctionne pas
 
 # Ping IP virtual on Internet Side 195.98.246.229
 fping 195.98.246.229 > /dev/null
 
 if [ $? -ne 0 ]; then
 echo "$(date) : Redondance sphynx activée " | \
 mail -s 'sphynx1 down - sphynx2 backup' samuel.morin@ac-dijon.fr
 exit 1  # problème Heartbeat
 fi
 exit 0

En fonction du résultat obtenu lors de l'execution de ce script, une action sera déclanchée par Mon.

  • Création du script d'alerte /usr/lib/mon/alert.d/heartbeat.alert
 #!/bin/bash
 ## script invoked by heartbeat
 ## situé sous /usr/lib/mon/alert.d  (répertoire des alertes Mon)
 
 HEARTBEAT="/etc/rc.d/init.d/heartbeat"
 if [ "$9" = "-u" ]
 then
         $HEARTBEAT start
 else
         $HEARTBEAT stop
 fi

Modification à effectuer sur sphynx pour une intégration de la solution

  • Au niveau materiel :
    • Ajout d'une troisième carte réseau -> modification script d'auto-install
    • Ajout des paquets Heartbeat, Rsync et Mon (+ dépendance : perl-Convert-BER, perl-Mon, perl-Net-Telnet et perl-TimeDate)
  • Au niveau configuration :
    • Ajout des fichiers de configurations pour Heartbeat (authkeys, ha.cfg, haresources)
    • Modification fichier hosts pour prise en compte du second sphynx
    • Modification du nom de host de la machine pour qu'elle prenne celui du reseau local Heartbeat
    • Modification des scripts de firewall
    • Modification server.5 pour activer les services heartbeat et Mon
    • Ajout des scripts permettant la synchronisation entre les 2 sphynx.
    • Création d'un dictionnaire local et d'un script d'installation.
    • generation du fichier ipsec.loadbalancing : prévoir une question au niveau du manage-sphynx.
  • problèmes :
    • la configuration de heartbeat nécessite d'avoir un mot de passe identique sur les 2 noeuds (fichier authkeys).

plusieurs solutions :

a) le mot de passe est fixé en dure dans le fichier de configuration et il est identique sur toutes les machines.

b) On génère le mot de passe sur un des deux sphynx puis on recopie la configuration sur le second.

c) Le mot de passe est stocké dans le dictionnaire local. Aux personnes qui génèrerons la configuration de faire attention à mettre le même.


Vous pouvez télécharger mes fichiers et scripts de travail ici

Amélioration à prévoir

  • backup de la conf non modifiée du primaire sur le secondaire (dans un répertoire backup)
  • backup de la conf non modifiée du secondaire sur le primaire.