152 lines
5.2 KiB
Markdown
152 lines
5.2 KiB
Markdown
---
|
||
categories: openbsd network
|
||
title: Howto CARP sous OpenBSD
|
||
---
|
||
|
||
CARP est un protocol réseau qui se veut être une alternative libre et
|
||
sécurisée aux protocoles [VRRP](https://www.ietf.org/rfc/rfc3768.txt)
|
||
et [HSRP](https://www.ietf.org/rfc/rfc2281.txt). Il permet de partager
|
||
une adresse IP sur plusieurs machines d'un même réseau.
|
||
|
||
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.
|
||
|
||
En plus de la man page
|
||
[carp(4)](http://man.openbsd.org/OpenBSD-current/man4/carp.4), la FAQ
|
||
d'OpenBSD comporte une
|
||
[section spécialement pour CARP](https://www.openbsd.org/faq/pf/carp.html).
|
||
|
||
## 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 important 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 : pendant un certain temps, il va toujours rester en BACKUP
|
||
pour voir si il ne reçoit pas d'annonce d'un MASTER. Ce comportement
|
||
est aussi présent lors de la (re)configuration même si le CARP était
|
||
master initialement.
|
||
S'il n'a rien reçu, il passe en MASTER. Ce temps est d'attente
|
||
correspond à la valeur du paramètre _advbase_ (par défaut à 1 seconde).
|
||
|
||
Conséquences de cela :
|
||
|
||
* Si on reconfigure une interface CARP MASTER, elle va passer en
|
||
BACKUP pendant _advbase_ secondes ! Il est donc judicieux avant
|
||
d'intervenir sur une machine qui est CARP MASTER, de vérifier et si
|
||
besoin ajuster le paramètre _advbase_ à une valeur très faible.
|
||
|
||
* Si on redémarre 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 lorsque le réseau sera activera
|
||
il y aura donc un conflit entre les deux MASTER. Il faut donc bien
|
||
ajuster _advbase_ pour qu'il soit bien supérieur au temps d'arrivée
|
||
du réseau. Une manière de faire est d'avoir 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](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
|
||
|
||
On peut avoir des statistiques en utilisant netstat(1)
|
||
|
||
~~~
|
||
$ 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
|
||
~~~
|