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
141 lines
5.5 KiB
Markdown
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`.
|