SwordArMor

CARP IPv6 avec FreeBSD

Introduction

CARP est un protocole permettant à plusieurs machines de partager une même adresse IP sur un segment IP. Chez grifon nous l’utilisons entre nos deux routeurs afin d’être tolérant à leurs pannes.
Nous mettons une IP en gateway sur les machines de nos adhérents (89.234.186.1 en IPv4, fe80::240:092:100::1 en IPv6) et elles se baladent toutes seules entre les routeurs en cas de panne de l’un d’eux.
C’est un protocole master/slave, c’est à dire que les deux routeurs ne peuvent pas être master en même temps. Seul l’un des deux sert de passerelle à tout le monde à un moment donné.

Nous utilisons toujours FreeBSD pour nos routeurs, je vais donc ici parler de l’utilisation de CARP avec FreeBSD. Nous avions déjà une configuration CARP en IPv4, en voulant mettre de l’IPv6 en plus en suivant la même méthode ça a juste tout cassé. Il y a deux/trois subtilités que je vais expliquer.

Configuration basique

Afin de pouvoir reprendre la main sur les routeurs, il nous faut un IP sur chaque en plus de celle que nous allons avoir en CARP :

hostname="nominoe.grifon.fr"
# LAN
ifconfig_em1="inet 89.234.186.7 netmask 255.255.255.128"
ifconfig_em1_ipv6="inet6 2a00:5884::1/64"
hostname="budic.cogent-rns.grifon.fr"
# LAN
ifconfig_re1="inet 89.234.186.6 netmask 255.255.255.128"
ifconfig_re1_ipv6="inet6 2a00:5884::6/64"
Ce qui nous donne cette configuration sur chaque routeur :
alarig@nominoe:~ % ifconfig em1
em1: flags=8943 metric 0 mtu 1500
	options=4019b
	ether 00:15:17:39:f0:1b
	inet 89.234.186.7 netmask 0xffffff80 broadcast 89.234.186.127 
	inet6 fe80::215:17ff:fe39:f01b%em1 prefixlen 64 scopeid 0x2 
	inet6 2a00:5884::1 prefixlen 64 
	nd6 options=21
	media: Ethernet autoselect (100baseTX )
	status: active
alarig@budic:~ % ifconfig re1
re1: flags=8943 metric 0 mtu 1500
	options=8209b
	ether 00:0d:b9:3a:24:b9
	inet 89.234.186.6 netmask 0xffffff80 broadcast 89.234.186.127
	inet6 fe80::20d:b9ff:fe3a:24b9%re1 prefixlen 64 scopeid 0x2
	inet6 2a00:5884::6 prefixlen 64
	nd6 options=21
	media: Ethernet autoselect (100baseTX )
	status: active

CARP IPv6

Nous allons maintenant ajouter une adresse IPv6 en mode CARP. vhid 2 correspond au numéro de groupe vituel ; advskew 10 correspond à la priorité, plus le chiffre est élevé, plus elle est faible ; pass passwdv6 correspond au mot de passe pour authentifier le paquet CARP.

hostname="nominoe.grifon.fr"
# LAN
ifconfig_em1="inet 89.234.186.7 netmask 255.255.255.128"
ifconfig_em1_ipv6="inet6 2a00:5884::1/64"

# CARP
ifconfig_em1_alias0="inet6 fe80::204:092:100:1/64 vhid 2 advskew 1 pass passv6"
hostname="budic.cogent-rns.grifon.fr"
# LAN
ifconfig_re1="inet 89.234.186.6 netmask 255.255.255.128"
ifconfig_re1_ipv6="inet6 2a00:5884::6/64"

# CARP
ifconfig_re1_alias0="inet6 fe80::204:092:100:1/64 vhid 2 advskew 10 pass passv6"

Nous redémarrons ensuite les interfaces :

root@nominoe:~ % service netif restart em1
root@budic:~ % service netif restart re1

Ce qui nous donne ceci :

alarig@nominoe:~ % ifconfig em1
em1: flags=8943 metric 0 mtu 1500
	options=4019b
	ether 00:15:17:39:f0:1b
	inet 89.234.186.7 netmask 0xffffff80 broadcast 89.234.186.127
	inet6 fe80::215:17ff:fe39:f01b%em1 prefixlen 64 scopeid 0x2
	inet6 2a00:5884::1 prefixlen 64
	inet6 fe80::204:92:100:1%em1 prefixlen 64 scopeid 0x2 vhid 2
	nd6 options=21
	media: Ethernet autoselect (100baseTX )
	status: active
	carp: MASTER vhid 2 advbase 1 advskew 1
