Chapitre 09 Transport & défense de la messagerie Admin : #pSmtpQueue

Recommandation : Proxmox Mail Gateway comme couche supplémentaire devant nextxch

Une passerelle de messagerie placée en amont accepte tout le courrier provenant d'internet, le contrôle avec un second moteur antispam et antivirus indépendant et ne transmet que le courrier propre à nextxch. Cette page présente l'architecture, la mise en place pas à pas de Proxmox Mail Gateway (open source, AGPLv3) devant nextxch et les paramètres nextxch importants.

Conseil d'exploitation & note d'architecture

La passerelle est facultative : nextxch dispose de sa propre protection antispam et antivirus. Important si vous l'utilisez : ajoutez l'IP de la passerelle dans nextxch en tant que passerelle de confiance (étape 5). nextxch lit alors l'IP réelle de l'expéditeur dans l'en-tête Received de la passerelle et continue d'évaluer correctement SPF, DMARC, le greylisting et les DNSBL au lieu de contrôler l'IP de la passerelle.

Pourquoi une passerelle en amont peut être utile

  • Défense en profondeur : deux systèmes indépendants doivent faillir avant qu'un message malveillant n'atteigne une boîte aux lettres. Une faiblesse d'un seul produit ne suffit pas.
  • Second moteur antispam et antivirus : Proxmox Mail Gateway utilise ses propres règles, un filtre bayésien, SPF, DNSBL et ClamAV. Ce qu'un filtre laisse passer, l'autre l'intercepte souvent.
  • Quarantaine : les messages suspects sont retenus dans la passerelle et peuvent être examinés et libérés par les administrateurs ou les utilisateurs via le rapport de spam.
  • Découplage d'internet : seule la passerelle accepte les connexions depuis internet sur le port 25. nextxch se trouve derrière elle, avec le port 25 ouvert uniquement pour la passerelle.
  • Mise en mémoire tampon pendant la maintenance : si nextxch est brièvement indisponible pour une mise à jour ou une maintenance, la passerelle conserve les messages entrants dans sa file d'attente et les remet ensuite.

Une évaluation honnête : nextxch est livré avec sa propre protection antispam (SpamGuard avec filtre adaptatif, SPF/DKIM/DMARC/ARC, greylisting, DNSBL, heuristiques anti-hameçonnage) et intègre ClamAV. Pour la plupart des installations, cela suffit. Une passerelle en amont est facultative et devient rentable en cas d'exigences plus élevées : politiques imposant un filtrage en plusieurs étapes, quarantaine centrale, plusieurs serveurs de messagerie derrière un même MX ou séparation réseau stricte.

Architecture : Internet -> Proxmox Mail Gateway -> nextxch

L'enregistrement MX pointe vers la passerelle. Celle-ci accepte le courrier sur le port 25, le filtre et le transmet via SMTP à nextxch. En option, nextxch envoie le courrier sortant via le port interne 26 de la passerelle.

Mail flow with Proxmox Mail Gateway in front Inbound: internet to gateway on port 25, gateway to nextxch on port 25 with TLS. Outbound, optional: nextxch to gateway port 26, gateway to the internet on port 25. Internet Sending MTAs Recipient MX Proxmox Mail Gateway MX · port 25 external Receiver verification SPF · DNSBL · Greylisting Spam, viruses, quarantine Port 26 internal nextxch Port 25 from gateway only SpamGuard · ClamAV DKIM signing Mailboxes, groupware SMTP 25 · STARTTLS SMTP 25 · TLS Smart host · port 26 Delivery · port 25
Trait plein : chemin entrant (obligatoire). Pointillés : chemin sortant via la passerelle en tant que smart host (facultatif). Sans smart host, nextxch continue de remettre le courrier sortant directement via DNS MX.

Proxmox® est une marque déposée de Proxmox Server Solutions GmbH. Le nom est utilisé à titre purement descriptif ; nextxch n'est pas affilié à Proxmox Server Solutions GmbH et n'est ni approuvé ni certifié par celle-ci.

La configuration en bref

Cet ordre évite toute perte de courrier : configurez et testez d'abord complètement la passerelle, puis modifiez l'enregistrement MX, et fermez le port 25 sur nextxch en dernier.

