Architecture de référence messagerie¶
Vue d'ensemble¶
L'architecture cible repose sur Stalwart Mail Server comme composant central, avec un reverse proxy TLS en frontal, un backend d'authentification LDAP/OIDC et un DNS correctement configure.
graph TD
subgraph Internet["Internet / DMZ"]
Exp["Expediteurs externes"]
Clients["Clients email<br/>(Thunderbird, etc.)"]
Web["Clients web<br/>(navigateur)"]
end
Exp -->|SMTP:25| Proxy
Clients -->|IMAP:993 / JMAP:443| Proxy
Web -->|HTTPS:443| Proxy
Proxy["Reverse Proxy (Caddy / Nginx)<br/>Terminaison TLS, Let's Encrypt<br/>mail.company.io"]
Proxy -->|SMTP:25| Stalwart
Proxy -->|IMAP:993 / JMAP:8080| Stalwart
Proxy -->|HTTPS:8080 admin UI| Stalwart
subgraph Stalwart["Stalwart Mail Server"]
SMTP["SMTP<br/>MTA/MDA"]
IMAP["IMAP<br/>serveur"]
JMAP["JMAP<br/>serveur"]
CalDAV["CalDAV<br/>CardDAV"]
subgraph Core["Core Engine"]
AntiSpam["Anti-spam"]
DKIM["DKIM<br/>SPF/DMARC"]
Sieve["Sieve<br/>filtres"]
Queue["Queue<br/>manager"]
end
Storage["Storage Layer<br/>RocksDB | PostgreSQL | S3"]
end
Stalwart --> Keycloak["Keycloak<br/>LDAP/OIDC"]
Stalwart --> DNS["CoreDNS<br/>MX/SPF/DKIM/DMARC"]
Stalwart --> Monitoring["Prometheus<br/>+ Grafana"] Composants Stalwart¶
Binaire unique, multi-protocoles¶
Stalwart est compile en un seul binaire Rust qui expose tous les protocoles nécessaires :
| Protocole | Port par defaut | Usage |
|---|---|---|
| SMTP | 25 | Reception des emails entrants |
| SMTP soumission | 587 (STARTTLS), 465 (TLS implicite) | Envoi des emails par les clients |
| IMAP | 993 (TLS), 143 (STARTTLS) | Consultation des boites aux lettres |
| JMAP | 8080 (HTTP) | Consultation moderne (HTTP/JSON) |
| ManageSieve | 4190 | Gestion des filtres Sieve |
| CalDAV/CardDAV | 8080 (HTTP) | Calendriers et contacts |
| Admin API | 8080 (HTTP) | Administration REST + Web UI |
Moteur anti-spam integre¶
Stalwart integre un filtre anti-spam compatible avec les regles rspamd. Il effectue les verifications suivantes a la reception de chaque email :
- Vérification SPF : l'IP de l'expéditeur est-elle autorisee ?
- Vérification DKIM : la signature cryptographique est-elle valide ?
- Vérification DMARC : SPF et/ou DKIM sont-ils alignes avec le domaine From ?
- ARC : si l'email a ete relaye, la chaîne ARC est-elle valide ?
- DNS blocklists : l'IP de l'expéditeur est-elle listee dans des RBL ?
- Analyse du contenu : scoring bayesien, patterns de spam
- Rate limiting : limitation du débit par expéditeur
Couche de stockage¶
Stalwart supporte plusieurs backends de stockage, choisis en fonction du volume :
| Backend | Cas d'usage | Données stockees | Performance |
|---|---|---|---|
| RocksDB | < 500 boites, déploiement simple | Tout (index + blobs) | Tres elevee (local) |
| PostgreSQL | > 500 boites, HA | Index, metadonnees | Elevee |
| MySQL | Existant MySQL | Index, metadonnees | Elevee |
| S3 | Stockage blob deporte | Corps des emails, pieces jointes | Variable (réseau) |
| SQLite | Développement, test | Tout (fichier unique) | Moyenne |
Combinaison recommandee pour la production
Pour un déploiement de production avec HA : PostgreSQL pour les index et metadonnees + S3 (MinIO auto-heberge) pour les blobs (corps des emails et pieces jointes). RocksDB pour les déploiements simples < 500 boites.
Configuration DNS pour la messagerie¶
Ensemble complet des enregistrements¶
Un domaine de messagerie correctement configure necessite les enregistrements DNS suivants :
; === Enregistrements MX ===
company.io. 300 IN MX 10 mail.company.io.
company.io. 300 IN MX 20 mail-backup.company.io.
; === Enregistrements A/AAAA du serveur mail ===
mail.company.io. 300 IN A 203.0.113.10
mail.company.io. 300 IN AAAA 2001:db8::10
mail-backup.company.io. 300 IN A 203.0.113.11
; === SPF — IP autorisees a envoyer ===
company.io. 300 IN TXT "v=spf1 mx a:mail.company.io -all"
; === DKIM — cle publique de signature ===
default._domainkey.company.io. 300 IN TXT (
"v=DKIM1; k=ed25519; p=<base64-public-key>"
)
; === DMARC — politique d'authentification ===
_dmarc.company.io. 300 IN TXT (
"v=DMARC1; p=reject; "
"rua=mailto:dmarc-reports@company.io; "
"ruf=mailto:dmarc-forensic@company.io; "
"adkim=s; aspf=s; pct=100"
)
; === MTA-STS — forcer TLS pour les connexions SMTP entrantes ===
_mta-sts.company.io. 300 IN TXT "v=STSv1; id=20260416"
mta-sts.company.io. 300 IN A 203.0.113.10
; === TLSRPT — rapports TLS ===
_smtp._tls.company.io. 300 IN TXT (
"v=TLSRPTv1; rua=mailto:tls-reports@company.io"
)
; === Autoconfig / Autodiscover ===
autoconfig.company.io. 300 IN CNAME mail.company.io.
_autodiscover._tcp.company.io. 300 IN SRV 0 0 443 mail.company.io.
; === Reverse DNS (PTR) — critique pour la deliverabilite ===
; Configure chez le fournisseur d'hebergement/IP
10.113.0.203.in-addr.arpa. 300 IN PTR mail.company.io.
Vérification des enregistrements¶
# Verifier MX
dig company.io MX +short
# Attendu : 10 mail.company.io.
# Verifier SPF
dig company.io TXT +short | grep spf
# Attendu : "v=spf1 mx a:mail.company.io -all"
# Verifier DKIM
dig default._domainkey.company.io TXT +short
# Attendu : "v=DKIM1; k=ed25519; p=..."
# Verifier DMARC
dig _dmarc.company.io TXT +short
# Attendu : "v=DMARC1; p=reject; ..."
# Verifier reverse DNS
dig -x 203.0.113.10 +short
# Attendu : mail.company.io.
Reverse proxy et terminaison TLS¶
Pourquoi un reverse proxy ?¶
Le reverse proxy assure la terminaison TLS et la distribution du trafic vers Stalwart :
| Flux | Port entrant | Reverse proxy | Port Stalwart |
|---|---|---|---|
| SMTP entrant | 25 | Pass-through | 25 |
| SMTP soumission TLS | 465 | Pass-through | 465 |
| SMTP soumission START | 587 | Pass-through | 587 |
| IMAP TLS | 993 | Pass-through | 993 |
| JMAP / Admin / CalDAV | 443 | TLS → HTTP | 8080 |
TLS pour les protocoles mail
Pour SMTP et IMAP, le reverse proxy fonctionne en TCP pass-through (layer 4) car Stalwart gère lui-même le TLS pour ces protocoles. Seul le trafic HTTP (JMAP, CalDAV, Admin) est termine par le reverse proxy.
Configuration Caddy¶
Pour les protocoles mail (SMTP, IMAP), utiliser un load balancer TCP (HAProxy, Caddy L4) ou exposer directement les ports de Stalwart.
Dimensionnement¶
Guide de sizing¶
| Profil | Utilisateurs | CPU | RAM | Stockage | Backend |
|---|---|---|---|---|---|
| Petit (startup) | 1-50 | 2 vCPU | 2 Go | 50 Go SSD | RocksDB |
| Moyen (PME) | 50-500 | 4 vCPU | 4 Go | 200 Go SSD | RocksDB |
| Grand (entreprise) | 500-5000 | 8 vCPU | 8 Go | 1 To SSD | PostgreSQL + S3 |
| Tres grand (multi-site) | 5000+ | 16+ vCPU | 16+ Go | S3 illimité | PostgreSQL + S3 + clustering |
Estimation du stockage¶
| Facteur | Valeur typique |
|---|---|
| Taille moyenne d'un email | 75 Ko (sans pieces jointes) |
| Avec pieces jointes | 500 Ko en moyenne |
| Emails reçus par jour | 50-100 par utilisateur |
| Croissance annuelle | ~15-20 Go par utilisateur |
| Retention typique | 3-7 ans (selon politique) |
# Estimation pour 200 utilisateurs, 5 ans de retention
200 users x 17.5 Go/an x 5 ans = 17.5 To
+ 30% overhead (index, logs) = ~23 To
Prevoir la croissance
Le stockage email croit lineairement et ne diminue jamais (sauf politique de retention active). Prevoir 2x le volume estime pour absorber les pics et les imprevisibles (migrations, archives).
Flux réseau¶
Ports a ouvrir¶
| Source | Destination | Port | Protocole | Direction | Remarque |
|---|---|---|---|---|---|
| Internet | Reverse proxy | 25/TCP | SMTP | Entrant | Reception des emails |
| Internet | Reverse proxy | 443/TCP | HTTPS | Entrant | JMAP, CalDAV, Admin |
| Réseau interne | Stalwart | 993/TCP | IMAPS | Entrant | Consultation des boites |
| Réseau interne | Stalwart | 465/TCP | SMTPS | Entrant | Soumission des emails |
| Réseau interne | Stalwart | 587/TCP | SMTP+STARTTLS | Entrant | Soumission (legacy) |
| Réseau interne | Stalwart | 4190/TCP | ManageSieve | Entrant | Gestion des filtres |
| Stalwart | Internet | 25/TCP | SMTP | Sortant | Livraison des emails |
| Stalwart | Keycloak | 443/TCP | HTTPS | Sortant | Authentification OIDC/LDAP |
| Stalwart | CoreDNS | 53/UDP | DNS | Sortant | Résolution MX, SPF, DKIM |
| Stalwart | PostgreSQL | 5432/TCP | PostgreSQL | Sortant | Stockage (si externe) |
| Stalwart | MinIO (S3) | 9000/TCP | HTTPS | Sortant | Stockage blobs (si S3) |
| Prometheus | Stalwart | 8080/TCP | HTTP | Entrant | Collecte des metriques |
Zones réseau¶
graph LR
subgraph DMZ
Proxy["Reverse proxy<br/>(SMTP in, HTTPS)"]
end
subgraph Interne["Reseau interne"]
Stalwart["Stalwart<br/>(tous ports)"]
Services["Keycloak,<br/>PostgreSQL,<br/>CoreDNS"]
Stalwart --> Services
end
Proxy --> Stalwart SMTP entrant en DMZ uniquement
Le port 25 entrant (reception des emails depuis Internet) doit etre expose exclusivement dans la DMZ via le reverse proxy. Les clients internes utilisent les ports 465/587 pour la soumission, jamais le port 25 directement.
Synthese¶
L'architecture Stalwart se distingue par sa simplicité : un seul binaire qui expose SMTP, IMAP, JMAP, CalDAV et l'administration. Le reverse proxy assure la terminaison TLS pour le trafic HTTP, tandis que Stalwart gère lui-même le TLS pour les protocoles mail. Le dimensionnement depend principalement du nombre d'utilisateurs et de la politique de retention. Le chapitre suivant detaille l'installation et la configuration.