alarig@budic:~ % ifconfig re1
re1: flags=8943 metric 0 mtu 1500
	options=8209b
	ether 00:0d:b9:3a:24:b9
	inet 89.234.186.6 netmask 0xffffff80 broadcast 89.234.186.127 
	inet6 fe80::20d:b9ff:fe3a:24b9%re1 prefixlen 64 scopeid 0x2 
	inet6 2a00:5884::6 prefixlen 64 
	inet6 fe80::204:92:100:1%re1 prefixlen 64 scopeid 0x2 vhid 2 
	nd6 options=21
	media: Ethernet autoselect (100baseTX )
	status: active
	carp: BACKUP vhid 2 advbase 1 advskew 10

CARP IPv4

Et c’est là où c’est subtil, c’est qu’en IPv4 il faut ajouter alias et avoir un numéro d’alias d’interface différent. Aussi, on avait le même mot de passe en IPv4 et en IPv6 avant, je ne sais pas si le fait d’en avoir un différent a changé les choses ou pas, dans le doute je le garde. On a aussi inversé l’ordre IPv4/IPv6 dans la conf (avant l’IPv4 était configuré en premier).

hostname="nominoe.grifon.fr"
# LAN
ifconfig_em1="inet 89.234.186.7 netmask 255.255.255.128"
ifconfig_em1_ipv6="inet6 2a00:5884::1/64"

# CARP
ifconfig_em1_alias0="inet6 fe80::204:092:100:1/64 vhid 2 advskew 1 pass passv6"
ifconfig_em1_alias1="inet vhid 1 advskew 1 pass passv4 alias 89.234.186.1/32"
hostname="budic.cogent-rns.grifon.fr"
# LAN
ifconfig_re1="inet 89.234.186.6 netmask 255.255.255.128"
ifconfig_re1_ipv6="inet6 2a00:5884::6/64"

# CARP
ifconfig_re1_alias0="inet6 fe80::204:092:100:1/64 vhid 2 advskew 10 pass passv6"
ifconfig_re1_alias1="inet vhid 1 advskew 10 pass passv4 alias 89.234.186.1/32"

Nous redémarrons ensuite les interfaces :

root@nominoe:~ % service netif restart em1
root@budic:~ % service netif restart re1

Ce qui nous donne ceci :

alarig@nominoe:~ % ifconfig em1
em1: flags=8943 metric 0 mtu 1500
	options=4019b
	ether 00:15:17:39:f0:1b
	inet 89.234.186.7 netmask 0xffffff80 broadcast 89.234.186.127
	inet6 fe80::215:17ff:fe39:f01b%em1 prefixlen 64 scopeid 0x2
	inet6 2a00:5884::1 prefixlen 64
	inet 89.234.186.1 netmask 0xffffffff broadcast 89.234.186.1 vhid 1
	inet6 fe80::204:92:100:1%em1 prefixlen 64 scopeid 0x2 vhid 2
	nd6 options=21
	media: Ethernet autoselect (100baseTX )
	status: active
	carp: MASTER vhid 1 advbase 1 advskew 1
	carp: MASTER vhid 2 advbase 1 advskew 1
alarig@budic:~ % ifconfig re1
re1: flags=8943 metric 0 mtu 1500
	options=8209b
	ether 00:0d:b9:3a:24:b9
	inet 89.234.186.6 netmask 0xffffff80 broadcast 89.234.186.127
	inet 89.234.186.1 netmask 0xffffffff broadcast 89.234.186.1 vhid 1
	inet6 fe80::20d:b9ff:fe3a:24b9%re1 prefixlen 64 scopeid 0x2
	inet6 2a00:5884::6 prefixlen 64
	inet6 fe80::204:92:100:1%re1 prefixlen 64 scopeid 0x2 vhid 2
	nd6 options=21
	media: Ethernet autoselect (100baseTX )
	status: active
	carp: BACKUP vhid 1 advbase 1 advskew 10
	carp: BACKUP vhid 2 advbase 1 advskew 10

Conclusion

Alors, pourquoi il faut des subtilités en IPv4 quand on met de l’IPv6 en plus, ça je ne sais pas… Mais une fois qu’on l’accepte, ça marche bien. Ceci dit, si quelqu’un a une explication je suis preneur.

Voici les docs que j’ai utilisé pour faire marcher tout ça. La doc OpenBSD est plus pour comprendre le protocole, l’implémentation est différente sous FreeBSD.