Vxlan

De Wiki doc


Virtual Extensible LAN (VXLAN) est un protocole réseau utilisant UDP permettant de transporter du trafic Ethernet au-dessus d’un réseau IP existant. Sa particularité est de pouvoir transporter plusieurs réseaux isolés les uns des autres dans des tunnels identifiés par des VXLAN Network Identifier (VNI). Ce protocole a été mis au point pour combler les lacunes du protocole 802.1Q appliqué aux concepts de Software Defined Networking (SDN). Contrairement aux VLAN, codés sur les 16 premiers bits des 4 octets de l'entête 802.1Q et donc limités à 4096 étiquettes, les VNI sont codés sur 24 bits, ce qui autorise 16 777 216 étiquettes.

INFORMATION

Chaque terminaisons d'un tunnel VXLAN s'appel un VXLAN tunnel endpoint (VTEP).

Pour parler plus fonctionnel, ce protocole permet de transformer un port Ethernet de niveau 3 en port de commutateur de niveau 2, le tous relié par un câble virtuel aux différents points du tunnel afin de faire communiquer par commutation de trame l'ensemble des machines connectés à ces ports. On fait un méga commutateur virtuel traversant les réseaux IP en quelque sorte.

Éléments utilisés dans cette documentation

Afin de pouvoir reproduire le fonctionnement énoncé, il vous faudra au minimum un noyau Linux 3.12. Les commandes de ce document proviennent des paquets iproute2 pour la création des tunnels VXLAN et bridge-utils pour la création des ponts réseaux permettant l'intégration des ports physiques dans les tunnels. Le tout fonctionne sur des machines KVM Debian 9 via GNS3. Bien entendu, libre à vous de faire votre propre réseau, ceci n'étant qu'un exemple basique.

Infrastructure utilisé

Schéma-VXLAN.png

Sur le schéma proposé, les machines PC-1; PC-2 et PC-3 communiquent ensembles via le VXLAN 100 tandis que les machines PC-3; PC-4 et PC-6 via le VXLAN 101. Je leur aient toutes attribuées une adresse dans le réseau 192.168.1.0/24 afin de bien montrer qu'une machine dans un VXLAN est isolé d'une autre dans un VXLAN différent malgré leur appartenance au même sous réseau.

Contenu du LAB de test

  • GNS3
  • Un disque qcow2 avec une Debian Stretch (9)
  • les utilitaires iproute2 et bridge-utils
  • 6 MV exploitant une copie du disque qcow2 ainsi que 3 interfaces réseaux par machines
  • J'ai utilisé un commutateur IOU mais le commutateur disponible de base dans GNS3 aurai très bien fait l'affaire
  • 6 VPCS servant de clients pour effectuer les PING

Notez que l'on aurai très bien pu faire tout ça avec 1 MV et 2 VPCS en moins.

Mise en place

Unicast avec déclaration statique des VTEP

R1

# Configuration des interfaces
ip a a 1.1.1.1/29 dev eth0
ip l set eth0 up
ip l set eth1 up
ip l set eth2 up

##### Partie VXLAN 100 #####
# Création d'un VTEP pour le VXLAN 100
ip link add vxlan100 type vxlan id 100 dstport 4789 local 1.1.1.1

# Déclaration des VTEP distants
bridge fdb append 00:00:00:00:00:00 dev vxlan100 dst 1.1.1.2
bridge fdb append 00:00:00:00:00:00 dev vxlan100 dst 1.1.1.3
# Info: pour que le tunnel fonctionne, il n'est pas nécessaire de déclarer les VTEP distants sur tout les routeurs. Un seul suffit mais c'est obligatoirement une machine connecté à celui-ci qui devra initier la connexion en envoyer le premier paquet (en fait le VTEP d'en face va apprendre de lui même l'identité du VTEP qui lui parle au moment de l'envoi du paquet. Ça évite de ce retrouver avec des conf usine à gaz quand on a une centaines de routeurs).

# Création du pont et ajout des interfaces devants faire partie du VXLAN 100
brctl addbr br100
brctl addif br100 vxlan100
brctl addif br100 eth1

# Désactivation du spanning tree (les VTEP étant du point à point, aucune boucle ne peut être formée par ce biais)
brctl stp br100 off
ip link set up dev br100
ip link set up dev vxlan100

##### Partie VXLAN 101 #####
ip link add vxlan101 type vxlan id 101 dstport 4789 local 1.1.1.1

bridge fdb append 00:00:00:00:00:00 dev vxlan101 dst 1.1.1.2
bridge fdb append 00:00:00:00:00:00 dev vxlan101 dst 1.1.1.3

brctl addbr br101
brctl addif br101 vxlan101
brctl addif br101 eth2

brctl stp br101 off
ip link set up dev br101
ip link set up dev vxlan101

R2

ip a a 1.1.1.2/29 dev eth0
ip l set eth0 up
ip l set eth1 up
ip l set eth2 up

ip link add vxlan100 type vxlan id 100 dstport 4789 local 1.1.1.2

bridge fdb append 00:00:00:00:00:00 dev vxlan100 dst 1.1.1.1
bridge fdb append 00:00:00:00:00:00 dev vxlan100 dst 1.1.1.3

brctl addbr br100
brctl addif br100 vxlan100
brctl addif br100 eth1
#brctl addif br100 vnet25
brctl stp br100 off
ip link set up dev br100
ip link set up dev vxlan100

ip link add vxlan101 type vxlan id 101 dstport 4789 local 1.1.1.2

bridge fdb append 00:00:00:00:00:00 dev vxlan101 dst 1.1.1.1
bridge fdb append 00:00:00:00:00:00 dev vxlan101 dst 1.1.1.3

brctl addbr br101
brctl addif br101 vxlan101
brctl addif br101 eth2

brctl stp br101 off
ip link set up dev br101
ip link set up dev vxlan101

R3

ip a a 1.1.1.3/29 dev eth0
ip l set eth0 up
ip l set eth1 up
ip l set eth2 up
ip link add vxlan100 type vxlan id 100 dstport 4789 local 1.1.1.3

bridge fdb append 00:00:00:00:00:00 dev vxlan100 dst 1.1.1.1
bridge fdb append 00:00:00:00:00:00 dev vxlan100 dst 1.1.1.2

brctl addbr br100
brctl addif br100 vxlan100
brctl addif br100 eth1

brctl stp br100 off
ip link set up dev br100
ip link set up dev vxlan100

ip link add vxlan101 type vxlan id 101 dstport 4789 local 1.1.1.3

bridge fdb append 00:00:00:00:00:00 dev vxlan101 dst 1.1.1.1
bridge fdb append 00:00:00:00:00:00 dev vxlan101 dst 1.1.1.2

brctl addbr br101
brctl addif br101 vxlan101
brctl addif br101 eth2

brctl stp br101 off
ip link set up dev br101
ip link set up dev vxlan101

Visualisation

Des informations sur le tunnel en place sont disponibles via les commandes:

ip -d link show vxlan100
bridge fdb show dev vxlan100

Sources