Keepalived est un programme disponible sous Debian qui permet de faire du failover au niveau IP. En fait il va faire que deux serveurs se partagent une même IP et que si l'un tombe, l'autre prend le relais ( propre ! ) et le tout de manière automatique ;).
Attention, il ne s'agit pas d'une solution de load-balancing… Le but est juste de fournir un serveur de remplacement si jamais le master “fail”.
Pour info, le protocole utilisé derrière est VRRP, Virtual Router Redundancy Protocol, qui permet de faire la même chose avec des routeurs.
Nos deux instances de keepalived vont donc s'échanger des infos pour savoir qui répond. Chacune va checker la “santé” de son processus et passe la main à la suivante si ça va pas. Les instances sont ordonnées par priorité.
Note : Il pourrait s'agir d'une solution pour redonder certains services de MiNET… Un peu moche mais ça marche…
A bon entendeur…
Nous allons déployer un serveur web tout ce qu'il y a de plus basique. Mais en redondé : un serveur web en master et un autre de fail over. OK ça pête pas des masses d'intérêt mais c'est par exemple le même principe pour redonder un load balanceur.
J'ai réalisé ceci sous OpenVZ. Mes deux openvz possèdent une interface publique et une interface d'administration. On utilise les vmbr.
Voici la conf réseau du master : /etc/network/interfaces
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.103.166 netmask 255.255.255.0 iface eth3 inet manual
Voici la conf réseau du slave : /etc/networking/interfaces
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.103.167 netmask 255.255.255.0 iface eth3 inet manual
Bon …
Maintenant sur chaque serveur web, on autorise le routing sur les deux serveurs webs : /etc/sysctl.conf
net.ipv4.ip_forward = 1
Puis on reboot un petit coup.
Installons maintenant keepalived :
apt-get install keepalived
Ensuite, on allume bien ses interfaces réseau, sur les deux OpenVZ :
ifconfig eth3 up
Sinon ça risque pas de marcher !
Voici le fichier de conf du master : /etc/keepalived/keepalived.conf
vrrp_script chk_apache { script "killall -0 apache2" interval 2 weight 2 fall 2 rise 2 } vrrp_instance VI_1 { interface eth3 state MASTER virtual_router_id 51 priority 101 virtual_ipaddress { 157.159.40.175/26 dev eth3 } track_script { chk_apache } }
Pour expliquer, on crée une instance VRRP master, sur eth3. Il s'agit d'un routeur virtuel d'id 51. Il a une priorité de 101. On donne ensuite l'adresse ip ainsi que le netmask.
Enfin on mentionne comment vérifier que apache tourne bien. On vérifie toutes les deux secondes que le processus est bien présent. Et on attend deux check pour crier au loup.
Voili voilou, rien de plus
Concernant le client : /etc/keepalived/keepalived.conf
vrrp_script chk_apache { script "killall -0 apache2" interval 2 weight 2 fall 2 rise 2 } vrrp_instance VI_1 { interface eth3 state BACKUP virtual_router_id 51 priority 100 virtual_ipaddress { 157.159.40.175/26 dev eth3 } track_script { chk_apache } }
Bah c'est exactement la même chose, mais un chouïa moins prioritaire…
Voilà, il ne reste plus qu'à observer le résultat !
On démarre donc keepalived sur les deux machines :
/etc/init.d/keepalived start
Chez moi ça marche, je peux killer apache où je veux, je continue à avoir le service, tant que je coupe pas les deux en même temps.
Là ou nous en sommes, nous n'avons pas encore de gateway. Elle peut être ajouté via :
route add default gateway 157.159.40.129
Personnelement, j'ailégerement modifié mes scripts d'init afin de :
Une solution plus propre serais d'utiliser des routes virtuelles comme documentées pour keepalived, mais je n'ai pas réussit à les faire marcher sur les containers. Je suppose que ça doit marcher dans une KVM ( pas testé … ).
Voilà voilà
Si quelqu'un de mal intentionné a accès à votre subnet, il peut tenter de récupérer l'adresse IP virtuelle et faire ensuite ce qu'il veut avec… Vraiment pas cool.
Pour celà, il a juste besoin de connaitre :
Il ne lui reste ensuite plus qu'à installer keepalived sur une de ses machines pour ensuite s'inscrire au groupe avec une priorité maximale et récupérer l'ip virtuelle…
Un moyen de se défendre contre ceci serait de mettre un mot de passe :
authentication { auth_type PASS auth_pass 1111 }
Je ne peux pas garantir que ça ne passe pas en clair…
Conclusion, utiliser keepalived dans des VLANs ou il n'y a que des gens de confiance…
Voici les liens sur lesquels je me suis appuyé :
Dans le même style, des pare-feux redondants :
— Benoit Tellier 2014/01/24 03:25