129 lines
4.7 KiB
Markdown
129 lines
4.7 KiB
Markdown
---
|
||
categories: openbsd network
|
||
title: 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](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
|
||
~~~
|