Quand un serveur envoie du spam, arrêtez l’envoi, puis lisez la file avec postqueue -p ou exim -bp et les en-têtes d’un message pour trouver l’origine : script PHP, compte authentifié compromis, formulaire détourné ou relais ouvert. Corrigez cette source, videz ensuite la file avec prudence, puis demandez le retrait des listes noires.
Le signal arrive souvent de l’extérieur : un courrier de l’hébergeur sur du spam sortant, des messages refusés par les boîtes de vos correspondants, une adresse IP en liste noire, ou une file d’attente de plusieurs milliers de messages. Quatre causes dominent : un site web compromis dont un script PHP envoie du courrier, un compte de messagerie dont le mot de passe a fuité, un formulaire de contact détourné par injection d’en-têtes, et un serveur configuré comme relais ouvert.
Cette page traite de la cause côté serveur. Si le problème est plutôt que vos messages légitimes arrivent en indésirables, lisez la page sur les e-mails classés en spam.
Constater l’ampleur sur la file d’attente
Avec Postfix, postqueue -p | tail -1 (ou mailq | tail -1) donne le nombre de messages en attente. Avec Exim, exim -bpc compte la file, et exim -bp la liste ; sur Debian et Ubuntu le binaire s’appelle exim4. Regardez si les expéditeurs et destinataires se répètent, et si les messages portent sur un sujet que vous n’envoyez jamais.
Arrêter l’envoi pour limiter les dégâts
Chaque minute d’envoi dégrade la réputation de l’adresse IP. Coupez le service : sudo systemctl stop postfix (ou exim4). Si des e-mails légitimes doivent continuer à partir, mettez plutôt la file en attente avec sudo postsuper -h ALL, qui bloque les messages sans les supprimer, sous réserve de traiter la cause rapidement. Bloquer le port 25 sortant au pare-feu fonctionne aussi, en gardant le port de soumission pour vos clients de messagerie.
Lire les en-têtes pour remonter à l’origine
Affichez un message de la file : sudo postcat -vq IDENTIFIANT (l’identifiant figure dans la sortie de postqueue -p). Avec Exim, utilisez sudo exim -Mvh IDENTIFIANT. Cherchez :
- X-PHP-Originating-Script : indique l’utilisateur et le fichier PHP expéditeur. Cet en-tête n’existe que si
mail.add_x_headervautOndansphp.ini; activez-le si les messages n’en ont pas, pour les envois suivants. - Une adresse d’expéditeur d’un utilisateur du système ou d’un domaine hébergé.
- Une ligne
Receivedmentionnantlocalhost(envoi par un script) ou une adresse extérieure (authentification ou relais).
Relier le message à un compte ou à un script
Dans /var/log/mail.log, une authentification réussie laisse la mention sasl_username=. Pour compter les comptes les plus actifs : sudo grep -o 'sasl_username=[^ ,]*' /var/log/mail.log | sort | uniq -c | sort -rn | head. Un compte qui envoie des milliers de messages, ou depuis une adresse étrangère à son propriétaire, est compromis. Si l’origine est un script, sudo grep -r "mail(" /var/www --include=*.php -l repère les fichiers qui envoient du courrier, à comparer avec le chemin donné par X-PHP-Originating-Script.
Corriger la cause
- Compte compromis. Changez le mot de passe par un mot de passe long et unique, déconnectez les sessions, et vérifiez s’il n’existe pas de règle de transfert ajoutée. Ne transmettez jamais le nouveau mot de passe par e-mail.
- Script ou site compromis. Isolez les fichiers, mettez à jour le logiciel concerné et suivez le nettoyage d’un site piraté.
- Formulaire détourné. Un champ non filtré permet d’ajouter des en-têtes (
Bcc:) et d’utiliser votre formulaire comme émetteur de masse. Validez les champs, retirez les retours à la ligne des valeurs placées en en-tête, et ajoutez un antirobot. - Relais ouvert. Contrôlez avec
postconf -n | grep -E 'mynetworks|relay_restrictions|recipient_restrictions'quemynetworksne couvre que le réseau local et que la restrictionreject_unauth_destinationfigure dans les règles, comme dans la documentation Postfix.
Vider la file avec prudence
Gardez d’abord quelques messages comme preuve : sudo postcat -vq IDENTIFIANT > exemple.txt. Supprimez ensuite un message avec sudo postsuper -d IDENTIFIANT, ou tous les messages avec sudo postsuper -d ALL. Cette dernière commande supprime aussi les courriers légitimes en attente : vérifiez d’abord qu’il n’y en a pas, ou triez-les avant avec postqueue -p. Avec Exim, sudo exim -Mrm IDENTIFIANT supprime un message.
Relancer le service et surveiller
Relancez avec sudo systemctl start postfix, puis surveillez postqueue -p | tail -1 et sudo tail -f /var/log/mail.log plusieurs heures. Si la file regonfle, il reste une source. Limiter le débit par client (smtpd_client_message_rate_limit dans la configuration Postfix) borne les dégâts d’un compte détourné.
Demander le retrait des listes noires
Une fois la cause corrigée et l’envoi sain, vérifiez l’adresse IP auprès de Spamhaus et des autres listes, puis suivez la procédure de retrait de chacune. Retirer une IP tant que le spam continue est inutile : elle est de nouveau listée. La marche à suivre est dans la page sur l’IP du serveur en liste noire.
Questions fréquentes
Comment savoir quel script PHP envoie du spam ?
Activez mail.add_x_header = On dans php.ini, rechargez PHP-FPM ou Apache, puis lisez l’en-tête X-PHP-Originating-Script d’un message sortant : il donne l’utilisateur et le fichier. Sans cet en-tête, la journalisation mail.log de PHP, ou une recherche des fichiers appelant mail(, permet de remonter au script.
Comment vider la file d’attente Postfix ?
sudo postsuper -d ALL supprime tous les messages de la file, y compris les légitimes. Pour un tri fin, listez avec postqueue -p et supprimez par identifiant avec postsuper -d IDENTIFIANT. Conservez au moins un exemple avec postcat -vq pour l’analyse, et corrigez la cause avant, sinon la file se remplit de nouveau.
Mon serveur est-il un relais ouvert ?
Un relais ouvert accepte de transmettre du courrier de n’importe qui vers n’importe qui. Contrôlez que mynetworks ne couvre que 127.0.0.0/8 et vos réseaux de confiance, et que smtpd_relay_restrictions contient reject_unauth_destination. Un test depuis une adresse extérieure, avec un client SMTP, doit être refusé.
L’hébergeur a bloqué le port 25 : que faire ?
Corrigez d’abord la cause, puis répondez au ticket de l’hébergeur en décrivant l’origine trouvée et les mesures prises. Beaucoup d’hébergeurs rétablissent le port après vérification. Ne cherchez pas à contourner le blocage : cela retarde la réouverture.
Combien de temps reste-t-on sur une liste noire ?
Cela dépend de chaque liste : certaines expirent seules après l’arrêt du spam, d’autres exigent une demande de retrait. Vérifiez l’adresse IP sur chaque liste concernée et suivez sa procédure. Une demande sans correction préalable est rejetée ou suivie d’une nouvelle inscription.
Sources
- postsuper(1) — documentation Postfix
- postcat(1) — documentation Postfix
- Postfix Access Control Lists
- IP and Domain Reputation Checker — Spamhaus