wiki/HowtoOpenBSD/CARP.md

4.7 KiB

categories title
openbsd network Howto CARP sous OpenBSD

http://www.openbsd.org/faq/pf/carp.html

Le principe est d'avoir une interface sur 2 machines (ou plus). Cette interface est configurée pour être dans un état MASTER ou SLAVE. L'interface MASTER émet régulièrement des paquets à destination du SLAVE pour prouver qu'elle fonctionne bien. Le choix SLAVE/MASTER est effectué grâce à des priorités configurables. Si le SLAVE ne reçoit pas un paquet dans les temps (ou qu'il reçoit un paquet inférieur à sa priorité), il passera MASTER.

Création manuelle

Sur le MASTER :

# sysctl net.inet.carp.allow=1 && echo "net.inet.carp.allow=1" >> /etc/sysctl.conf
# ifconfig carp0 create
# ifconfig carp0 vhid 1 pass PASSWORD carpdev bnx0 \
    advskew 1 192.0.2.30 netmask 255.255.255.224

Sur le SLAVE :

# sysctl net.inet.carp.allow=1 && echo "net.inet.carp.allow=1" >> /etc/sysctl.conf
# ifconfig carp0 create
# ifconfig carp0 vhid 1 pass PASSWORD carpdev bnx0 \
    advskew 128 192.0.2.30 netmask 255.255.255.224

Création définitive

Sur le MASTER :

# cat /etc/hostname.carp0
192.0.2.30/27 carpdev bnx0 pass PASSWORD vhid 1 advskew 1

Sur le SLAVE :

# cat /etc/hostname.carp0
192.0.2.30/27 carpdev bnx0 pass PASSWORD vhid 1 advskew 128

Bascule CARP

Pour des raisons de maintenance, on peut vouloir forcer une bascule CARP. Pour faire cela, sur le master, on peut faire :

# ifconfig carp0 down

ou

# ifconfig -g carp carpdemote 50

Normalement, le master va générer un paquet CARP avec la priorité 255 ce qui doit avoir comme conséquence que le SLAVE va immédiatemment passer MASTER. Ce paquet peut être observé avec tcpdump proto carp

Note : avec ifconfig carp0 down nous avons eu parfois des soucis de bascule non immédiate, on recommande donc d'observer ce qui se passer avec tcpdump proto carp et éventuellement de privilégier la bascule via carpdemote qui semblerait plus sûre (à confirmer).

Optimisation CARP au (re)boot d'un BACKUP

Lorsque que l'on a un firewall en BACKUP, il est "agréable" de pouvoir le redémarrer sans que cela n'impacte le MASTER. Pour cela, il faut bien comprendre le comportement de CARP au démarrage (c'est valable aussi quand on le configure manuellement… ou même reconfigure… même si il est MASTER !!) : pendant un certain temps, il va toujours rester en BACKUP pour voir si il ne reçoit pas d'annonce d'un MASTER. Si il n'a rien reçu, il passe en MASTER. Pour ce temps est d'attente, il va utiliser sa valeur advbase (par défaut à 1 seconde !).

Conséquences de cela :

  • Si vous reconfigurez une interface CARP MASTER, elle va passer en BACKUP pendant advbase secondes !

=> Conseil : si vous intervenez en prod sur un CARP MASTER, mettez manuellement une valeur d'advbase faible (1 à 5 secondes)

  • Si vous redémarrez une machine avec des CARP BACKUP, il est probable que son réseau ne soit pas opérationnel immédiatement (synchronisation Spanning Tree qui prend 50 secondes par défaut sur un switch CISCO par exemple) : l'interface va donc se déclarer en MASTER après son temps d'attente, et c'est très embêtant si vous faites du firewalling à état ! Il faut donc bien ajuster advbase pour qu'il soit bien supérieur au temps d'arrivée du réseau. On peut même imaginer avec une configuration en dur avec advbase à 60 secondes par exemple, ce qui permet d'avoir des reboots transparents, puis on reconfigure manuellement advbase à 10 secondes par exemple quand tout est redémarré.

Création d'une interface CARP dans un VLAN

On peut rattacher une interface CARP à une interface VLAN. L'instance carp0 sera alors isolée dans le VLAN auquel il est rattaché.

Pour la création d'un VLAN, voir VLAN

# cat /etc/hostname.bnx0
up

# cat /etc/hostname.vlan42
vlandev bnx0 description "VLAN42"

# cat /etc/hostname.carp0
192.0.2.30/27 carpdev vlan42 pass PASSWORD vhid 1 advskew 128

Stats

# netstat -sp carp
carp:
        1816636 packets received (IPv4)
        684123 packets received (IPv6)
                0 packets discarded for bad interface
                0 packets discarded for wrong TTL
                0 packets shorter than header
                0 discarded for bad checksums
                0 discarded packets with a bad version
                1293450 discarded because packet too short
                2 discarded for bad authentication
                482883 discarded for unknown vhid
                0 discarded because of a bad address list
        9667 packets sent (IPv4)
        5792 packets sent (IPv6)
                0 send failed due to mbuf memory error
        35 transitions to master