Déc 05 2014

LVS: Un Load-Balancer Gratuit pour Microsoft Exchange

Publié par à 1:17 sous Exchange,Linux,Messagerie

Il est possible de répartir le trafic Microsoft Exchange avec Microsoft NLB mais cela demande 4 serveurs Exchange pour la simple raison qu’NLB n’est pas compatible avec le rôle de cluster (Exchange). La plupart des experts Microsoft ne le recommandent pas.

Parmi les points faibles de NLB, les services Exchange ne sont monitorés que par un simple ping, ce qui signifie qu’ils sont considérés actifs même s’ils ont été arrêtés.
 
Un load balancer Exchange matériel sont recommandé dans la plupart des cas mais reste très onéreux. Comme je vais virtualiser les serveurs Exchange sur Hyper-v, les répartiteurs de charge logiciel sont les plus appropriés naturellement.
C’est ce qui m’amène à Linux Virtual Server (LVS) sans dépense supplémentaire et avec peu de ressources.
 
N’en déplaise aux plus ardents défenseurs de Linux et Microsoft, Linux Redhat est 100% supporté sur Hyper-V et a été optimisé avec quelques améliorations.
 

Réseau

Chaque machine virtuelle Exchange sera hébergée sur un serveur physique différent ainsi qu’une VM Linux pour la redondance. Le load-balancer actif (LB1 le maître) distribuera les paquets aux serveurs « réels” via un réseau privé. Le réseau privé sera connecté à un port physique pour que les VMs sur les 2 machines puissent se voir.

Diagramme Load Balancer Echange

 
Créez les 2 réseaux et les 4 VMs dans Hyper-v en donnant respectivement 1 et 2 NICs à Exchange et aux serveurs LVS. Affectez des IPs selon la topologie de votre réseau.
 

Setup du Load Balancer

Modifiez /etc/sysctl.conf pour autoriser l’ip forwarding:

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

Pus redémarrez la machine ou entrez
sysctl -p /etc/sysctl.conf
 
Comme fil conducteur, vous pouvez suivre le guide LVS de Redhat.
Saisissez un mot de passe en exécutant piranha-passed sur les serveur Linux qui deviendra le maître et démarrez les services pulse et piranha-gui.

/etc/init.d/pulse start
/etc/init.d/piranha-gui start

Vous devriez pouvoir atteindre la page de conf sur le port 3636 avec un navigateur cad http://IP:3636. Connectez-vous avec piranha comme nom d’utilisateur et le mot de passe que vous avez entré ci-dessus.
 
Une fois connecté sur la page web de configuration Piranha, paramétrez les pages Paramètres globaux “Global Settings » et Redondance « Redundancy ». C’est assez rapide: La passerelle virtuelle des serveurs réels vont aller sur la sous-interface eth1:1. Je n’ai pas coché « Monitor link » ni « Use sync daemon » vu ca ne fonctionnait pas si je les laissais activés.

Serveur primaire load balancer LVS
Serveur de backup load balancer LVS

 
C’est ici que les choses sérieuses commencent. Nous pourrions créer un server virtuel pour chaque port à surveiller. J’ai choisi plutôt de marquer les paquets, et de ne monitoire qu’un seul service. Inutile ainsi d’écrire des scripts multiples. Vous pouvez naturellement le faire si vous le souhaitez.

 Load balancer LVS Accès Exchange

 
Je mets le port 80 sous surveillance comme Exchange est en écoute sur HTTP.
Entrez un nombre dans le champ firewall mark pour regrouper tous les ports à rediriger: J’ai choisi 80 mais ça aurait pu être tout-à-fait autre chose, ce n’est qu’un tag. Rappelez-vous juste de ce nombre pour l’ajouter dans iptables ci-dessous.
Jai affecté l’adresse IP à eth0:3: Je vous direz pourquoi plus tard.
Ajoutez les IP des 2 serveurs réels et laissez le script de surveillance par défaut dans le dernier onglet.
 

Règles Iptables

Nous allons maintenant configurer iptables pour marquer les paquets du nombre 80. Iptables va filtrer (1re partie ci-dessous) et marquer (2me partie) les paquets.
Voici ce que j’ai dans /etc/sysconfig/iptables:

