====== SMTP Serveur Centrale : Relais Postfix, Masquage IP & OpenDKIM ======
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.
===== 1. Architecture Réseau & Prérequis =====
* **Réseau privé (Proxmox vmbr1) :** Plage ''192.168.0.0/24''
* **VM SMTP (Centrale) :** ''192.168.0.10''
* **VM Clientes (Docker, dbackup...) :** Autorisées via leur IP privée sur le port 25 sans authentification.
===== 2. Installation de Postfix =====
Lancez l'installation :
sudo apt update && sudo apt install -y postfix
Lors des invites ''debconf'' (l'interface bleue), répondez :
* **Type de configuration :** ''Site Internet''
* **Nom de courrier système :** ''smtp.mon-domaine.fr''
===== 3. Configuration de Postfix (main.cf) =====
É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
===== 4. Anonymisation : Masquage de l'IP Source =====
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
===== 5. Configuration d'OpenDKIM =====
==== Installation ====
sudo apt install -y opendkim opendkim-tools
==== Configuration principale ====
É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
==== Tables de correspondances ====
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
==== Génération de la clé DKIM ====
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
==== Liaison Postfix & Droits ====
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
===== 6. Finalisation et Redémarrage =====
Compilez la table de transport et relancez les services :
sudo postmap /etc/postfix/transport
sudo systemctl restart opendkim postfix
===== 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 | `@` | `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
===== 8. Tests et Débogage (Méthode Native Bash) =====
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.
==== 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 :
(true > /dev/tcp/192.168.0.10/25) && echo "Port Ouvert" || echo "Port Fermé"
==== Injection manuelle d'un e-mail en SMTP ====
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:" >&3
echo -e "RCPT TO:" >&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>&-
==== Analyse des logs en direct ====
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.