From 3aba72633b479088e8726607d5323c41ce01a22a Mon Sep 17 00:00:00 2001 From: Jeremy Lecour Date: Fri, 17 Nov 2023 16:35:54 +0100 Subject: [PATCH] =?UTF-8?q?am=C3=A9lioration=20VRRP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HowtoVRRP.md | 103 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 23 deletions(-) diff --git a/HowtoVRRP.md b/HowtoVRRP.md index f2b3afbe..2e63e4db 100644 --- a/HowtoVRRP.md +++ b/HowtoVRRP.md @@ -41,7 +41,7 @@ Notre paquet *vrrpd* intègre différents patches, notamment un script permettan L'utilisation des *macvlans* permet d'avoir des adresses MAC spécifiques à VRRP. Pour cela, il faut : * utiliser le script `/etc/vrrpd/vrrp_switch` (installé par défaut) -* utiliser l'option `-x` pour interdire à vrrpd de manipuler les interfaces en déléguant cette opération au script. Dans ce mode, vrrpd reçoit et émet des paquets VRRP et appelle /etc/vrrpd/vrrp_switch lors des changements d'états master/slave +* utiliser l'option `-x` pour interdire à vrrpd de manipuler les interfaces en déléguant cette opération au script. Dans ce mode, vrrpd reçoit et émet des paquets VRRP et appelle /etc/vrrpd/vrrp_switch lors des changements d'états _master_/_backup_ * ne pas utiliser l'option `-n` ## Utilisation @@ -51,20 +51,35 @@ Il faut au préalable ajuster des paramètres _sysctl_, par exemple dans `/etc/s ~~~ net.ipv4.conf.all.arp_ignore=1 net.ipv4.conf.all.arp_announce=2 -# Pouvoir écouter sur une adresse IP non présente localement (lorsque la machine est slave) +# Pouvoir écouter sur une adresse IP non présente localement (lorsque la machine est _backup_) net.ipv4.ip_nonlocal_bind=1 ~~~ -Si l'on utilise [minifirewall](https://gitea.evolix.org/evolix/minifirewall) comme pare-feu, 2 actions supplémentaires sont nécessaires : +### minifirewall -- Il faut ajouter la commande suivante dans sa configuration `/etc/default/minifirewall`, pour s'assurer que les paramètres soient gardés après redémarrage de minifirewall : +Si l'on utilise [minifirewall](https://gitea.evolix.org/evolix/minifirewall) comme pare-feu, il y a des actions à réaliser en fonction de la version de minifirewall. + +Vérifier votre version de inifirewall avec la commande suivante : `/etc/init.d/minifirewall version`. + +#### Version 22.03 ou ultérieure + +Il faut simplement avoir `SYSCTL_RP_FILTER='0'` dans `/etc/default/minifirewall`. + +Ajouter une autorisation dans `/etc/minifirewall.d/vrrpd` : + +~~~ +iptables -A INPUT -s -d 224.0.0.18 -j ACCEPT +~~~ + +#### Version inconnue ou antérieure + +* Il faut ajouter la commande suivante dans sa configuration `/etc/default/minifirewall`, pour s'assurer que les paramètres soient gardés après redémarrage de minifirewall : ~~~ sysctl -p /etc/sysctl.d/vrrpd.conf --quiet ~~~ - -- Et il faut également commenter l'activation du rp_filter dans `/etc/init.d/minifirewall`, et ajouter sa désactivation totale : +* Et il faut également commenter l'activation du rp_filter dans `/etc/init.d/minifirewall`, et ajouter sa désactivation totale : ~~~ # Enable Reverse Path filtering : verify if responses use same network interface @@ -79,21 +94,25 @@ done **Attention** : ne pas simplement commenter le bloc ou modifier le "echo 1" de l'activation en "echo 0", mais bien commenter le premier bloc et ajouter le second bloc pour bien expliciter le changement de configuration. -Au niveau du pare-feu, il faut ajouter la règle suivante : +* Au niveau du pare-feu, il faut ajouter la règle suivante : ~~~ # iptables -A INPUT -s -d 224.0.0.18 -j ACCEPT ~~~ -Puis, on lance par exemple la commande suivante : +### Exécution + +#### Manuelle + +On peut démarrer un processus VRRP (manuellement ou au boot via `/etc/rc.local`) avec cette commande: ~~~ -# vrrpd -i eth0 -x -D -d 10 -v 42 -p 100 -a pw/0xPASSWORD -l foo 192.0.2.42/27 +# vrrpd -i eno0 -x -D -d 10 -v 42 -p 100 -a pw/0xPASSWORD -l foo 192.0.2.10/27 ~~~ Détails des options utilisées : -* `-i eth0` : se binder sur l'interface _eth0_ +* `-i eno0` : se binder sur l'interface _eno0_ * `-x` : ne pas manipuler d'interface mais déléguer au script `vrrp_switch` * `-D` : lancer en mode démon * `-d 10` : intervalle d'avertissement en seconde (défaut : 1) @@ -105,9 +124,9 @@ Détails des options utilisées : Au bout de quelques dizaines de secondes, vrrpd va passer dans l'état _master_ et créer l'interface `vrrp_${vrid}_${interface}` avec l'adresse IP et l'adresse MAC `00:00:5e:00:01:${vrid}`: ~~~ -$ ifconfig vrrp_2_eth0 -vrrp_2_eth0 Link encap:Ethernet HWaddr 00:00:5e:00:01:2a - inet adr:192.0.2.42 Bcast:0.0.0.0 Masque:255.255.255.224 +$ ifconfig vrrp_42_eno0 +vrrp_42_eno0 Link encap:Ethernet HWaddr 00:00:5e:00:01:2a + inet adr:192.0.2.10 Bcast:0.0.0.0 Masque:255.255.255.224 adr inet6: fe80::200:5eff:fe00:102/64 Scope:Lien [...] ~~~ @@ -116,14 +135,14 @@ On devrait voir cela dans les logs (syslog) : ~~~ Apr 23 18:26:28 lb01 vrrpd->lan[57143]: Starting (adver_int: 10000000, vrid: 42, use virtual mac: yes) -Apr 23 18:26:28 lb01 vrrpd->lan[57143]: VRRP ID 42 on eth0 (prio: 100) : we are now a backup router. -Apr 23 18:26:59 lb01 vrrpd->lan[57143]: VRRP ID 42 on eth0 (prio: 100): we are now the master router. +Apr 23 18:26:28 lb01 vrrpd->lan[57143]: VRRP ID 42 on eno0 (prio: 100) : we are now a backup router. +Apr 23 18:26:59 lb01 vrrpd->lan[57143]: VRRP ID 42 on eno0 (prio: 100): we are now the master router. ~~~ Sur une autre machine, après avoir également ajusté les paramètres _sysctl_, on lance la même commande avec une priorité plus faible : ~~~ -# vrrpd -i eth0 -x -D -d 10 -v 42 -p 90 -a pw/0xPASSWORD -l foo 192.0.2.42/27 +# vrrpd -i eth0 -x -D -d 10 -v 42 -p 90 -a pw/0xPASSWORD -l foo 192.0.2.10/27 ~~~ Cette machine va rester en état _slave_ tant qu'elle capte des messages d'avertissement de la machine _master_ : @@ -133,15 +152,22 @@ Apr 23 18:26:28 lb02 vrrpd->lan[57143]: Starting (adver_int: 10000000, vrid: 42, Apr 23 18:26:28 lb02 vrrpd->lan[57143]: VRRP ID 42 on eth0 (prio: 90) : we are now a backup router. ~~~ -On pourra utiliser une unité systemd pour start/stop le démon. +Pour changer la priorité du processus il suffit de tuer l'actuel et de relancer la commande avec la nouvelle priorité. Si ça doit être persistent, il faut modifier + +#### systemd + +On pourra utiliser une unité systemd pour gérer VRRP. On conseille d'avoir une unité pour chaque IP gérée, en utilisant le **VRID** comme élément différenciant. ~~~ +# systemctl cat vrrp-42.service +# /etc/systemd/system/vrrp-42.service [Unit] -Description=VRRP Daemon +Description=VRRP Daemon for IP 192.0.2.10/27 on eno0 After=network.target [Service] -ExecStart=/usr/sbin/vrrpd -i eth0 -x -D -d 10 -v 42 -p 90 -a pw/0xPASSWORD -l foo 192.0.2.42/27 +ExecStart=/usr/sbin/vrrpd -i eno0 -x -D -d 10 -v 42 -p 50 -a pw/0x6574432874316975 -l lan-2-10 192.0.2.10/27 +# PIDFile=/var/run/vrrpd_lan-2-10_42.pid Restart=on-failure Type=forking IgnoreSIGPIPE=no @@ -152,6 +178,37 @@ RemainAfterExit=yes WantedBy=default.target ~~~ +Vous pouvez consulter l'état de l'IP : + +~~~ +# systemctl status vrrp-42 +● vrrp-42.service - VRRP Daemon for IP 192.0.2.10/27 on eno0 + Loaded: loaded (/etc/systemd/system/vrrp-42.service; enabled; vendor preset: enabled) + Active: active (running) since Thu 2023-11-09 22:43:03 CET; 1 weeks 0 days ago + Main PID: 542166 (vrrpd) + Tasks: 1 (limit: 76863) + Memory: 452.0K + CPU: 21.909s + CGroup: /system.slice/vrrp-42.service + └─542166 /usr/sbin/vrrpd -i eno0 -x -D -d 10 -v 42 -p 2 -a XXXXX -l lan-2-10 192.0.2.10 27 +~~~ + +Vous pouvez gérer avec les commandes habituelles `start` et `stop`. + +Vous pouvez consulter les logs via journald : `journalctl -u vrrp-42` + +Pour avoir une vue instantanée d'une IP : + +~~~ +# cat /var/run/vrrpd/vrrp-lan-2-10 +VRRP - lan-2-10 +Group 42 +State is slave +Virtual IP address is 192.0.2.10/27 +~~~ + +Pour changer la priorité du processus il faut modifier l'unité systemd (généralement dans `/etc/systemd/system/vrrp-42.service`), puis `systemctl daemon-reload`, puis `systemctl restart vrrp-42.service`. + ## Plomberie Des paquets IP vont être émis sur l'interface choisie pour annoncer à intervalle régulier que l'on est en état *master*. @@ -165,19 +222,19 @@ Sortie TCPDUMP d'un paquet VRRP émis par le *master* : ~~~ 23:00:50.868137 IP (tos 0x0, ttl 255, id 3328, offset 0, flags [none], proto VRRP (112), length 40) - 198.51.100.1 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 90, authtype simple, intvl 10s, length 20, addrs: 192.0.2.42 auth "PASSWORD" + 198.51.100.1 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 90, authtype simple, intvl 10s, length 20, addrs: 192.0.2.10 auth "PASSWORD" ~~~ ## Logs * Des logs sont envoyés à syslog -* L'historique des changements d'états dans `/var/log/vrrpd/state.$vrid` -* L'état courant se trouve dans /var/run/vrrpd/vrrp-${instance_name} +* L'historique des changements d'états dans `/var/log/vrrpd/state.${vrid}` +* L'état courant se trouve dans `/var/run/vrrpd/vrrp-${instance_name}` * Un fichier PID est dans `/var/run/vrrpd_${instance_name}_${vrid}.pid` ## Bascule d'un serveur à l'autre -Pour faire en sorte que l'adresse IP bascule sur le serveur slave, il suffit de couper vrrpd sur la machine *master*. La machine *slave* détectera alors qu'il est tout seul et prendra l'adresse IP. +Pour faire en sorte que l'adresse IP bascule sur le serveur slave, il suffit de couper vrrpd sur la machine _master_. La machine _slave_ détectera alors qu'il est tout seul et prendra l'adresse IP. ## Générer un mot de passe