Référence / configuration
1. Install Proxmox Mail Gateway (ISO, on Debian or as an LXC container)
2. Add relay domains (every domain nextxch accepts)
3. Default relay = nextxch host, port 25 (Mail Proxy -> Relaying)
4. Enable receiver verification, TLS and a certificate in the gateway
5. nextxch: add the gateway IP as a trusted gateway (SpamGuard)
6. Send a test message through the gateway, check Message Trace in nextxch
7. Switch the MX record to the gateway (remove the old MX only after the TTL expires)
8. Firewall: allow port 25 on nextxch from the gateway only
9. Optional outbound: gateway as smart host in nextxch (port 26, STARTTLS)

Example values on this page:
  Gateway:  pmg.company.com   203.0.113.25   (public, MX)
  nextxch:  mail.company.com  10.0.0.20      (internal, mailboxes)

1. Installer Proxmox Mail Gateway

Proxmox Mail Gateway fonctionne comme appliance autonome (installateur ISO sur matériel ou en VM), sous forme de paquets sur un système Debian existant ou comme conteneur LXC. Si vous utilisez Proxmox VE, un modèle de conteneur prêt à l'emploi est disponible dans le gestionnaire d'appliances. Vous l'administrez ensuite via l'interface web sur le port 8006.

Référence / configuration
Option A: ISO installer (hardware or VM)
  Download the ISO from proxmox.com/downloads -> boot -> run the installer
  Host name: pmg.company.com   (FQDN, matching the future MX and PTR)
  IP:        static IP, e.g. 203.0.113.25 or a DMZ address behind NAT

Option B: on an existing Debian system
  Add the Proxmox package repository and install the packages as described in
  "Install Proxmox Mail Gateway on Debian" in the PMG admin guide

Option C: LXC container in Proxmox VE
  Proxmox VE -> Storage -> CT Templates -> Templates -> section "mail"
  -> download the Proxmox Mail Gateway template -> create the container

Web interface:  https://pmg.company.com:8006   (port 8006 from the admin network only)

Repositories: without a subscription, add the "pmg-no-subscription" repository.
For production, Proxmox recommends the enterprise repository (with subscription).

2. Domaines de relais, relais par défaut et vérification des destinataires dans la passerelle

Tous les paramètres se trouvent dans l'interface web de PMG sous Configuration -> Mail Proxy. La passerelle n'accepte le courrier que pour les domaines de relais listés et le transmet au relais par défaut après filtrage.

Référence / configuration
Configuration -> Mail Proxy -> Relay Domains
  company.com
  company-group.com        (every domain configured in nextxch, including alias domains)

Configuration -> Mail Proxy -> Relaying
  Default Relay:      mail.company.com  (or 10.0.0.20)
  Relay Port:         25
  Relay Protocol:     SMTP
  Disable MX lookup:  yes               (address the nextxch host directly)

Configuration -> Mail Proxy -> Ports
  External SMTP Port: 25   (from the internet, untrusted)
  Internal SMTP Port: 26   (from nextxch, trusted, for outbound mail)

