Selon Wikipédia :
Virtual Router Redundancy Protocol (protocole de redondance de routeur virtuel, VRRP) est un protocole non propriétaire redondant décrit dans la RFC 3768 dont le but est d’augmenter la disponibilité de la passerelle par défaut servant les hôtes d’un même sous-réseau.
Le fonctionnement de VRRP est le suivant :
Chaque Routeur Virtuel utilise une adresse mac de l’IANA ces adresses mac sont réversées et vont de 00:00:5e:00:01:00 à 00:00:5e:00:01:ff (on peut donc avoir 256 routeurs virtuels par segment Ethernet)
Les routeurs communiquent entre eux via l’adresse multicast réservée 224.0.0.18 associé à la mac réservé 00:00:5e:00:01:02
Comme l’indique le paquet capturé suivant :
Frame 6 (70 bytes on wire, 70 bytes captured)
Ethernet II, Src: IETF-VRRP-virtual-router-VRID_02 (00:00:5e:00:01:02), Dst: IPv4mcast_00:00:12 (01:00:5e:00:00:12)
Internet Protocol, Src: 192.168.130.160 (192.168.130.160), Dst: 224.0.0.18 (224.0.0.18)
Virtual Router Redundancy Protocol
Afin d’utiliser une IP virtuelle associés a plusieurs routeurs nous utilisons le Common Address Redundancy Protocol ou CARP.
Selon wikipédia :
Common Address Redundancy Protocol ou CARP est un protocole permettant à un groupe d’hôtes sur un même segment réseau de partager une adresse IP.
Dans le cadre de préparation de labs, j’ai voulu émulé l’ensemble de via une solution freebsd (Pfsense) sous VMware Server. Cependant l’adresse virtuel CARP ne pouvait pas être utilisé. Les réponses ARP était bien présente mais le ping et tout les autres services était indisponible.
Le module kernel vmnet drop tout les paquets ethernet que ne sont pas à destination :
- d’elle même
- d’une addresse de broadcast FF:FF:FF:FF:FF:FF
- d’une addresse de multicast
Cependant le bloc de IANA est manquant !!!Les packets sont donc droppés.
Afin de valider et corriger le module noyau, il faut éditer le driver.c contenu dans /usr/lib/vmware/modules/source
Le fichier qui nous intéresse est dans l’archive vmnet.tar. Il faut extraire cette archive.
tar xvf vmnet.tar
cd vmnet-only
Ensuite nous devons localiser la fonction VNetPacketMatch qui est responsable du matching de paquet.
*
*———————————————————————-
*
* VNetPacketMatch –
*
* Determines whether the packet should be given to the interface.
*
* Results:
* TRUE if the pasket is OK for this interface, FALSE otherwise.
*
* Side effects:
* None.
*
*———————————————————————-
*/
Bool
VNetPacketMatch(const uint8 *destAddr, // IN: destination MAC
const uint8 *ifAddr, // IN: MAC of interface
const uint8 *ladrf, // IN: multicast filter
uint32 flags) // IN: filter flags
{
/*
* Return TRUE if promiscuous requested, or unicast destined
* for interface, or broadcast (and broadcast requested), or
* if multicast (and all multicast, or this specific
* multicast MAC, was requested).
*/
return ((flags & IFF_PROMISC) || MAC_EQ(destAddr, ifAddr) ||
((flags & IFF_BROADCAST) && MAC_EQ(destAddr, broadcast)) ||
((destAddr[0] & 0×1) && (flags & IFF_ALLMULTI ||
(flags & IFF_MULTICAST &&
VNetMulticastFilter(destAddr, ladrf)))));
}
Il faut ajouter les lignes suivantes ajoutant le support des paquets de IANA :
((destAddr[0] == 0) && (destAddr[1] == 0) &&
(destAddr[2] == 0x5e) && (destAddr[3] == 0) &&
(destAddr[4] == 1))
Ce qui nous donne la fonction suivante :
return ((flags & IFF_PROMISC) || MAC_EQ(destAddr, ifAddr) ||
((flags & IFF_BROADCAST) && MAC_EQ(destAddr, broadcast)) ||
((destAddr[0] == 0) && (destAddr[1] == 0) &&
(destAddr[2] == 0x5e) && (destAddr[3] == 0) &&
(destAddr[4] == 1)) ||
((destAddr[0] & 0×1) && (flags & IFF_ALLMULTI ||
(flags & IFF_MULTICAST &&
VNetMulticastFilter(destAddr, ladrf)))));
Sauvegardez et recompilez le module :
make vmnet.ko
Il nous reste à copié le nouveau module au bon endroit
cp vmnet.ko /lib/modules/`uname -r`/misc/vmnet.ko
/etc/init.d/vmware restart
Nous avons désormais un VMware Server fonctionnelle.