2017-01-20 11:17:20 +01:00
|
|
|
|
---
|
|
|
|
|
categories: openbsd network
|
|
|
|
|
title: Howto CARP sous OpenBSD
|
|
|
|
|
---
|
2016-12-29 11:25:39 +01:00
|
|
|
|
|
2017-03-09 18:00:40 +01:00
|
|
|
|
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.
|
|
|
|
|
|
2016-12-29 11:25:39 +01:00
|
|
|
|
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.
|
|
|
|
|
|
2017-03-09 17:54:02 +01:00
|
|
|
|
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).
|
2017-03-09 17:15:19 +01:00
|
|
|
|
|
2016-12-29 11:25:39 +01:00
|
|
|
|
## Création manuelle
|
|
|
|
|
|
|
|
|
|
Sur le MASTER :
|
|
|
|
|
|
|
|
|
|
~~~
|
2017-01-03 23:04:06 +01:00
|
|
|
|
# sysctl net.inet.carp.allow=1 && echo "net.inet.carp.allow=1" >> /etc/sysctl.conf
|
2016-12-29 11:25:39 +01:00
|
|
|
|
# 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 :
|
|
|
|
|
|
|
|
|
|
~~~
|
2017-01-03 23:04:06 +01:00
|
|
|
|
# sysctl net.inet.carp.allow=1 && echo "net.inet.carp.allow=1" >> /etc/sysctl.conf
|
2016-12-29 11:25:39 +01:00
|
|
|
|
# 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
|
2017-03-09 17:18:27 +01:00
|
|
|
|
~~~
|
2016-12-29 11:25:39 +01:00
|
|
|
|
|
|
|
|
|
ou
|
|
|
|
|
|
2017-03-09 17:18:27 +01:00
|
|
|
|
~~~
|
2016-12-29 11:25:39 +01:00
|
|
|
|
# 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
|
2017-01-03 23:23:24 +01:00
|
|
|
|
que le SLAVE va immédiatemment passer MASTER. Ce paquet peut être observé avec `tcpdump proto carp`
|
2016-12-29 11:25:39 +01:00
|
|
|
|
|
2017-01-20 11:17:20 +01:00
|
|
|
|
Note : avec `ifconfig carp0 down` nous avons eu parfois des soucis de bascule non immédiate,
|
2016-12-29 11:25:39 +01:00
|
|
|
|
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
|
|
|
|
|
|
2017-03-09 17:47:01 +01:00
|
|
|
|
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).
|
2016-12-29 11:25:39 +01:00
|
|
|
|
|
|
|
|
|
Conséquences de cela :
|
2017-01-20 11:17:20 +01:00
|
|
|
|
|
2017-03-09 17:47:01 +01:00
|
|
|
|
* 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
|
2017-03-09 17:49:12 +01:00
|
|
|
|
du réseau. Une manière de faire est d'avoir une configuration en
|
2017-03-09 17:47:01 +01:00
|
|
|
|
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é.
|
2016-12-29 11:25:39 +01:00
|
|
|
|
|
|
|
|
|
## 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é.
|
|
|
|
|
|
2017-01-03 23:25:19 +01:00
|
|
|
|
Pour la création d'un VLAN, voir [VLAN](VLAN)
|
2016-12-29 11:25:39 +01:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# cat /etc/hostname.bnx0
|
|
|
|
|
up
|
2017-01-20 11:17:20 +01:00
|
|
|
|
|
2016-12-29 11:25:39 +01:00
|
|
|
|
# cat /etc/hostname.vlan42
|
2017-01-20 11:17:20 +01:00
|
|
|
|
vlandev bnx0 description "VLAN42"
|
|
|
|
|
|
2016-12-29 11:25:39 +01:00
|
|
|
|
# cat /etc/hostname.carp0
|
|
|
|
|
192.0.2.30/27 carpdev vlan42 pass PASSWORD vhid 1 advskew 128
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
## Stats
|
|
|
|
|
|
2017-03-09 17:29:48 +01:00
|
|
|
|
On peut avoir des statistiques en utilisant netstat(1)
|
|
|
|
|
|
2016-12-29 11:25:39 +01:00
|
|
|
|
~~~
|
2017-03-09 17:29:48 +01:00
|
|
|
|
$ netstat -sp carp
|
2016-12-29 11:25:39 +01:00
|
|
|
|
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
|
|
|
|
|
~~~
|