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
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.

