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.