Mettre en place un serveur mail Stalwart sur Proxmox
Déploiement d'une VM Debian 13 avec Stalwart Mail Server, publication de mail.mprost.fr, configuration DNS, SMTP, IMAP, TLS et création d'une boîte mail auto-hébergée.
Sommaire
- Prérequis
- Création de la VM
- Installation de Debian
- Configuration du hostname et du réseau
- Installation de Stalwart
- Configuration initiale de Stalwart
- Publication de l'interface Web
- Configuration des ports mail
- Configuration DNS
- Création de la boîte mail
- Configuration TLS SMTP et IMAP
- Vérifications
- Troubleshooting
Prérequis
- Serveur Proxmox VE fonctionnel.
- ISO Debian 13 amd64.
- Domaine public
mprost.fr. - Adresse IPv4 publique.
- Possibilité de publier les ports mail depuis le routeur.
- Port TCP 25 sortant fonctionnel.
- DNS du domaine géré chez IONOS.
- Serveur Web Nginx existant sur
192.168.1.210pour publier l'interface Web de Stalwart.
Tester le port 25 sortant :
nc -v -w 10 gmail-smtp-in.l.google.com 25
Le port SMTP 25 est utilisé pour la remise entre serveurs mail. Stalwart génère également les enregistrements MX, SPF, DKIM, DMARC et de découverte nécessaires au domaine.
Création de la VM
-
Dans Proxmox, créer une VM et non un conteneur LXC.
-
Utiliser par exemple :
Nom : Mail
CPU : 2 vCPU
RAM : 2 Go
Disque : 30 Go
Réseau : vmbr0 / VirtIO
OS : Debian 13
IP : 192.168.1.211
- Activer le démarrage automatique de la VM.
Installation de Debian
-
Démarrer sur l'ISO Debian 13.
-
Pour le partitionnement, choisir :
Assisté - utiliser un disque entier
Tous les fichiers dans une seule partition
- Dans la sélection des logiciels, conserver uniquement :
SSH server
standard system utilities
-
Ne pas installer d'environnement graphique.
-
Installer GRUB sur le disque principal puis redémarrer.
-
Installer SSH si nécessaire :
apt update
apt install -y openssh-server
systemctl enable --now ssh
Configuration du hostname et du réseau
- Définir le FQDN :
hostnamectl set-hostname mail.mprost.fr
- Modifier
/etc/hosts:
nano /etc/hosts
Ajouter :
127.0.0.1 localhost
127.0.1.1 mail.mprost.fr mail
- Vérifier :
hostname
hostname -f
Résultat attendu :
mail.mprost.fr
- Configurer une IPv4 fixe :
192.168.1.211/24
- Vérifier l'accès réseau :
ip -br a
ip route
ping -c 3 1.1.1.1
Installation de Stalwart
- Mettre Debian à jour :
apt update && apt full-upgrade -y
apt install -y curl ca-certificates
- Télécharger l'installateur :
curl --proto '=https' --tlsv1.2 -sSf https://get.stalw.art/install.sh -o install.sh
- Installer Stalwart :
sh install.sh
- Récupérer le mot de passe administrateur temporaire :
journalctl -u stalwart -n 200 | grep -A8 'bootstrap mode'
- Vérifier le service :
systemctl status stalwart --no-pager
Configuration initiale de Stalwart
- Ouvrir l'assistant initial :
http://192.168.1.211:8080/admin
- Configurer l'identité du serveur :
mail.mprost.fr
-
Pour le stockage d'une petite instance, conserver le stockage local proposé par l'assistant.
-
Pour l'annuaire des comptes, choisir :
Use the internal directory
-
Conserver une journalisation de niveau
Info. -
Pour le DNS, choisir :
Manual DNS server management
- Terminer l'assistant puis redémarrer Stalwart.
Publication de l'interface Web
L'interface Web est publiée par le Nginx déjà présent sur 192.168.1.210.
- Créer l'enregistrement DNS :
A mail IP_PUBLIQUE
- Sur le serveur Web, créer :
sudo nano /etc/nginx/sites-available/mail.mprost.fr
- Ajouter :
server {
listen 80;
listen [::]:80;
server_name mail.mprost.fr;
location / {
proxy_pass http://192.168.1.211:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
- Activer le site :
sudo ln -s /etc/nginx/sites-available/mail.mprost.fr /etc/nginx/sites-enabled/mail.mprost.fr
sudo nginx -t
sudo systemctl reload nginx
- Créer le certificat HTTPS :
sudo certbot --nginx -d mail.mprost.fr
- Sur la VM Mail, définir l'URL publique :
nano /etc/stalwart/stalwart.env
Ajouter :
STALWART_PUBLIC_URL=https://mail.mprost.fr
- Redémarrer :
systemctl restart stalwart
- Vérifier les informations OAuth publiées :
curl.exe https://mail.mprost.fr/.well-known/oauth-authorization-server
Les URL retournées doivent utiliser https://mail.mprost.fr.
Configuration des ports mail
Créer les règles NAT/PAT suivantes vers la VM 192.168.1.211 :
TCP 25 -> 192.168.1.211:25
TCP 465 -> 192.168.1.211:465
TCP 993 -> 192.168.1.211:993
Les listeners par défaut de Stalwart utilisent notamment 25 pour SMTP, 465 pour SMTP Submission en TLS implicite et 993 pour IMAP en TLS implicite. citeturn199search45
Le port 443 public reste dirigé vers Nginx sur 192.168.1.210.
Vérifier les listeners :
ss -lntp | grep stalwart
Configuration DNS
- Dans Stalwart, ouvrir :
Management > Domains > Domains > mprost.fr > View Zone File
Stalwart calcule les enregistrements nécessaires et permet de les recopier manuellement lorsque le fournisseur DNS n'est pas géré automatiquement. citeturn199search46turn199search49
- Configurer l'entrée A :
A mail IP_PUBLIQUE
- Configurer le MX :
MX @ priorité 10 mail.mprost.fr
Un MX indique quel serveur reçoit les mails du domaine. citeturn199search46
- Configurer SPF :
TXT @ v=spf1 mx -all
TXT mail v=spf1 a -all
- Copier exactement les enregistrements DKIM fournis par Stalwart :
v1-ed25519-..._domainkey
v1-rsa-..._domainkey
Les valeurs p= sont des clés publiques destinées à être publiées dans le DNS pour permettre la vérification DKIM. citeturn199search49
- Configurer DMARC selon la zone fournie par Stalwart, par exemple :
TXT _dmarc v=DMARC1; p=reject; rua=mailto:postmaster@mprost.fr
- Ajouter les enregistrements SRV et d'autoconfiguration générés si souhaité :
_imaps._tcp
_submissions._tcp
autoconfig
autodiscover
- Vérifier :
nslookup -type=MX mprost.fr 1.1.1.1
nslookup -type=TXT mprost.fr 1.1.1.1
nslookup -type=TXT _dmarc.mprost.fr 1.1.1.1
Création de la boîte mail
- Dans Stalwart, ouvrir :
Directory > Accounts
- Créer le compte :
Username : contact
Domain : mprost.fr
L'adresse obtenue est :
contact@mprost.fr
-
Ajouter un mot de passe principal au compte.
-
Créer également
postmaster@mprost.frou un alias correspondant si les rapports DMARC/TLS sont envoyés à cette adresse. -
Pour un logiciel ou une application, privilégier un App Password dédié afin de pouvoir le révoquer sans changer le mot de passe principal.
Configuration TLS SMTP et IMAP
Le certificat HTTPS présenté par Nginx ne couvre pas automatiquement les connexions directes sur 465 et 993.
- Sur le serveur Nginx, vérifier le certificat Certbot :
sudo ls -l /etc/letsencrypt/live/mail.mprost.fr/
- Copier vers la VM Mail :
fullchain.pem
privkey.pem
- Importer dans Stalwart :
Settings > TLS > Certificates
-
Pour le certificat, utiliser l'intégralité de
fullchain.pem. -
Pour la clé privée, utiliser
privkey.pem. -
Redémarrer Stalwart :
systemctl restart stalwart
- Vérifier SMTP TLS :
openssl s_client -connect 192.168.1.211:465 -servername mail.mprost.fr </dev/null 2>/dev/null | grep -E 'subject=|issuer=|Verify return code'
Résultat attendu :
Verify return code: 0 (ok)
- Prévoir une synchronisation automatique du certificat lors des renouvellements Certbot.
Vérifications
- Vérifier le MX :
nslookup -type=MX mprost.fr 1.1.1.1
- Vérifier le SMTP entrant :
Test-NetConnection mail.mprost.fr -Port 25
- Vérifier IMAP et SMTP Submission :
Test-NetConnection mail.mprost.fr -Port 993
Test-NetConnection mail.mprost.fr -Port 465
- Vérifier le service :
systemctl status stalwart --no-pager
- Configurer un client mail :
IMAP : mail.mprost.fr:993 / SSL-TLS
SMTP : mail.mprost.fr:465 / SSL-TLS
Utilisateur : contact@mprost.fr
- Tester une réception depuis une adresse externe puis un envoi vers une adresse externe.
Troubleshooting
Le port 25 sortant expire
Symptôme :
Connection timed out
Solution : vérifier auprès du FAI que TCP 25 sortant n'est pas filtré avant de poursuivre l'auto-hébergement SMTP direct.
hostname -f retourne une erreur
Vérifier /etc/hosts :
127.0.1.1 mail.mprost.fr mail
Puis :
hostname -f
Unknown client id / endpoints OAuth en HTTP
Vérifier :
grep STALWART_PUBLIC_URL /etc/stalwart/stalwart.env
Attendu :
STALWART_PUBLIC_URL=https://mail.mprost.fr
Puis :
systemctl restart stalwart
502 Bad Gateway sur mail.mprost.fr
Vérifier depuis le serveur Nginx :
curl -I http://192.168.1.211:8080/
Résultat attendu :
HTTP/1.1 302 Found
location: /account
Vérifier également les IP bloquées dans Stalwart si le serveur ferme immédiatement les connexions du reverse proxy.
Certificat auto-signé sur SMTP
Symptôme :
self-signed certificate
Solution : importer le certificat public valide de mail.mprost.fr dans Stalwart puis contrôler le port 465 avec openssl s_client.