Configuration -> Mail Proxy -> Options
  Verify Receivers:   550   (reject unknown recipients right away)
  SPF:                yes
  DNSBL Sites:        e.g. zen.spamhaus.org   (observe the list's terms of use)

Several internal servers: Configuration -> Mail Proxy -> Transports
(domain or single address -> its own target server)

3. Basculer l'enregistrement MX vers la passerelle

Ne basculez qu'une fois qu'un message de test passé par la passerelle est arrivé dans nextxch (Message Trace dans /admin/). Réduisez au préalable le TTL de l'enregistrement MX à quelques minutes. Ne modifiez pas les enregistrements de nextxch lui-même (A/AAAA, PTR, Autodiscover) : les clients continuent de se connecter directement à nextxch.

Référence / configuration
; Gateway
pmg.company.com.      3600  IN  A     203.0.113.25
; PTR for 203.0.113.25 at your provider: pmg.company.com

; MX points to the gateway only
company.com.          3600  IN  MX 10 pmg.company.com.

; nextxch stays reachable for clients (IMAP, SMTP submission, webmail)
mail.company.com.     3600  IN  A     198.51.100.20

Test beforehand, without a DNS change:
  swaks --to anna.weber@company.com --server pmg.company.com --port 25 --tls

4. Sortant facultatif : la passerelle comme smart host dans nextxch

Le courrier sortant passe alors aussi par les filtres de la passerelle (par ex. analyse antivirus, statistiques). Dans l'Admin Cockpit, sous SMTP, Queue Controls & Live MX Tester (#pSmtpQueue), indiquez la passerelle comme smart host global, ou utilisez des routes SMTP pour n'envoyer que certains expéditeurs via la passerelle. Important : l'IP publique de la passerelle doit alors figurer dans l'enregistrement SPF de vos domaines, et son PTR doit correspondre au nom HELO de la passerelle.

Référence / configuration
# A) Global smart host: all outbound mail through the gateway
nextxch-cli update SmtpQueue --set outboundSmartHost=pmg.company.com \
  --set outboundSmartPort=26 --set outboundSmartHostTlsMode=StartTlsRequired

# B) Exception: one partner domain still directly via DNS MX (route without target host)
nextxch-cli create Route --set domain=partner.com --set bypassSmartHost=true \
  --set description="direct via MX, not through the gateway"

# C) Only certain senders through the gateway (#pSmtpQueue -> domain routes)
#    Destination domain:   *
#    Only for senders:     company.com, *.company.com   (SenderDomains)
#    Target host:          pmg.company.com:26           (several, comma-separated = failover)
#    TLS mode:             StartTlsRequired
#    Priority:             50                           (smaller = first; default 100)

# Add the gateway IP to the SPF record of the sender domain:
company.com.  IN  TXT  "v=spf1 mx ip4:203.0.113.25 -all"

# In the gateway: add the nextxch IP under Configuration -> Mail Proxy -> Networks
# if nextxch is not in the same subnet as the gateway.

5. Déclarer l'IP de la passerelle comme fiable dans nextxch

Une passerelle de messagerie accepte elle-même le message et le remet à nouveau. Pour nextxch, l'IP de remise est alors toujours celle de la passerelle. Pour que SPF, DMARC, le greylisting, les DNSBL et le contrôle du DNS inverse évaluent toujours l'expéditeur réel, ajoutez la passerelle sous SpamGuard & ClamAV (#pSpam) dans "Passerelles de confiance". Pour les connexions depuis ces IP, nextxch lit l'IP de l'expéditeur dans l'en-tête Received écrit par la passerelle. Les en-têtes ne sont évalués que pour les connexions depuis les IP listées : un expéditeur qui remet directement ne peut donc pas falsifier son IP de cette manière. Les TrustedProxyCidrs (Cluster:EnableProxyProtocol) sont autre chose : ils ne s'appliquent qu'aux proxys TCP comme HAProxy utilisant le protocole PROXY.

Référence / configuration
# nextxch: add the gateway as trusted (public and internal IP, CIDR allowed)
# (admin cockpit: SpamGuard & ClamAV (#pSpam) -> "Trusted gateways")
nextxch-cli update SpamGuard --set trustedRelayCidrs=203.0.113.25,10.0.0.25

# Check: send a test message through the gateway, then in the spam analyzer or Message Trace
#   TRUSTED_RELAY  Via gateway 10.0.0.25, sender IP 198.51.100.7 from Received header
#   SPF_PASS       (SPF now checked against 198.51.100.7)

# Stays active in nextxch:
#   SPF/DKIM/DMARC/ARC, greylisting, DNSBL, adaptive content filter,
#   phishing heuristics, allow/block lists, ClamAV (if enabled)

# Connection limit: all inbound mail comes from one IP.
# Check MaxConnectionsPerIp (#pSmtpQueue, default 48) for high volumes.

6. Pare-feu et TLS sur les deux segments

Fermez le port 25 sur nextxch dans le pare-feu de l'hôte ou du périmètre (Pare-feu Windows, nftables, pfSense/OPNsense). Les règles IP de nextxch ne conviennent pas, car elles s'appliquent à tous les ports SMTP à la fois et toucheraient donc aussi les ports 465 et 587 des clients. Chiffrez les deux tronçons : internet <-> passerelle et passerelle <-> nextxch.

Référence / configuration
Firewall nextxch (inbound)
  TCP 25         only from 203.0.113.25 / 10.0.0.25 (gateway)
  TCP 465, 587   clients (SMTP submission)  -> stay open
  TCP 993, 443   clients (IMAP, webmail, DAV, push) -> stay open

Firewall gateway (inbound)
  TCP 25         from the internet
  TCP 26         from nextxch only (smart host, if used)
  TCP 8006       from the admin network only

TLS internet <-> gateway
  Configuration -> Mail Proxy -> TLS: "Enable TLS" on
  Certificate: Certificates -> ACME (Let's Encrypt) for pmg.company.com

TLS gateway -> nextxch
  nextxch offers STARTTLS on port 25 with the certificate of mail.company.com
  Gateway: TLS destination policy for mail.company.com = encrypt
           (or verify if the default relay is entered as a host name)

TLS nextxch -> gateway (smart host)
  outboundSmartHostTlsMode = StartTlsRequired

7. DKIM/DMARC, greylisting et backscatter

Trois points souvent négligés en pratique. La passerelle ne doit pas modifier le courrier sortant, le greylisting ne doit s'exécuter qu'à un seul endroit et les destinataires inconnus doivent être rejetés pendant le dialogue SMTP.

Référence / configuration
DKIM / DMARC
  - nextxch signs outbound mail with DKIM. The gateway forwards it unchanged.
  - No disclaimer rule for outbound mail and no content changes in the gateway
    (otherwise the DKIM signature breaks and DMARC fails at the recipient).
  - Leave DKIM signing off in the gateway; maintain disclaimers in nextxch if needed.

Greylisting
  - Slows down spam bots but delays first messages from new senders (usually < 30 minutes per PMG docs).
  - Run it in the gateway only; behind the gateway it would be ineffective in nextxch.
  - For time-critical senders (e.g. login codes, order confirmations) use the welcomelist,
    or skip greylisting entirely if the other filters are sufficient.

Avoid backscatter
  - Verify Receivers = 550: the gateway asks nextxch via RCPT TO whether the address exists.
  - nextxch rejects unknown recipients at RCPT TO, so the check takes effect immediately.
  - Catch-all addresses in nextxch defeat the check and should be avoided.

8. Licence et coûts (au 1er novembre 2026)

Proxmox Mail Gateway est open source sous GNU AGPLv3 et entièrement utilisable sans abonnement ; les mises à jour proviennent alors du dépôt pmg-no-subscription, que Proxmox destine aux systèmes de test et hors production. Un abonnement s'applique par hôte et par an, inclut selon Proxmox un nombre illimité d'utilisateurs et de domaines, et donne accès au dépôt enterprise. Les prix ci-dessous proviennent de la page tarifaire de Proxmox et peuvent changer ; proxmox.com fait toujours foi. nextxch ne vend pas d'abonnements Proxmox.

Référence / configuration
Licence:  GNU Affero General Public License v3 (AGPLv3), since PMG 5.0

Optional subscriptions per host and year (net, per proxmox.com, as of 1 Nov 2026):
  Community    EUR 190      no ticket support (forum)
  Basic        EUR 540      5 tickets/year, response 1 business day
  Standard     EUR 1,260    15 tickets/year, response 4 hours
  Premium      EUR 1,900    unlimited tickets, response 2 hours
  (response = first reply to critical requests within business hours)

Sources:
  https://www.proxmox.com/en/products/proxmox-mail-gateway/pricing
  https://pmg.proxmox.com/pmg-docs/pmg-admin-guide.html   (admin guide 9.1.1: licence, repositories, ports)

Paramètres, valeurs par défaut & bonnes pratiques

Paramètre / emplacement Description Valeur par défaut Bonne pratique en production
PMG: Relay Domains (Mail Proxy) Liste des domaines pour lesquels la passerelle accepte et transmet le courrier. Le courrier destiné à d'autres domaines est rejeté. leer Ajoutez chaque domaine configuré dans nextxch, domaines d'alias compris. Lorsque vous ajoutez un domaine dans nextxch, ajoutez-le aussi à la passerelle.
PMG: Default Relay + Port (Mail Proxy -> Relaying) Destination du courrier entrant après filtrage (transport Postfix). Serveurs internes supplémentaires par domaine via Transports. Port 25 · SMTP mail.company.com ou 10.0.0.20, port 25, protocole SMTP. Activez "Disable MX lookup" si vous saisissez un nom d'hôte qui possède lui-même un enregistrement MX.
PMG: Verify Receivers (Mail Proxy -> Options) Vérification des destinataires : avant d'accepter, la passerelle demande à nextxch via RCPT TO si l'adresse existe et rejette les destinataires inconnus pendant le dialogue SMTP. aus Définir sur 550. Empêche le backscatter, car la passerelle n'accepte jamais de courrier pour des adresses inventées qu'elle devrait ensuite renvoyer.
PMG: TLS + Zertifikat STARTTLS pour les connexions entrantes et sortantes de la passerelle. Sans certificat propre, PMG en génère un auto-signé. TLS aus Activez TLS, obtenez un certificat de confiance via ACME (Let's Encrypt) pour pmg.company.com et définissez pour l'hôte nextxch une stratégie TLS « encrypt ».
PMG: Disclaimer & DKIM-Signatur L'action de règle Disclaimer ajoute du texte au corps du message ; DKIM Signing signe le courrier reçu sur le port interne. aus Laissez les deux désactivés. nextxch signe avec DKIM ; toute modification du contenu dans la passerelle casse la signature et donc DMARC. Gérez les clauses de non-responsabilité uniquement dans nextxch (ajoutées avant la signature).
nextxch: Smart-Host (#pSmtpQueue · outboundSmartHost) Smart host global : tout le courrier sortant est envoyé à ce relais au lieu d'aller directement au MX du destinataire. leer (direkt per MX) · Port 25 pmg.company.com, port de relais 26 (le port interne de la passerelle), mode TLS StartTlsRequired, sans SMTP AUTH. Dans la passerelle, l'IP de nextxch doit figurer sous Networks (le même sous-réseau est autorisé automatiquement).
nextxch: Route · SenderDomains Condition d'expéditeur d'une route SMTP : domaines (company.com, *.company.com) ou adresses (billing@company.com, *@company.com). Vide = tout expéditeur. leer N'envoyer que certains locataires via la passerelle : une route avec domaine de destination * et SenderDomains = company.com, hôte cible pmg.company.com:26.
nextxch: Route · Priority Ordre entre les routes de même rang ; le plus petit nombre l'emporte, puis le motif le plus spécifique. 100 Le rang prime sur la priorité : expéditeur + domaine de destination, puis domaine de destination, puis expéditeur seul (destination *), puis *, puis smart host global, puis DNS MX.
nextxch: Route · BypassSmartHost Uniquement pour les routes sans hôte cible : le courrier destiné à ce domaine passe directement par DNS MX, même si un smart host global est défini. false Pour certains domaines partenaires qui ne doivent pas passer par la passerelle. Si la route a un hôte cible, l'option est ignorée.
nextxch: Vertrauenswürdige Gateways (#pSpam · trustedRelayCidrs) IP ou réseaux CIDR des passerelles en amont. Lorsqu'une connexion en provient, nextxch prend l'IP de l'expéditeur et le HELO dans l'en-tête Received le plus haut qui n'a pas été écrit par une passerelle listée ou par localhost. leer Ajoutez l'IP publique et l'IP interne de la passerelle, par ex. 203.0.113.25 et 10.0.0.25. Uniquement vos propres passerelles : les en-têtes Received provenant des IP listées sont considérés comme fiables. L'analyseur antispam affiche alors la règle TRUSTED_RELAY avec l'IP d'expéditeur détectée.
nextxch: SPF, DKIM, DMARC & ARC, Greylisting, DNSBL (#pSpam) Avec la passerelle listée, ils contrôlent l'IP réelle de l'expéditeur. Sans elle, ils ne verraient que l'IP de la passerelle, et le SPF renverrait le plus souvent softfail ou fail pour les autres domaines. abhängig von der Konfiguration Laissez-les activés. Un contrôle à la fois dans la passerelle et dans nextxch est sans danger ; si vous voulez le greylisting à un seul endroit, conservez-le dans la passerelle et désactivez-le dans nextxch.
Firewall: Port 25 auf nextxch Après le changement de MX, seule la passerelle peut joindre nextxch sur le port 25. offen für alle Dans le pare-feu de l'hôte ou du périmètre, n'autorisez le port 25 que depuis 203.0.113.25 ou l'IP interne de la passerelle. Les ports 465, 587, 993 et 443 restent ouverts pour les clients.