# Generated by iptables-save v1.4.7
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [353:70931]
:OUTPUT ACCEPT [908:61941]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3636 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2525 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 717 -j ACCEPT
-A INPUT -d 192.168.1.36/32 -j ACCEPT
-A INPUT -d 192.168.1.37/32 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i eth0 -o eth1:1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1:1 -o eth0 -j ACCEPT
COMMIT
# Generated by iptables-save v1.4.7
*mangle
:PREROUTING ACCEPT [87155:9160406]
:INPUT ACCEPT [82925:8666308]
:FORWARD ACCEPT [3859:469324]
:OUTPUT ACCEPT [64873:3999893]
:POSTROUTING ACCEPT [68732:4469217]
-A PREROUTING -d 192.168.1.35/32 -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x50/0xffffffff
-A PREROUTING -d 192.168.1.35/32 -p tcp -m tcp --dport 443 -j MARK --set-xmark 0x50/0xffffffff
-A PREROUTING -d 192.168.1.35/32 -p tcp -m tcp --dport 25 -j MARK --set-xmark 0x50/0xffffffff
-A PREROUTING -d 192.168.1.35/32 -p tcp -m tcp --dport 2525 -j MARK --set-xmark 0x50/0xffffffff
-A PREROUTING -d 192.168.1.35/32 -p tcp -m tcp --dport 587 -j MARK --set-xmark 0x50/0xffffffff
-A PREROUTING -d 192.168.1.35/32 -p tcp -m tcp --dport 465 -j MARK --set-xmark 0x50/0xffffffff
-A PREROUTING -d 192.168.1.35/32 -p tcp -m tcp --dport 717 -j MARK --set-xmark 0x50/0xffffffff
COMMIT

Notez qu’iptables convertit les nombres de marquage en hexa, cad 80 devient 0x50.
La configuration principale est terminée. Restent le 2nd load balancer pour Exchange, l’accès aux serveurs réels et le NAT. Voyons ceci.
 

Gestion des Serveurs Exchange

Les serveurs réels Exchange1&2 peuvent être gérés depuis hyper-v mais c’est loin d’être pratique.
Pour gérer les 2 serveurs, j’ai créé 2 serveurs virtuels extra sur LVS qui redirigent toujours vers la même IP, vers un seul serveur réel donc.

Load balancer LVS Accès RDP

J’ai marqué les paquets avec les numéros 1 et 2, respectivement pour Exchange1 et Exchange2, et ajouté les lignes suivantes à iptables.

-A PREROUTING -d 192.168.15.36/32 -j MARK --set-xmark 0x1/0xffffffff
-A PREROUTING -d 192.168.15.37/32 -j MARK --set-xmark 0x2/0xffffffff

 
Redémarrez les services pulse et iptables et vous devriez avoir les interfaces suivantes:

[root@lb1 ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:15:5D:0F:29:0E
          inet addr:192.168.1.33  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::215:5dff:fe0f:290e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:481004253 errors:0 dropped:73168 overruns:0 frame:0
          TX packets:305264787 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:380465051896 (354.3 GiB)  TX bytes:204324705710 (190.2 GiB)
          Interrupt:9 Base address:0x6000

eth0:1    Link encap:Ethernet  HWaddr 00:15:5D:0F:29:0E
          inet addr:192.168.1.36  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:9 Base address:0x6000

eth0:2    Link encap:Ethernet  HWaddr 00:15:5D:0F:29:0E
          inet addr:192.168.1.37  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:9 Base address:0x6000

eth0:3    Link encap:Ethernet  HWaddr 00:15:5D:0F:29:0E
          inet addr:192.168.1.35  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:9 Base address:0x6000

eth1      Link encap:Ethernet  HWaddr 00:15:5D:0F:29:0F
          inet addr:10.0.1.33  Bcast:10.0.1.255  Mask:255.255.255.0
          inet6 addr: fe80::215:5dff:fe0f:290f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:320686576 errors:0 dropped:0 overruns:0 frame:0
          TX packets:425280520 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:209496440714 (195.1 GiB)  TX bytes:375879165808 (350.0 GiB)

eth1:1    Link encap:Ethernet  HWaddr 00:15:5D:0F:29:0F
          inet addr:10.0.1.254  Bcast:10.0.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1


Lad balancer LVS règles Exchange

Vous pouvez maintenant joindre Exchange1 & 2 sur les IPs 192.168.1.36 et .37.
 

Ouvrir l’Accès aux Serveurs Exchange vers l’Extérieur

Le problème majeur est que les serveurs réels ne peuvent pas se connecter au monde extérieur comme ils sont sur un réseau privé. On peut y remédier avec une règle de NAT sur le serveur LVS. Ajoutez ceci à la conf iptables:

# Generated by iptables-save v1.4.7
*nat
:PREROUTING ACCEPT [433:57174]
:POSTROUTING ACCEPT [46:2760]
:OUTPUT ACCEPT [46:2760]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT

 
Vous trouverez plus d’information sur IP Masquerading sur ce HOWTO
Relancez le service pulse une fois la conf LVS achevée, et copiez-la sur le serveur de backup ainsi que le fichier iptables.
Vous pouvez utiliser svp à cet effet:
scp /etc/sysconfig/ha/lvs.cf lb2:/etc/sysconfig/ha/lvs.cf
scp /etc/sysconfig/iptables lb2:/etc/sysconfig/iptables
En admettant que lb2 est enregistré dans vos DNS.
Faîtes cela à chaque fois que vous modifiez LVS ou iptables.
 

Surveillance RDP

Au lieu de monitorer le port 80 sur Exchange1 and Exchange2, il vaut mieux vérifier RDP.
Téléchargez check_x224 (écrit pour Nagios) vers /usr/local/bin par exemple

# cd /usr/local/bin/
# chmod +x check_x224

 
Modifiez le script et enlevez le bloc suivant:
if elapsed > critical_sec:
print(‘x224 CRITICAL: RDP connection setup time (%f) was longer than (%d) seconds’ % (elapsed,critical_sec))
sys.exit(2)
if elapsed > warning_sec:
print(‘x224 WARNING: RDP connection setup time (%f) was longer than (%d) seconds’ % (elapsed,warning_sec))
sys.exit(1)

 
Remplacez toutes les intances
print(‘x224 OK. Connection setup time: %f sec.|time=%fs;%d;%d;0’ % (elapsed,elapsed,warning_sec,critical_sec))
par
print(‘OK’)
 
et entrez dans « Sending Program » dans le script de monitoring du serveur virtuel Piranha:
/usr/local/bin/check_x224 -H 10.0.1.1
pour Exchange1; Remplacez l’IP pour Exchange2.

LVS Load Balancer Script monitoring

Cela retournera OK si RDP est actif sur le serveur Exchange.
 

Persistance et Bascule

Vous devez affecter une valeur dans le champ persistance du serveur virtuel (600 ici) pour que LVS continue de rediriger les paquets vers le même serveur pendant ce temps. Si vous ne le faîtes pas, les paquets d’un client unique seront distribués sur plusieurs serveurs et les connexions ne pourront pas s’établir.
Si un serveur réel devient indisponible, la persistance garde les sessions liées à ce server générant une coupure de service.
Pour éviter ce comportement, ajoutez les lignes suivantes à /etc/sysctl.conf et exécutez sysctl -p pour appliquer les changements:

net.ipv4.vs.expire_quiescent_template = 1
net.ipv4.vs.expire_nodest_conn = 1

La 1re ligne fait tomber les sessions vers un serveur réel qui devient indisponible.
La seconde fait la même chose quand un serveur réel est retiré de la conf.
Toutes les informations utiles sont disponibles sur http://www.austintek.com.
 
Si sysctl -p retourne une erreur au reboot sur votre distribution Redhat

error: "net.ipv4.vs.expire_quiescent_template" is an unknown key
error: "net.ipv4.vs.expire_nodest_conn" is an unknown key

Il faut charger le module ip_vs au démarrage. Créez le fichier exécutable suivant:

echo "modprobe ip_vs" >/etc/sysconfig/modules/lvs.modules
chmod +x /etc/sysconfig/modules/lvs.modules

 
Il est aussi intéressant de jeter un oeil au manuel d’ipvsadm. La commande donne la possibilité d’afficher les sessions courantes par exemple:
 

$ ipvsadm -Lcn

Enregistrements DNS dans l’AD

Une dernière chose: les serveurs Exchange vont s’enregistrer dans l’AD avec leurs IPs privées.
Modifiez les DNS sur votre contrôleur de domaine avec les IPs externes pour que la résolution retourne les valeurs correctes.
Assurez-vous de désactiver l’enregistrement automatique DNS dans les paramètres IPv4 de vos cartes réseau si vous ne voulez pas que les paramètres DNS soient écrasés.
C’est une bonne idée d’ajouter les IPs internes des serveurs Exchange à leif fichier host pour leur communications directes.
 

Maintenance des Serveurs Exchange

Si vous voulez mettre à jour un serveur Exchange, il est préférable de le désactiver pour que personne ne puisse établir une nouvelle connexion pendant que les services s’arrêtent et redémarrent.
Exécutez

$ ipvsadm -l

pour vérifier le statut actuel puis

ipvsadm -e -f 80 -r exchange_server_ip:80 -w 0 -m

pour mettre le poids à 0. Remplacez avec 1 pour le remettre à 1.
Les connexions établies ne basculeront pas sur l’autre serveur tant que les services ne s’arrêtent pas mais personne ne pourra faire une nouvelle connexion tant que le poids n’est pas remis à 1.


No responses yet

Comments RSS

Leave a Reply