Configuration avec VLAN

Quand plusieurs projets se retrouvent virtualisés sur le même hyperviseur, pour ajouter plus de sécurité en isolant les réseaux, bref faire comme c'est fait en "physique" habituellement, il faut passer par des VLAN. Cela permet de découper un switch en plusieurs réseaux isolés, pour ceux qui ne connaîtraient pas cette norme. Donc en gros avec les VLAN, il est possible de faire des réseaux virtuels sur notre switch virtuel br0. Chacun de ces réseaux dits virtuels aura un identifiant (de 1 à 4095). C'est ce numéro qui est souvent appelé VLAN par abus de langage. Du moment que 2 interfaces réseaux se trouvent sur le même VLAN elles pourront communiquer. Simple non?

Configuration manuelle

La première possibilité qui vient à l'esprit est d'ajouter manuellement le VLAN après que la VM soit lancée. Avec l'exemple de configuration cité plus haut, la carte réseau de la VM sera automatiquement branchée sur notre br0 OpenVswitch. La partie visible sur l'hyperviseur de cette carte réseau "virtuelle" est un périphérique de type tap. Le nom de ce tap est configurable dans la libvirt ainsi que dans le fichier XML de la VM. Par défaut il sera préfixé vnet et suffixé par un identifiant numérique. Admettons que notre VM soit la seule de l'hyperviseur, logiquement il y aura donc un tap "vnet0" (vu comme port et interface) dans notre br0. Voyons voir:

[root@hyperviseur01 ~]# ovs-vsctl show
c5f92e84-adaa-4b87-beac-c7f6c8129a7c
    Bridge "br0"
        Port "vnet0"
            Interface "vnet0"
        Port "br0"
            Interface "br0"
                type: internal
    ovs_version: "2.4.0"
Il y est donc maintenant possible d'associer un numéro de VLAN à ce port "vnet0", par ex le VLAN 99:
[root@hyperviseur01 ~]# ovs-vsctl set port vnet0 tag=99
[root@hyperviseur01 ~]# ovs-vsctl show
c5f92e84-adaa-4b87-beac-c7f6c8129a7c
    Bridge "br0"
        Port "vnet0"
            tag: 99
            Interface "vnet0"
        Port "br0"
            Interface "br0"
                type: internal
    ovs_version: "2.4.0"
Ensuite si nous démarrons une 2e VM, et qu'on associe son vnet1 au VLAN 99 par la même méthode, si la configuration IP dans ces VMs est correcte (même réseau IP), elles pourrons communiquer !

Configuration via la libvirt

La méthode manuelle fonctionne mais il y a encore mieux, en indiquant la configuration VLAN dans le fichier XML de la VM. Pour cela il suffit d'ajouter le bloc suivant dans le bloc de notre interface réseau virtuelle:
<vlan>
   <tag id='99'/>
</vlan>

Il est aussi possible de définir plusieurs VLAN en utilisant la balise trunk et non tag. Mais il faudra du coup "tagguer" vos interfaces dans l'OS de la VM. Classique quand il faut utiliser plusieurs VLAN. Mais quand un seul VLAN est utilisé, un seul tag, il s'agit d'un "access port", et il n'y a rien à faire de particuler dans l'OS de la VM.

Je décrirais peut être plus tard dans un autre billet une méthode plus répandue mais que je trouve plus contraignante qui passe toujours par la libvirt mais via la configuration d'un réseau/switch virtuel (notre br0) dans lequel il est possible de définir des portgroups. C'est au niveau des portgroups du switch qu'il faut définir les VLANs. Ensuite dans la configuration de la VM il faut la relier à ces portgroups. C'est moins direct vu qu'il faut modifier deux fichiers de configuration, mais ça rajoute une couche d'abstraction qui dans certains cas peut être utile.

En attendant, voici le bloc complet de configuration de l'interface réseau de ma VM:

<interface type='bridge'>
    <mac address='52:54:00:06:7e:aa'/>
    <source bridge='br0'/>
    <vlan>
        <tag id='99'/>
    </vlan>
    <virtualport type='openvswitch'/>
    <model type='virtio'/>
</interface>

Et voici l 'état de mon br0 après avoir démarrer 2 VMs:

[root@hyperviseur01 ~]# ovs-vsctl show
c5f92e84-adaa-4b87-beac-c7f6c8129a7c
    Bridge "br0"
        Port "vnet0"
            tag: 99
            Interface "vnet0"
        Port "br0"
            Interface "br0"
                type: internal
        Port "vnet1"
            tag: 99
            Interface "vnet1"
    ovs_version: "2.4.0"

Voilà, les 2 VMs étant sur le VLAN 99 elles communiquent bien ensemble.