Ce tutoriel détaille la configuration d’une VM SMTP centrale sous Debian (IP publique : 15.15.15.15). Elle centralise les envois des VM du homelab via un réseau privé isolant, gère l’authentification externe, masque l’IP source résidentielle et signe les messages avec OpenDKIM.
192.168.0.0/24192.168.0.10Lancez l’installation :
sudo apt update && sudo apt install -y postfix
Lors des invites debconf (l’interface bleue), répondez :
Site Internetsmtp.mon-domaine.fr
Éditez le fichier /etc/postfix/main.cf :
sudo nano /etc/postfix/main.cf
Remplacez ou ajustez les directives suivantes :
# --- Écoute et Réseau --- inet_interfaces = all # Autoriser le localhost et tout le sous-réseau privé vmbr1 mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/24 # --- Règles de Relais --- smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination # --- Routage Mailpit (Bounces) --- relay_domains = mon-domaine.fr transport_maps = hash:/etc/postfix/transport # --- Nettoyage des En-têtes (Anonymisation) --- header_checks = regexp:/etc/postfix/header_checks # --- Filtres Milter (OpenDKIM) --- smtpd_milters = local:opendkim/opendkim.sock non_smtpd_milters = local:opendkim/opendkim.sock milter_default_action = accept
Pour masquer l’IP publique résidentielle (ex: VotreBox) dans les en-têtes Received:, créez le fichier header_checks :
sudo nano /etc/postfix/header_checks
Ajoutez cette règle pour ignorer le premier saut de votre connexion domestique (si l’ip de votre box est 90.90.90.90 :
/^Received: from .*(127\.0\.0\.1|90\.90\.90\.90)/ IGNORE
sudo apt install -y opendkim opendkim-tools
Éditez /etc/opendkim.conf :
sudo nano /etc/opendkim.conf
Syslog yes RequiredHeaders yes UMask 002 Mode sv SubDomains no Socket local:/var/spool/postfix/opendkim/opendkim.sock KeyTable refile:/etc/opendkim/KeyTable SigningTable refile:/etc/opendkim/SigningTable ExternalIgnoreList refile:/etc/opendkim/TrustedHosts InternalHosts refile:/etc/opendkim/TrustedHosts
Création du fichier TrustedHosts (IP de confiance autorisées à être signées) :
sudo nano /etc/opendkim/TrustedHosts
127.0.0.1 localhost 192.168.0.0/24
Création du fichier SigningTable (Routage des adresses vers la clé racine) :
sudo nano /etc/opendkim/SigningTable
*@smtp.mon-domaine.fr default._domainkey.mon-domaine.fr *@mon-domaine.fr default._domainkey.mon-domaine.fr
Création du fichier KeyTable (Emplacement de la clé privée) :
sudo nano /etc/opendkim/KeyTable
default._domainkey.mon-domaine.fr mon-domaine.fr:default:/etc/opendkim/keys/mon-domaine.fr/default.private
sudo mkdir -p /etc/opendkim/keys/mon-domaine.fr cd /etc/opendkim/keys/mon-domaine.fr sudo opendkim-genkey -s default -d mon-domaine.fr sudo chown -R opendkim:opendkim /etc/opendkim/keys
Créez le dossier du socket dans le chroot de Postfix et ajoutez les permissions :
sudo mkdir -p /var/spool/postfix/opendkim sudo chown opendkim:postfix /var/spool/postfix/opendkim sudo adduser postfix opendkim
Compilez la table de transport et relancez les services :
sudo postmap /etc/postfix/transport sudo systemctl restart opendkim postfix
Ajoutez ces trois entrées TXT chez votre registrar pour valider le combo SPF/DKIM/DMARC :
| Type | Hôte / Nom | Valeur |
|---|---|---|
| TXT | @ | v=spf1 ip4:15.15.15.15 ~all |
| TXT | default._domainkey | (Contenu du fichier /etc/opendkim/keys/mon-domaine.fr/default.txt) |
| TXT | _dmarc | v=DMARC1; p=quarantine; sp=REJECT; |
Testez la clé avec cette commande
opendkim-testkey -d mon-domaine.fr -s default -vvv opendkim-testkey: using default configfile /etc/opendkim.conf opendkim-testkey: checking key 'default._domainkey.mon-domaine.fr' opendkim-testkey: key secure opendkim-testkey: key OK
Si vous n’avez pas d’utilitaire comme nc, telnet ou mailx installé sur une VM cliente (comme un conteneur Docker minimaliste), vous pouvez utiliser les descripteurs de fichiers natifs de Bash pour dialoguer directement avec le serveur SMTP.
Exécutez cette commande depuis n’importe quelle VM cliente pour vérifier si le port 25 répond :
(true > /dev/tcp/192.168.0.10/25) && echo "Port Ouvert" || echo "Port Fermé"
Pour envoyer un e-mail complet en ligne de commande via /dev/tcp, ouvrez un descripteur de fichier (ici le numéro 3), injectez les commandes SMTP, puis fermez-le :
# 1. Ouverture de la connexion sur le descripteur 3 exec 3<>/dev/tcp/192.168.0.10/25 # 2. Envoi du flux SMTP (adapter les adresses) echo -e "HELO ma-vm.local" >&3 echo -e "MAIL FROM:<noreply@smtp.mon-domaine.fr>" >&3 echo -e "RCPT TO:<moi@mon-mail.com>" >&3 echo -e "DATA" >&3 echo -e "Subject: Test SMTP via /dev/tcp\n" >&3 echo -e "Ceci est un mail de test genere sans aucun outil tiers via le shell Bash." >&3 echo -e "." >&3 echo -e "QUIT" >&3 # 3. Fermeture du descripteur exec 3>&-
Pendant l’envoi, surveillez le comportement du relais et d’OpenDKIM sur la VM SMTP :
sudo journalctl -u opendkim -u postfix -f
Une transaction réussie doit afficher :
milter …: dkim_eom(): success → OpenDKIM a correctement signé le message.status=sent (250 2.0.0 OK …) → Google ou Mailpit a accepté le message.