smtp-source sans installation de Postfix : extraire les outils de test de charge du RPM
smtp-source et smtp-sink font partie de Postfix, mais fonctionnent aussi sans serveur de messagerie installé. Découvrez comment extraire ces deux outils du paquet sur RHEL, pourquoi une exécution depuis /tmp peut échouer à cause de l’option de montage noexec et quelles bibliothèques doivent être incluses.
Pour les tests de charge SMTP, smtp-source est un bon choix : l’outil ouvre des sessions parallèles, les maintient ouvertes pour plusieurs messages et reproduit ainsi le comportement de connexion d’un expéditeur de masse bien plus réalistement que les outils de test qui établissent une nouvelle connexion pour chaque e-mail. Son pendant, smtp-sink, accepte les e-mails et les rejette sans rien distribuer. Les deux font partie de Postfix.
C’est précisément là que se trouve le problème : le système depuis lequel vous souhaitez effectuer les tests n’a souvent pas Postfix installé. Sur une appliance de passerelle de messagerie, une installation n’est pas non plus souhaitable, car un Postfix supplémentaire apporte sa propre configuration sous /etc/postfix ainsi qu’un service système qui, dans le pire des cas, occupe le port 25 et bloque ainsi le système de messagerie proprement dit. S’ajoute à cela la question de savoir ce que le support du fabricant pense des paquets installés ultérieurement sur son appliance.
Ces deux outils peuvent toutefois être utilisés sans installation : téléchargez le RPM, extrayez les binaires et les bibliothèques, et c’est tout. Ce chemin présente deux particularités que cet article illustre sur un système RHEL 8. Vous n’avez pas besoin de droits root, seulement d’un accès aux sources de paquets.
smtp-source est-il déjà présent ?
Commencez par vérifier si l’outil ne se trouve pas déjà sur le système. Selon la distribution, smtp-source se trouve hors du PATH habituel :
command -v smtp-source || \
ls /usr/sbin/smtp-source /usr/lib/postfix/sbin/smtp-source 2>/dev/null
Si la sortie reste vide, le paquet correspondant est également absent. Sur les systèmes RPM, confirmez-le et vérifiez en même temps si les référentiels proposent Postfix :
rpm -qa | grep -i postfix
yum list available postfix
Sur le système de test, aucun Postfix n’était installé, mais le référentiel BaseOS proposait postfix-3.5.8-8.el8_10. La voie est donc libre : le paquet peut être téléchargé sans être installé.
Télécharger uniquement le RPM
yum download (issu du paquet de plugin dnf-plugins-core, généralement présent sur RHEL 8) télécharge un paquet dans le répertoire actuel sans l’installer. Cela fonctionne sans droits root tant que le répertoire cible est accessible en écriture :
cd /tmp && yum download postfix
Si yum affiche No such command: download, le plugin manque. Avec des droits root, vous obtenez le même résultat via la commande d’installation avec --downloadonly :
sudo yum install --downloadonly --downloaddir=/tmp postfix
Sans aucune de ces deux possibilités, il reste le détour par un deuxième système de même version RHEL : téléchargez le RPM sur celui-ci et copiez-le vers le système cible avec scp.
Extraire les binaires et les bibliothèques
rpm2cpio convertit le RPM en un flux d’archive cpio, dont cpio extrait de manière ciblée certains chemins. Outre les deux binaires, vous avez également besoin des bibliothèques Postfix, car sur RHEL les outils sont liés dynamiquement à libpostfix-*.so :
cd /tmp && rpm2cpio postfix-*.rpm | \
cpio -idmv ./usr/sbin/smtp-source ./usr/sbin/smtp-sink \
'./usr/lib64/postfix/*'
Les fichiers se trouvent ensuite sous /tmp/usr/.
Problème 1 : /tmp est monté avec noexec
Le démarrage évident directement depuis /tmp échoue sur les systèmes durcis :
bash: /tmp/usr/sbin/smtp-sink: Permission denied
[1]+ Exit 126
Un code de sortie 126 malgré un bit d’exécution correctement défini est le symptôme typique d’un système de fichiers monté avec l’option noexec. Le noyau refuse alors toute exécution de programme depuis ce système de fichiers, indépendamment des droits de fichier. Vous pouvez le vérifier directement :
mount | grep ' /tmp '
La solution : copiez les binaires et les bibliothèques dans un répertoire dont le système de fichiers autorise l’exécution, par exemple votre propre répertoire personnel :
mkdir -p ~/bin && \
cp /tmp/usr/sbin/smtp-source /tmp/usr/sbin/smtp-sink \
/tmp/usr/lib64/postfix/libpostfix-*.so ~/bin/ && \
chmod +x ~/bin/smtp-source ~/bin/smtp-sink
Notez que noexec affecte également le chargement des bibliothèques partagées. Il ne suffit donc pas de déplacer uniquement les binaires et de laisser les bibliothèques dans /tmp.
Problème 2 : le chemin des bibliothèques
Sans indication supplémentaire, l’éditeur de liens dynamique cherche les bibliothèques Postfix sous /usr/lib64/postfix, où elles ne se trouvent pas faute d’installation :
smtp-sink: error while loading shared libraries: libpostfix-global.so:
cannot open shared object file: No such file or directory
LD_LIBRARY_PATH ajoute le répertoire personnel au chemin de recherche de l’éditeur de liens. La variable est placée devant chaque appel :
LD_LIBRARY_PATH=~/bin ~/bin/smtp-source ...
Avec ldd ~/bin/smtp-source, vous pouvez vérifier à l’avance si toutes les dépendances peuvent être résolues. En dehors des bibliothèques Postfix, les outils ne dépendent que des bibliothèques standard du système.
Test de fonctionnement en loopback
Vous pouvez vérifier que tout fonctionne sans envoyer un seul véritable e-mail : smtp-sink écoute comme destinataire jetable sur un port élevé, tandis que smtp-source envoie les messages. Tout le trafic reste sur localhost.
LD_LIBRARY_PATH=~/bin ~/bin/smtp-sink -v 127.0.0.1:2525 100 &
LD_LIBRARY_PATH=~/bin ~/bin/smtp-source -s 2 -m 10 -l 5120 \
-f test@example.com -t test@example.com 127.0.0.1:2525
En cas de réussite, smtp-source ne produit aucune sortie, tandis que smtp-sink affiche pour chaque message le dialogue SMTP complet, de HELO à QUIT. Ensuite, arrêtez le processus d’arrière-plan et supprimez les restes dans /tmp :
kill %1
rm -rf /tmp/usr /tmp/postfix-*.rpm
Conseils pour le véritable test de charge
Pour des mesures de débit fiables, le générateur de charge doit se trouver sur une machine distincte du même segment réseau, et non sur l’objet à tester lui-même. Si smtp-source s’exécute sur la passerelle testée, le générateur et le système de messagerie se disputent le CPU et les E/S, et la mesure reflète cette concurrence plutôt que la capacité réelle. Localement sur le système cible, l’outil extrait convient surtout aux tests fonctionnels du jeu de règles et aux premières vérifications de plausibilité.
Dès que le test vise le véritable port 25, il s’agit de vrais e-mails qui traversent le jeu de règles de la passerelle et sont distribués selon la configuration. Utilisez donc des adresses de destinataires dont l’aboutissement est contrôlé : une boîte aux lettres de test dédiée, une règle qui rejette les expéditeurs de test ou un domaine de rejet prévu à cet effet par le fournisseur. Les adresses de production n’ont pas leur place dans un test de charge.
La procédure décrite convient, au-delà de ces deux outils SMTP, à tout programme en ligne de commande fourni dans un paquet dont l’installation sur le système cible n’est pas envisageable. La combinaison de yum download, rpm2cpio et d’un répertoire exécutable dans le répertoire personnel est identique sur tous les systèmes RPM.

Commentaires
Les commentaires sont chargés depuis GitHub / Giscus.