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

141 lines
5.5 KiB
Markdown

# 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](https://gitea.alpinux.org/alpinux.cedrica5l/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
```sh
# 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`.