SYN, SYN-ACK, ACK …

Steal This Blog

Archives Posts

VMware Server et Virtual Router Redundany Protocol (VRRP)

mars 3rd, 2009 by Corbier

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.

Archives Posts

IP-FailOver Ovh Vmware Server

janvier 23rd, 2009 by Corbier

Lorsque l’on a un serveur dédié on peut être tenté de faire de la virtualisation sur son serveur. Plus OS, facilité des backups etc… Cependant, pour éviter que ce soit trop le bazar sur leur réseau, Ovh a limiter les mac adresse par rapport au port des commutateurs.

Il est donc impossible de communiquer avec un machine qui serait bridger sur l’interface de la machine hôte. Pour pallier à ça il est possible de mettre ses machines virtuelles en mode HostOnly. Il suffit ensuite d’activer le routage et le snat sur le linux .

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Mais cela pose problème si l’on souhaite utiliser des ip public. Il faut donc feinter.

Tout d’abord ovh propose d’utiliser des IpFailOver afin de faire « pointer » plusieurs ip public sur le même serveur. Comme les mac adresses sont bloquées par port, il faut utiliser le proxy_arp de linux afin de réussir cette configuration.

L’idée est donc d’utiliser des ips public que l’on a acheter à ovh pour des machines virtuelles. Il faut donc configurer une interface réseau vmware en hostonly. Dans ma configuration c’est vmnet1. Activons maintenant le proxy_arp sur l’interface vmware.

echo 1 > /proc/sys/net/ipv4/conf/vmnet1/proxy_arp

Je vous laisse consulter la page suivante pour avoir plus d’information sur le fonctionnement d’un proxy arp.

Ensuite il faut ajouter une route à destination de ip_suplémentaire pour que la machine hote puisse savoir à quel interface envoyer le paquet.

route add ip_supplémentaire dev vmnet1

Il ne vous reste plus qu’a configurer votre machine virtuelle avec l’adresse suplémentaire. Avec un masque de sous réseau 255.255.255.255 pour pouvoir communiquer avec les machines de votre subnet.

Cependant attention le trafic à destination de votre machine virtuel passe par la table filter-forward d’iptables il vous faut évidement configurer les protocoles que vous souhaiter router.

Filed under Non classé having No Comments »