alpinux-owni/docs/courrier-sortant.md
Cédrix 89cc919906 Absorber alpinux-infra : un seul dépôt pour la machine
Il y avait deux dépôts d'infrastructure et aucune frontière entre eux. La
seule distinction défendable — « documentation » d'un côté, « fichiers de
configuration » de l'autre — ne tenait plus : infra avait fini par contenir
plus de documentation qu'owni, pendant qu'owni décrivait du concret (IP,
bases, comptes).

Tout vient donc ici : conf/ (vhosts de référence), dns/ (export de zone),
services/ (units systemd), scripts/ (sauvegarde) et docs/ (courrier sortant,
certificats, sauvegardes, et le déploiement par service).

Dans ce sens plutôt que l'inverse parce qu'« owni » nomme la machine, là où
« infra » ne dit pas de quoi il s'agit — et c'est le nom que Cédric emploie
spontanément, y compris pour le dossier de secrets.

Les renvois croisés entre les deux dépôts deviennent des liens internes : un
lien vers un dépôt qu'on s'apprête à archiver aurait pourri en silence.

Reste une incohérence, signalée plutôt que corrigée à la hâte :
docs/admin.md, static.md, wiki.md, dynamic.md et proxy-calendar.md décrivent
le déploiement de sites, pas la machine. Ils ont la même place ici que celle
que la messagerie n'avait pas — ils devraient rejoindre leurs dépôts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SFbwnJurBwTs7x7t93ecku
2026-09-27 12:55:45 +02:00

5.5 KiB

Courrier sortant d'owni

Ce qui vaut pour tout le courrier de la machine, quel que soit le service qui l'émet — messagerie, Dolibarr, Gitea, avis système. Ce qui est propre à l'application de publipostage est dans son dépôt, alpinux.messagerie : en-têtes de liste, classement des rebonds, masquage des adresses, hygiène de liste.

État au 27/09/2026.

Tout sort par un relais

Depuis les 25-26 septembre 2026, Postfix ne remet plus directement :

relayhost = [mail.acemail.fr]:587
smtp_sasl_auth_enable = yes
IP qui parle aux destinataires 176.9.125.188 (le relais)
IP de la machine 51.91.79.148 — n'émet plus
Compte de soumission messagerie@alpinux.org

Vérifié dans les logs : les messages de campagne sortent bien par mail.acemail.fr[176.9.125.188]:587.

Trois conséquences

La réputation d'expéditeur n'est plus la nôtre seule. Un rejet de plus compte contre une IP partagée avec les autres clients de l'hébergeur. Cela rend l'hygiène de liste plus impérative, pas moins.

Le blocage Microsoft sur 51.91.79.148 n'a plus d'objet. Cette IP n'émet plus ; la demande de délistage a été abandonnée pour cette raison.

Un plafond d'envoi s'ajoute, celui du relais, et il n'est pas connu. Le franchir ne produirait aucune erreur applicative : les messages s'accumuleraient en status=deferred dans la file de Postfix, avec un code 4.x.x venu du relais.

L'enveloppe doit survivre au relais

La messagerie utilise des adresses de retour variables — bounce+<référence>@alpinux.org — pour savoir quel envoi a rebondi. Un relais authentifié réécrit volontiers l'enveloppe, soit pour la faire correspondre au compte SASL, soit en SRS.

Vérifié le 27/09/2026 : celui-ci la préserve. Un message parti par le relais portait bien Return-Path: <bounce+…@alpinux.org> à l'arrivée.

À revérifier après tout changement chez l'hébergeur du relais. La panne serait silencieuse : aucune erreur, aucun log, simplement plus un seul rebond relevé — et une liste qui se dégrade sans que rien ne le signale.

Le symptôme à guetter en base : des rebonds qui arrivent tous orphelins, non rattachés à leur envoi.

DNS du courrier

SPF    v=spf1 a mx include:_spf.acemail.fr -all
DKIM   sélecteur « default », 2048 bits, signé par owni avant le relais
DMARC  v=DMARC1; p=quarantine; pct=100; rua=mailto:postmaster@alpinux.org; aspf=r
MX     10 owni.alpinux.org

_spf.acemail.fr autorise ip4:176.9.125.188 : le relais est donc couvert.

DKIM est signé par owni avant la remise au relais. C'est lui qui aligne DMARC si SPF venait à échouer — par exemple si l'hébergeur changeait d'IP sans mettre son SPF à jour.

Ne pas rouvrir l'IPv6 sortante sans précaution

L'envoi est forcé en IPv4 (-o inet_protocols=ipv4 sur le transport smtp de master.cf). L'IPv6 a été ouverte le 21/09/2026 et refermée le 22 : en vingt-quatre heures, 2001:41d0:404:200::3f85 s'est fait lister par Spamhaus (CSS et XBL) et Gandi rejetait en 554. Une IP neuve qui se met à émettre des campagnes est exactement le profil que cible la liste CSS.

Postfix ne se replie pas en IPv4 quand un MX rejette en dur : le message rebondit sèchement.

Limites de débit

Où Réglage Protège de
Postfix, soumission smtpd_client_message_rate_limit = 400/h un compte compromis
Postfix, sortie smtp_destination_rate_delay = 1 s le 450 des MX distants
Relais, en aval inconnue ce qu'on ignore

Le compteur de Postfix est partagé par tous les services de la machine — portail, Gitea, Dolibarr, messagerie. Un service qui s'emballe pénalise les autres.

Profil réel mesuré le 24/09/2026 : une campagne de 254 messages en 10 minutes, soit environ 25 par minute. C'est ce débit instantané qu'il faut confronter aux limites du relais, pas une moyenne horaire.

Les boîtes du service

alpinux.org est un domaine virtuel (virtual_mailbox_domains en MySQL, livraison LMTP vers Dovecot) : /etc/aliases ne s'y applique pas. Une adresse qui doit recevoir a besoin d'une vraie boîte.

Boîte Reçoit
bounce@alpinux.org les rapports de non-remise, via VERP
postmaster@alpinux.org rapports DMARC, plaintes FBL, courrier d'opérateur
abuse@alpinux.org alias de postmaster@ (RFC 2142)
messagerie@alpinux.org expédie, et reçoit les réponses humaines

recipient_delimiter = + est actif : tout ce qui arrive sur bounce+<ref>@alpinux.org tombe dans bounce@, l'adresse complète restant lisible dans Delivered-To. Le VERP en dépend entièrement.

Vérifier

# Par où sort le courrier
postconf -h relayhost sender_canonical_maps smtp_generic_maps recipient_delimiter

# Ce que les destinataires voient réellement
dig +short TXT alpinux.org | grep spf
dig +short TXT _dmarc.alpinux.org
dig +short TXT _spf.acemail.fr

# Les remises récentes, et par quel relais
sudo grep "relay=" /var/log/mail.log | grep -oE "relay=[^,]*" | sort | uniq -c | sort -rn | head

# Les messages différés : le symptôme d'un plafond atteint
sudo grep "status=deferred" /var/log/mail.log | tail -5

Le miroir le plus utile reste les rapports DMARC : les logs disent ce qui est parti, les rapports disent ce qui est arrivé, vu d'en face — y compris ce qui est parti sans qu'on le sache. Ils sont dépouillés par la messagerie et consultables sur /postmaster.