29 mars 2024

Création d’un service proxy en haute disponibilité

Dans cet article, s’intégrant dans la série Tuto Virtualisation V 2022 : Debian 11, KVM et Openvswitch, nous allons mettre en place notre service de proxies.

I – Présentation

 

Pour rappel, nous mettons en place cette infrastructure :

 

Maintenant, imaginons notre VM BackWeb1 par ex, qui souhaite récupérer une ressource sur le net.
Par où va t’elle passer ?
Pour elle, sa gateway sera défini sur notre IP virtuelle INTROUT : 10.100.0.254. Mais une fois sur le routeur interne, comment aller sur le net ? Comment passer du Vlan 20 au Vlan10 ?
Et bien, avec une/plusieurs VMs qui feront office de passerelles/proxies, nommées Proxy1 et Proxy2 sur le shéma.

Et bien sur, ce service sera en haute dispo !

Les routeurs internes (introut1 et introut2) auront alors comme gateway l’IP virtuelle du service proxy : 10.20.1.90

 

II – Mise en place des VMs

Je me sers de mon script fait maison (Tuto Virtualisation avec KVM, partie VIII : Scripts d’automatisation).

Au niveau de la configuration  :

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

A – Création des VMs

hyperV# ./create.sh -n proxy1 -i 91 -s 1
hyperV# ./create.sh -n proxy2 -i 92 -s 0

B – Ajout des interfaces réseaux

On va attacher le port trunk vlansext (vlans 10 et 20) à ces VMs fraichement crées.

Créez un fichier : networkproxy1.xml

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

et un fichier : networkproxy2.xml

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

On ajoute :

hyperV# virsh attach-device proxy1 networkproxy1.xml --config
hyperV# virsh attach-device proxy2 networkproxy2.xml --config

 

C – Configuration réseaux

On va éditer les fichiers d’interfaces avant de démarrer :

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

On édite le fichier /root/mountlvm/etc/network/interfaces pour y ajouter les interfaces eth1.10 et eth1.20 :

auto lo
iface lo inet loopback

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

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

auto eth1.10
iface eth1.10 inet static
 address 10.10.1.91
 netmask 255.255.255.0
 gateway 10.10.1.254

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

On démonte :

hyperV# umount /root/mountlvm

La même chose pour le Frontweb2 :

hyperV# mount /dev/mapper/vg0-proxy2p1 /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.92
 netmask 255.255.255.0

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

auto eth1.10
iface eth1.10 inet static
 address 10.10.1.92
 netmask 255.255.255.0
 gateway 10.10.1.254

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

On démonte :

hyperV# umount /root/mountlvm

On peut démarrer les VMS :

hyperV# virsh start proxy1
hyperV# virsh start proxy2

Puis se connecter dessus :

hyperV# ssh user@proxy1
hyperV# ssh user@proxy2

 

III – Haute Disponibilité

A – Keepalived

Sur les deux proxys, on installe Keepalived :

proxyX# apt install keepalived

A la différence de nos Keepalived sur les routeurs externes et ceux sur nos Frontaux Web, ici, nous allons avoir deux IP virtuelles à gérer.

  • une côté Vlan 10 : 10.10.1.90
  • une côté Vlan 20 : 10.20.1.90

Sur Proxy1, on édite le fichier /etc/keepalived/keepalived.conf :

vrrp_instance PROXY_20 {
  state MASTER
  preempt 1
  interface eth1.20
  virtual_router_id 3
  priority 200
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass password
  }
  unicast_src_ip 10.20.1.91
  unicast_peer {
    10.20.1.92
  }
  virtual_ipaddress {
    10.20.1.90
  }
  notify /srv/keep.sh
}

vrrp_instance PROXY_10 {
  state MASTER
  preempt 1
  interface eth1.10
  virtual_router_id 4
  priority 200
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass password
  }
  unicast_src_ip 10.10.1.91
  unicast_peer {
    10.10.1.92
  }
  virtual_ipaddress {
    10.10.1.90
  }
}

Sur Proxy2, on édite le fichier /etc/keepalived/keepalived.conf :

vrrp_instance PROXY_20 {
  state BACKUP
  interface eth1.20
  virtual_router_id 3
  priority 50
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass password
  }
  unicast_src_ip 10.20.1.92
  unicast_peer {
    10.20.1.91
  }
  virtual_ipaddress {
    10.20.1.90
  }
  notify /srv/keep.sh
}
vrrp_instance PROXY_10 {
  state BACKUP
  interface eth1.10
  virtual_router_id 4
  priority 50
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass password
  }
  unicast_src_ip 10.10.1.92
  unicast_peer {
    10.10.1.91
  }
  virtual_ipaddress {
    10.10.1.90
  }
}

 

B – Script Keep.sh

Sur les deux proxys, 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

 

C – Keepup.sh

Toujours sur les deux proxys, un fichier /srv/keepup.sh :

#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ping -c 1 10.10.1.254

Le proxy qui est actif voit le forward activé sur ses interfaces.

 

D – Keepdown.sh

Sur les deux proxys, un fichier /srv/keepdown.sh :

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

Quand un proxy est passif, nul besoin  d’avoir le forward activé.

On termine en chmodant le tout, sur les deux proxys :

proxyX# chmod +x /srv/keep*

On peut lancer Keelalived sur les deux proxies :

proxyX# service keepalived stop
proxyX# service keepalived start

 

IV – Conclusion

Le service proxy est en place. Cela dit, il y aura encore de la configuration réseau à faire par la suite, mais j’en parlerais le moment venu !

En attendant, revenons à la feuille de route et continuons !

Laisser un commentaire

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