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 headerchecks → OpenDKIM a correctement signé le message.
:
<code>
sudo nano /etc/postfix/header_checks
</code>
Ajoutez cette règle pour ignorer le premier saut de votre connexion domestique (si l’ip de votre box est 90.90.90.90 :
<code>
/^Received: from .*(127.0.0.1|90.90.90.90)/ IGNORE
</code>
===== 5. Configuration d’OpenDKIM =====
==== Installation ====
<code>
sudo apt install -y opendkim opendkim-tools
</code>
==== Configuration principale ====
Éditez /etc/opendkim.conf :
<code>
sudo nano /etc/opendkim.conf
</code>
<code ini>
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
</code>
==== Tables de correspondances ====
1. Create du fichier TrustedHosts (IP de confiance autorisées à être signées) :
<code>
sudo nano /etc/opendkim/TrustedHosts
</code>
<code>
127.0.0.1
localhost
192.168.0.0/24
</code>
2. Création du fichier SigningTable (Routage des adresses vers la clé racine) :
<code>
sudo nano /etc/opendkim/SigningTable
</code>
<code>
@smtp.mon-domaine.fr default.domainkey.mon-domaine.fr
*@mon-domaine.fr default.domainkey.mon-domaine.fr
</code>
3. Création du fichier KeyTable (Emplacement de la clé privée) :
<code>
sudo nano /etc/opendkim/KeyTable
</code>
<code>
default._domainkey.mon-domaine.fr mon-domaine.fr:default:/etc/opendkim/keys/mon-domaine.fr/default.private
</code>
==== Génération de la clé DKIM ====
<code>
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
</code>
==== Liaison Postfix & Droits ====
Créez le dossier du socket dans le chroot de Postfix et ajoutez les permissions :
<code>
sudo mkdir -p /var/spool/postfix/opendkim
sudo chown opendkim:postfix /var/spool/postfix/opendkim
sudo adduser postfix opendkim
</code>
===== 6. Finalisation et Redémarrage =====
Compilez la table de transport et relancez les services :
<code>
sudo postmap /etc/postfix/transport
sudo systemctl restart opendkim postfix
</code>
===== 7. Enregistrements DNS Publiques (Zone DNS) =====
Ajoutez ces trois entrées TXT chez votre registrar pour valider le combo SPF/DKIM/DMARC :
^ Type ^ Hôte / Nom ^ Valeur ^
| TXT | nc@ | 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; |
===== 8. Tests et Débogage (Méthode Native Bash) =====
Si vous n’avez pas d’utilitaire comme , 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.
==== Test d’ouverture de flux (Socket TCP) ====
Exécutez cette commande depuis n’importe quelle VM cliente pour vérifier si le port 25 répond :
<code>
(true > /dev/tcp/192.168.0.10/25) && echo “Port Ouvert” || echo “Port Fermé”
</code>
==== Injection manuelle d’un e-mail en SMTP ====
Pour envoyer un e-mail complet en ligne de commande via milter …: dkimeom(): success/dev/tcp, ouvrez un descripteur de fichier (ici le numéro 3), injectez les commandes SMTP, puis fermez-le :
<code>
# 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>&-
</code>
==== Analyse des logs en direct ====
Pendant l’envoi, surveillez le comportement du relais et d’OpenDKIM sur la VM SMTP :
<code>
sudo journalctl -u opendkim -u postfix -f
</code>
Une transaction réussie doit afficher :
*
status=sent (250 2.0.0 OK …) → Google ou Mailpit a accepté le message.