6 octobre 2022

Tuto KVM/Openvswitch : Mise en place de routeurs internes

Dans cet article, partie intégrante de la série Tuto Virtualisation V 2022 : Debian 11, KVM et Openvswitch, nous allons mettre en place le service de routage interne.

 

I – Présentation

Pour rappel, voila l’infrastructure en cours de réalisation :

Nous allons mettre en œuvre IntRout1 et IntRout2.

 

II – Mise en place des VMs

A – Création des VMs

Création des VMS, toujours à l’aide du script disponible ici.

Au niveau ressource (configuration dans le script) :

size_swap=1
size_var=3
size=3
ram=256
cpu=1

Création des VMs :

hyperV# ./create.sh -n introut1 -s 1 -i 5
hyperV# ./create.sh -n introut2 -s 0 -i 6

 

B – Ajout des interfaces réseaux

Il va falloir ajouter deux interfaces réseaux :

  • une interface sur le VLAN 20
  • une interface sur les VLANs 100-109 via le trunk vlansint

On va créer plusieurs fichiers qu’on injectera.

Pour le VLAN 20 :

Fichier net-20-introut1.xml :

<interface type='network'>
<source network='intern-vlans' portgroup='vlan20'/>
<target dev='introut1.1'/>
<model type='virtio'/>
<driver name='vhost'/>
</interface>

Fichier net-20-introut2.xml :

<interface type='network'>
<source network='intern-vlans' portgroup='vlan20'/>
<target dev='introut2.1'/>
<model type='virtio'/>
<driver name='vhost'/>
</interface>

On injecte :

hyperV# virsh attach-device introut1 net-20-int-introut1.xml --config
hyperV# virsh attach-device introut2 net-20-int-introut2.xml --config

 

Puis pour les VLANs internes :

Fichier net-vlans-int-introut1.xml :

<interface type='network'>
<source network='intern-vlans' portgroup='vlansint'/>
<target dev='introut1.2'/>
<model type='virtio'/>
<driver name='vhost'/>
</interface>

Fichier net-vlans-int-introut2.xml :

<interface type='network'>
<source network='intern-vlans' portgroup='vlansint'/>
<target dev='introut2.2'/>
<model type='virtio'/>
<driver name='vhost'/>
</interface>

On injecte :

 hyperV# virsh attach-device introut1 net-vlans-int-introut1.xml --config
 hyperV# virsh attach-device introut2 net-vlans-int-introut2.xml --config

 

C – Configuration Réseaux

Passons maintenant à la configuration côté VM.

On monte :

hyperV# mount /dev/mapper/vg1-introut1p1 /root/mountlvm/

On édite le fichier /root/mountlvm/etc/network/interfaces :

auto lo
iface lo inet loopback

auto eth0.99
iface eth0.99 inet static
  address 10.99.1.5
  netmask 255.255.255.0

auto eth0.250
iface eth0.250 inet static
  address 10.250.1.5
  netmask 255.255.255.0

auto eth1
iface eth1 inet static
  address 10.20.1.5
  netmask 255.255.255.0
  gateway 10.20.1.90

auto eth2.100
iface eth2.100 inet static
  address 10.100.0.5
  netmask 255.255.255.0

On démonte :

hyperV# umount /root/mountlvm

 

Puis, pour introut 2 :

On monte :

hyperV# mount /dev/mapper/vg0-introut2p1 /root/mountlvm/

On édite le fichier  /root/mountlvm/etc/network/interfaces :

auto lo
iface lo inet loopback

auto eth0.99
iface eth0.99 inet static
  address 10.99.1.6
  netmask 255.255.255.0

auto eth0.250
iface eth0.250 inet static
  address 10.250.1.6
  netmask 255.255.255.0

auto eth1
iface eth1 inet static
  address 10.20.1.6
  netmask 255.255.255.0
  gateway 10.20.1.90

auto eth2.100
iface eth2.100 inet static
  address 10.100.0.6
  netmask 255.255.255.0

On démonte :

hyperV# umount /root/mountlvm

 

Ces deux VMs ont pour gateway l’IP virtuelle des proxies : 10.20.1.90

 

III – Accès au net

Avant de passer à la suite avec l’installation de Keepalived, on va donner accès au net à ces VMs.

On test d’abord un ping vers la passerelle :

introutX# ping 10.20.1.90

Ça, c’est OK.

Maintenant, tentons un ping avec un ‘saut’ de plus, vers la Gateway de notre Gateway, donc vers 10.10.1.254 :

introutX# ping 10.10.1.254

Et… rien.

En effet, si on effectue un tcpdump sur le routeur, on va voir le paquet arriver, la réponse générée, mais walou…
Problème de route : extrout1 et extrout2 ne connaissent pas le réseau 10.20.1.0/24.

