28 mars 2024

Tuto Virtualisation avec KVM, partie IV : VLANs

Dans cette quatrième partie de la série sur KVM, , nous allons continuer un peu sur le réseau et mettre en place des VLANs.

 

I – Explication

Je gère mes réseaux ainsi :

Une VM routeur avec une ip « externe » sur le bridge et plusieurs ips sur plusieurs réseaux internes :

Un premier réseau 10.10.1.0/24 qui est utilisé pour les communications Extérieur -> VMs (frontal web, postfix, vpn, etc…) et aussi pour les communications VMs -> extérieur (mise à jour, etc…).

Les VMs pour communiquer entres elles utilisent un réseau 10.20.1.0/24. Par exemple, frontal web vers serveurs backweb, postfix vers ldap, serveur divers vers stockage en cluster…

Bon, techniquement, j’utilise encore un autre réseau pour l’intercommunication dans les clusters, mais ce n’est pas le sujet du jour.

Et pour terminer, pour les communications Hyperviseur – VMs (ssh, ntp, etc..), j’utilise encore un autre réseau, le 10.99.1.0/24

Compliqué ? Oui, mais utile (facilite grandement le traitement avec Netflow, Ipfix, etc…, mais on reviendra plus tard sur cela dans une autre série d’articles.

Et pour gérer tout cela, au lieu de monter un nouveau bridge par réseau, on va simplement utiliser le principe des VLANs.

 

II – Sur l’hyperviseur

A – Modification vlan pour l’hyperviseur

Pour mémoire, nous avions brancher l’hyperviseur sur le brint à l’aide des commandes suivantes :

# ip addr add 10.99.1.250 dev brint
# ip link set brint up
# ip route add 10.99.1.0/24 dev brint

Il n’y a qu’une chose à faire, c’est indiquer le VLAN à utiliser sur le port.

Et cela se fait ainsi :

# ovs-vsctl set port brint tag=99

On peut voir

# ovs-vsctl show

indique :

...
Port brint
  tag: 99
  Interface brint
    type: internal
...

 

B – Définition dans KVM

Dans un fichier ovs-vlans.xml :

<network>
<name>ovs-vlans</name>
<forward mode='bridge'/>
<bridge name='brint'/>
<virtualport type='openvswitch'/>
<portgroup name='vlandef' default='yes'>
</portgroup>
<portgroup name='vlan99'>
<vlan>
<tag id='99'/>
</vlan>
</portgroup>
<portgroup name='vlans1020'>
<vlan trunk='yes'>
<tag id='10'/>
<tag id='20'/>
</vlan>
</portgroup>
</network>

Toujours sur le brint, mais on y ajoute la notion de portgroup.
Un qui trunk les VLANs 10 et 20 (toutes mes machines en ont besoin, autant mettre les deux sur un seul port) et un qui dessert le vlan 99.

Je garde le 99 sur une autre interface, question d’habitude et de cloisonnement.

On injecte et on démarre :

# virsh net-define ovs-vlans.xml
# virsh net-start ovs-vlans
# virsh net-autostart ovs-vlans

 

II – Modification des VM

On va modifier les VMS :

A  – Debianmano, le routeur

1 – Côté hyperviseur

On va lui attacher une nouvelle interface :

# virsh attach-interface debianmano network ovs-vlans --model virtio --target debianmano.2 --mac 52:54:00:11:11:13 --config

Ceci afin de créer automatiquement l’entrée dans le fichier de configuration, configuration qu’on modifiera juste après, la commande virsh attach-interface ne permettant pas de spécifier les portgroups.

On édite donc son fichier de configuration pour y ajouter les portgroup :

# virsh edit debianmano

Vous éditez :

...
première interface qu'on ne tripote pas...
...
<interface type='network'>
<mac address='52:54:00:11:11:12'/>
<source network='ovs-vlans' portgroup='vlans1020'/>
<target dev='debianmano.1'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0'/>
</interface>
<interface type='network'>
<mac address='52:54:00:11:11:13'/>
<source network='ovs-vlans' portgroup='vlan99'/>
<target dev='debianmano.2'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x08' slot='0x00' function='0x0'/>
</interface>

Il faut ajouter les portgroup dans <source network>.
Un sur le trunk 10-20 et l’autre sur le vlan99.

On ne touche pas à la première interface.

2 – Côté VM

On retourne dans la VM :

# virsh console debianmano

On va modifier /etc/default/grub :

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

afin de récupérer les noms classiques (eth0, eth1, etc…)

Puis :

debianmano# update-grub

On va éditer le fichier /etc/network/interfaces :

auto eth0
 iface eth0
 address 192.168.1.100
 netmask 255.255.255.0
 gateway 192.168.1.254

auto eth1.10
 iface eth1.10 inet static
 address 10.10.1.1
 netmask 255.255.255.0

auto eth1.20
 iface eth1.20 inet static
 address 10.20.1.1
 netmask 255.255.255.0

auto eth2
 iface eth2 inet static
 address 10.99.1.1
 netmask 255.255.255.0

Ne reste plus qu’à arrêter la machine.

# virsh shutdwon debianmano

 

B – Seconde VM

De la même manière que pour le routeur…

1 – Côté hyperviseur

On va lui attacher une nouvelle interface :

# virsh attach-interface newvm network ovs-vlans --model virtio --target newvm.1 --mac 52:54:00:11:11:21 --config

On édite son fichier de configuration pour y ajouter les portgroup :

# virsh edit newvm

Et vous éditez :

<interface type='network'>
<mac address='52:54:00:62:ec:4c'/>
<source network='ovs-vlans' portgroup='vlans1020'/>
<target dev='newvm.0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
<interface type='network'>
<mac address='52:54:00:11:11:21'/>
<source network='ovs-vlans' portgroup='vlan99'/>
<target dev='newvm.1'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0'/>
</interface>

La, on change les deux interfaces. La première passe sur le ovs-vlans sur le trunk 10-20, la seconde, sur le vlan99.

 

2 – Côté VM

On retourne dans la VM :

# virsh console newvm

On va modifier /etc/default/grub :

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

Puis :

newvm# update-grub

On va éditer le fichier /etc/network/interfaces :

auto eth0.10
 iface eth0.10 inet static
 address 10.10.1.2
 netmask 255.255.255.0
 gateway 10.10.1.1

auto eth0.20
 iface eth0.20 inet static
 address 10.20.1.2
 netmask 255.255.255.0

auto eth1
 iface eth2 inet static
 address 10.99.1.2
 netmask 255.255.255.0

Ne reste plus qu’à arrêter la machine.

# virsh shutdwon newvm

 

III – Tests

On relance les deux VMs :

# virsh start debianmano
# virsh start newvm

Puis on va déjà regarder :

# virsh domiflist debianmano
# virsh domiflist newvm

On doit bien voir ce qu’on s’attendait à voir 😉

On peut donc supprimer l’ancienne définition de brint dans KVM :

# virsh net-destroy ovs-back
# virsh net-undefine ovs-back

 

Sur le routeur (debianmano), on va réactiver le routage :

# virsh console debianmano

Puis :

debianmano# echo 1 > /proc/sys/net/ipv4/ip_forward
debianmano# iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -j SNAT --to 192.168.1.100

Et depuis newvm, on doit pouvoir pinguer le monde entier.

Rien de compliqué au final.

 

IV – Spécifier les VLANs lors de la création

Comme je l’ai expliqué, la commande virsh attach-interface ne permet pas de passer le paramètre portgroup.

Par contre, pour la création avec virt install, on peut tout à fait spécifier les portgroup de la sorte :

--network network:ovs-vlans,portgroup=vlans1020,model=virtio,mac=52:54:00:AA:BB:CC,target=newvm.1

 

 

V – Conclusion

Et voila, vous savez utilisez les VLANs avec KVM et Openvswitch. Bien évidement, libre à vous de faire plus simple, mais au moins, s’il faut faire compliqué, vous saurez 😉

Dans la partie suivante, nous allons voir la première méthode pour créer une VM à partir de debootsrap.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *