13 juin 2015 | Posted in:Réseau

Voila ma problématique : comment répartir le flux smtp entre deux serveurs avec un seul point d’entrée sans pour autant perdre les informations du flux tel que l’ip de la source? Au début, je pensais que cela serait facile. Manque de pot pour moi à l époque j’étais encore en Debian 6, voir 7 et les versions de haproxy et de nginx ne me permettaient pas de faire du load balancing proprement.

J’ai donc dù faire ça, on peut dire d’une manière nettement plus rustique via iptable.

Principe du Load Balancing SMTP

Pourquoi faire un Load Balancing SMTP, je pourrai très bien mettre en place plusieurs enregistrements MX. Certes, mais cela ne sert que pour les serveurs Mails qui m’envoient les messages de leur clients. Comment faire pour mes clients? Dans leur configuration outlook, ils sont obligés de spécifier l’adresse du serveur smtp.
Imaginons donc que pour une société, j’ai besoin de mettre en place deux serveurs SMTP afin de pouvoir faire face à leur charge mail.
Je ne vais pas dire au client les 100 premiers comptes vous les mettez sur smtp1.mondomaine.fr et les 100 suivants sur smtp2.mondomaine.fr. Si l’entreprise grandit et que nous rajoutions un troisième serveur, les deux premiers seront saturés, voir ralentis alors que le nouveau lui, montera en charge lentement.

 

Le Load Balancing va donc permettre d’apporter de la souplesse et de la facilité pour le client, ainsi qu’une meilleure répartition de la charge. Malheureusement, le Load Balancing SMTP via iptable ne permet pas de distribuer suivant la charge du serveur.
Dans la liste des autres inconvénients, vous aurez aussi celui du blacklistage, si le point d’entrée est blacklisté, tous les serveurs sont impactés.
Si on vous demande de rechercher dans les logs la trace d’un email, vous devrez chercher dans les 3 serveurs emails, car vous ne saurez pas lequel des serveurs mails a traité la requête.

Mais ne vous inquiétez pas, il existe des solutions pour cela, je traite d’ailleurs de la centralisation des logs dans un article.

Le principe est relativement simple, nous allons tagué chaque nouveau flux smtp. Suivant le tag, iptable l’enverra sur tel ou tel serveur.

Configurer iptable pour faire du Load Balancing SMTP

Pour la configuration du noyau je vous invite à lire cet article du blog

Le code iptable a chargé sur le point d’entrée.

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 25 -m state --state new -m statistic --mode nth --every 2 --packet 0 -j CONNMARK --set-mark 0

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 25 -m state --state new -m statistic --mode nth --every 2 --packet 0 -j CONNMARK --set-mark 1

iptables -t nat - A PREROUTING  -i eth0 -p tcp --dport 25 -m connmark --mark 0 -j DNAT --to 192.168.1.2:25

iptables -t nat - A PREROUTING  -i eth0 -p tcp --dport 25 -m connmark --mark 1 -j DNAT --to 192.168.1.3:25

petit décryptage :

-i eth0 : tout ce qui vient de l’interface réseau eth0

–dport 25 : à destination du port 25

–every 2 : tous les deux marquages, on boucle. Traduction le 2 représente le n serveur de votre infra

–set-mark 0 : on tag le paquet , le décompte du tag commence a 0 et non 1

Ensuite comme vous voyez, on redirige les paquets tagués 0 sur la machine a l ip 192.168.1.2 sur le port 25

Conclusion

Bien que rustique, cette solution reste très efficace et peu gourmande en ressources, elle peut répondre à n’importe quel protocole. Néanmoins, de part ce coté brut de fonderie, il faut bien comprendre que si la machine cible ne répond pas, on perdra le paquet et que vous n’aurez aucune gestion de la charge machine. Cette solution est à utiliser en dernier recours. Maintenant, haproxy gère le smtp de manière plus fine mais la technique sera valable pour d’autres ports.

1 Comment

  1. rhum
    29 juin 2017

    bonjour,

    pour faire ça il y a aussi la solution du round robin DNS.

    un enregistrement DNS par serveur :
    smtp1.admin-systeme.com
    smtp2.admin-systeme.com
    smtp3.admin-systeme.com

    3 enregistrements smtp.admin-systeme.com en cname vers les enregistrements des serveurs.

    Quand un serveur tombe il ne réponds pas et le client mail ne contactant pas le serveur smtp il retentera plus tard et tapera sur un autre serveur de la grappe.

Leave a Reply


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*