On va donc y remédier.

ajout de la route coté extrout1 et 2

extrout1# ip route add 10.20.1.0/24 via 10.10.1.90

Et maintenant, le ping depuis introut1 ou introut2 vers extrout est OK :

introutX# ping 10.10.1.254

On va inscrire ces routes dans le marbre. Au passage, on sait également qu’un routeur externe n’aura à communiquer avec le réseau 10.20.1.0/24  que s’il est en mode Master.

Sur les deux VMs extrout1 et extrout2, on va donc éditer :

le fichier /srv/keepup.sh

#!/bin/bash
ip addr add 123.123.123.123 dev eth2
ip link set eth2 up
ip route add IP.GATEWAY.ONLINE dev eth2
ip route del default
ip route add 0.0.0.0/0 via 62.210.0.1 dev eth2
ip route add 10.20.1.0/24 via 10.10.1.90
echo 1 > /proc/sys/net/ipv4/ip_forward
/srv/firewallup.sh
sleep 1
ping -c 1 IP.GATEWAY.ONLINE

Puis, le fichier /srv/keepdown.sh :

Sur extrout1 :

#!/bin/bash
ip link set eth2 down
ip addr del 51.159.92.81/32 dev eth2
ip route add 0.0.0.0/0 via 10.10.1.2 dev eth1 src 10.10.1.1
ip route del 10.20.1.0/24 via 10.10.1.90
/srv/firewalldown.sh

Sur extrout2 :

#!/bin/bash
ip link set eth2 down
ip addr del 51.159.92.81/32 dev eth2
ip route add 0.0.0.0/0 via 10.10.1.1 dev eth1 src 10.10.1.2
ip route del 10.20.1.0/24 via 10.10.1.90
/srv/firewalldown.sh

Et voila.

 

IV – Keepalived

Maintenant que nos VMs ont accès au net, on va pouvoir installer keepalived.

Sur les deux VMs :

introutX# apt install keepalived

Puis, la configuration, dans le fichier /etc/keepalived/keepalived.conf :

Sur introut1 :

vrrp_instance INTROUT_20 {
  state MASTER
  preempt 1
  interface eth1
  virtual_router_id 20
  priority 200
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass password
  }
  notify /srv/keep.sh
  unicast_src_ip 10.20.1.5
  unicast_peer {
    10.20.1.6
  }
  virtual_ipaddress {
    10.20.1.254
  }
}

vrrp_instance INTROUT_100 {
  state MASTER
  preempt 1
  interface eth2.100
  virtual_router_id 100
  priority 200
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass password
  }
  unicast_src_ip 10.100.0.5
  unicast_peer {
    10.100.0.6
  }
  virtual_ipaddress {
    10.100.0.254
  }
}

Sur introut2 :

vrrp_instance INTROUT_20 {
  state BACKUP
  interface eth1
  virtual_router_id 20
  priority 50
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass password
  }
  notify /srv/keep.sh
  unicast_src_ip 10.20.1.6
  unicast_peer {
    10.20.1.5
  }
  virtual_ipaddress {
    10.20.1.254
  }
}

vrrp_instance INTROUT_100 {
  state BACKUP
  interface eth2.100
  virtual_router_id 100
  priority 50
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass password
  }
  unicast_src_ip 10.100.0.6
  unicast_peer {
    10.100.0.5
  }
  virtual_ipaddress {
    10.100.0.254
  }
}

 

Sur les deux routeurs, on créé un fichier /srv/keep.sh :

#!/bin/bash

TYPE=$1
NAME=$2
STATE=$3

case $STATE in
  "MASTER") /srv/keepup.sh
            exit 0
            ;;
  "BACKUP") /srv/keepdown.sh
            exit 0
            ;;
  "FAULT")  /srv/keepdown.sh
            exit 0
            ;;
  *)        echo "unknown state"
            exit 1
            ;;
esac

Puis un fichier /srv/keepup.sh :

#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward

Et un fichier /srv/keepdown.sh :

#!/bin/bash
echo 0 > /proc/sys/net/ipv4/ip_forward

On active le forward que si le routeur est en action.

On termine en chmodant :

introutx# chmod +x /srv/keep*

On peut démarrer Keepalived sur les deux routeurs internes :

introutx# service keepalived start

Et un :

introut1# ip a

sur le routeur interne principale (introut1) nous affiche bien les IP virtuelles attachées :

  • 10.20.1.254 sur le vlan 20
  • 10.100.0.254 sur le Vlan 100

 

V – Conclusion

Voila, nos routeurs internes sont prêts !

On peut revenir à la feuille de route et continuer notre bonhomme de chemin.

Laisser un commentaire

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