Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung E-Mail / Mailserver 15.06.2026 · 10 min Lesezeit

Kompletten Mailserver nativ aufsetzen: Postfix, Dovecot und Rspamd ohne Docker

Einen vollständigen SMTP/IMAP-Mailserver mit modernem Spamfilter direkt auf Ubuntu oder Debian aufsetzen – ohne Mailcow-Docker-Wrapper, mit vollem Zugriff auf alle Postfix-, Dovecot- und Rspamd-Konfigurationsdateien und sauberer systemd-Integration.

Moderne IT-Grafik zur Anleitung für einen nativen Mailserver mit Postfix, Dovecot und Rspamd ohne Docker, inklusive Mailfluss, Terminal, Spamfilter und Serverstruktur.

Wer einen eigenen Mailserver betreiben möchte, greift heute oft zu Mailcow oder docker-mailserver – fertige Docker-Stacks, die in einer Stunde laufen. Der Preis: Du startest in eine Blackbox. Konfigurationsdateien liegen tief in Volumes, Updates passieren am Container-Rand, und ein einfaches grep durch /etc/postfix/ endet im Nichts. Diese Anleitung zeigt den anderen Weg: Postfix, Dovecot und Rspamd direkt auf dem System installieren – als native systemd-Dienste, alle Konfigurationsdateien unter /etc/ greifbar, kein Container-Wrapper dazwischen. Das ist mehr Arbeit beim Einrichten, zahlt sich aber langfristig aus: volle Kontrolle, direktes Troubleshooting, minimaler Overhead.

Voraussetzungen

  1. Ubuntu 22.04 LTS / 24.04 LTS oder Debian 11 (Bullseye) / Debian 12 (Bookworm) – frische Server-Installation
  2. Dedizierter Server oder VPS mit statischer IPv4-Adresse; Reverse-DNS/PTR-Eintrag muss auf mail.example.org zeigen
  3. Eigene Domain mit Zugriff auf die DNS-Verwaltung (MX-, TXT- und CNAME-Records setzen)
  4. Mindestens 1 GB RAM (empfohlen 2 GB+) – Rspamd, Redis, Dovecot und Postfix laufen gleichzeitig
  5. Port 25 durch den Hoster nicht gesperrt – bei vielen günstigen VPS-Anbietern standardmäßig gesperrt, vorher prüfen
  6. Root- oder sudo-Zugang per SSH; grundlegende Linux-Kenntnisse (Dateien bearbeiten, systemctl, journalctl)
  7. Gültige E-Mail-Adresse für Let's-Encrypt-Benachrichtigungen
  8. MySQL oder MariaDB bereits installiert und gesichert (für virtuelle Mailbox-Datenbank)

Schritt 1: Pakete installieren

Als Erstes installierst du alle benötigten Pakete. Rspamd kommt dabei nicht aus dem Ubuntu-Universe-Repo – das kann deutlich veraltet sein. Verwende immer das offizielle APT-Repository von rspamd.com:

sudo apt update && sudo apt install -y \
  postfix postfix-mysql \
  dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-managesieved \
  redis-server certbot

# Rspamd offizielles Repository einbinden (Ubuntu 20.04+ / Debian 11+)
curl -fsSL https://rspamd.com/apt-stable/gpg.key | \
  sudo gpg --dearmor -o /usr/share/keyrings/rspamd.gpg

echo "deb [signed-by=/usr/share/keyrings/rspamd.gpg] https://rspamd.com/apt-stable/ $(lsb_release -cs) main" | \
  sudo tee /etc/apt/sources.list.d/rspamd.list

sudo apt update && sudo apt install -y rspamd

Während der Postfix-Installation wähle den Typ „Internet-Site" und trage deinen vollständigen Hostnamen (mail.example.org) ein.

Verifizieren: postfix --version, dovecot --version und rspamd --version geben die installierten Versionen aus. Rspamd sollte mindestens Version 3.x zeigen.

Schritt 2: TLS-Zertifikat und vmail-Benutzer anlegen

Postfix und Dovecot benötigen ein gültiges TLS-Zertifikat. Certbot besorgt es kostenlos von Let's Encrypt. Stelle sicher, dass Port 80 für die Challenge erreichbar ist:

sudo certbot certonly --standalone -d mail.example.org

Danach richtest du einen dedizierten Systembenutzer für virtuelle Mailboxen ein. Alle Mails landen unter /var/mail/vhosts/ und gehören diesem Benutzer:

sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /var/mail
sudo mkdir -p /var/mail/vhosts/example.org
sudo chown -R vmail:vmail /var/mail

Erstelle außerdem einen Post-Renewal-Hook, damit Postfix und Dovecot nach der automatischen Zertifikatserneuerung neu geladen werden – sonst laufen die Dienste mit dem alten Zertifikat weiter:

sudo tee /etc/letsencrypt/renewal-hooks/post/reload-mail.sh <<'EOF'
#!/bin/bash
systemctl reload postfix dovecot
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/post/reload-mail.sh

Verifizieren: ls /etc/letsencrypt/live/mail.example.org/ zeigt fullchain.pem und privkey.pem.

Schritt 3: Postfix konfigurieren

Die zentrale Konfiguration liegt in /etc/postfix/main.cf. Passe die folgenden Parameter an – ersetze example.org durchgängig durch deine echte Domain:

# /etc/postfix/main.cf – Kernkonfiguration
myhostname = mail.example.org
mydomain = example.org
myorigin = $mydomain
inet_interfaces = all
mydestination =

# Virtuelle Mailboxen per MySQL
virtual_mailbox_domains = mysql:/etc/postfix/mysql-mailbox-domains.cf
virtual_mailbox_maps    = mysql:/etc/postfix/mysql-mailbox-maps.cf
virtual_alias_maps      = mysql:/etc/postfix/mysql-alias-maps.cf
virtual_transport       = lmtp:unix:private/dovecot-lmtp

# TLS
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.org/fullchain.pem
smtpd_tls_key_file  = /etc/letsencrypt/live/mail.example.org/privkey.pem
smtpd_tls_security_level = may
smtp_tls_security_level  = may

# SASL-Authentifizierung via Dovecot
smtpd_sasl_type             = dovecot
smtpd_sasl_path             = private/auth
smtpd_sasl_auth_enable      = yes
smtpd_sasl_security_options = noanonymous
recipient_delimiter         = +

# Rspamd als Milter einbinden
smtpd_milters        = inet:localhost:11332
non_smtpd_milters    = $smtpd_milters
milter_default_action = accept
milter_protocol      = 6

Wichtig: mydestination bleibt leer oder enthält nur localhost. Virtuelle Domains dort einzutragen ist ein häufiger Fehler – Postfix würde sie dann lokal zustellen statt über die MySQL-Maps.

Für den Submission-Port 587 ergänze in /etc/postfix/master.cf die folgende Sektion (die Zeile submission ist oft schon auskommentiert vorhanden):

# /etc/postfix/master.cf – Submission Port 587
submission inet n - y - - smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

Verifizieren: sudo postfix check darf keine Fehler ausgeben.

Schritt 4: MySQL-Lookup-Maps anlegen

Postfix fragt Domains, Benutzer und Aliase aus MySQL ab. Lege drei Konfigurationsdateien an – hier exemplarisch für Domains:

# /etc/postfix/mysql-mailbox-domains.cf
user     = mailuser
password = sicheres_passwort
hosts    = 127.0.0.1
dbname   = mailserver
query    = SELECT 1 FROM virtual_domains WHERE name='%s'
# /etc/postfix/mysql-mailbox-maps.cf
user     = mailuser
password = sicheres_passwort
hosts    = 127.0.0.1
dbname   = mailserver
query    = SELECT maildir FROM virtual_users WHERE email='%s'
# /etc/postfix/mysql-alias-maps.cf
user     = mailuser
password = sicheres_passwort
hosts    = 127.0.0.1
dbname   = mailserver
query    = SELECT destination FROM virtual_aliases WHERE source='%s'
sudo chmod 640 /etc/postfix/mysql-*.cf
sudo chown root:postfix /etc/postfix/mysql-*.cf

Verifizieren: Sobald ein Domain-Eintrag in der Datenbank vorhanden ist, liefert postmap -q example.org mysql:/etc/postfix/mysql-mailbox-domains.cf den Wert 1 zurück.

Schritt 5: Dovecot konfigurieren

Dovecot übernimmt drei Aufgaben: Nachrichten per LMTP von Postfix entgegennehmen, im Maildir-Format speichern und per IMAPS an Clients ausliefern. Passe die wichtigsten Konfigurationsdateien an:

# /etc/dovecot/conf.d/10-mail.conf
mail_location        = maildir:/var/mail/vhosts/%d/%n/
mail_privileged_group = mail
# /etc/dovecot/conf.d/10-ssl.conf
ssl      = required
ssl_cert = </etc/letsencrypt/live/mail.example.org/fullchain.pem
ssl_key  = </etc/letsencrypt/live/mail.example.org/privkey.pem

In /etc/dovecot/conf.d/10-master.conf definierst du die beiden Unix-Sockets für den Postfix-Austausch. Achte besonders auf die Berechtigungen – falsche Werte verhindern die Zustellung:

# /etc/dovecot/conf.d/10-master.conf – LMTP- und Auth-Socket
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode  = 0600
    user  = postfix
    group = postfix
  }
}

service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode  = 0660
    user  = postfix
    group = postfix
  }
}

# Unverschlüsseltes IMAP auf Port 143 deaktivieren
service imap-login {
  inet_listener imap {
    port = 0
  }
}

Für die SQL-Authentifizierung konfigurierst du /etc/dovecot/dovecot-sql.conf.ext mit deinen Datenbankzugangsdaten und der passenden Passwort-Query. Dovecot unterstützt SHA512-CRYPT oder Argon2-Hashes, die du mit doveadm pw -s SHA512-CRYPT erzeugst.

Verifizieren: sudo doveconf -n zeigt die aktive Konfiguration ohne Kommentare. sudo doveadm log find zeigt den Logpfad.

Schritt 6: Rspamd und Redis konfigurieren

Rspamd-Konfigurationen gehören ausschließlich nach /etc/rspamd/local.d/ oder /etc/rspamd/override.d/ – nie direkt in /etc/rspamd/. Dateien dort werden bei jedem Paket-Update überschrieben.

Zuerst die Milter-Konfiguration, damit Postfix Nachrichten an Rspamd übergeben kann:

# /etc/rspamd/local.d/worker-proxy.inc
milter  = yes;
timeout = 120s;
upstream "local" {
  default   = yes;
  self_scan = yes;
}
# /etc/rspamd/local.d/redis.conf
servers = "127.0.0.1:6379";
# /etc/rspamd/local.d/actions.conf
reject     = 15;
add_header = 6;
greylist   = 4;

Redis selbst muss auf localhost gebunden und mit einem Speicherlimit abgesichert sein:

# /etc/redis/redis.conf – relevante Zeilen anpassen
bind 127.0.0.1
maxmemory 500mb
maxmemory-policy volatile-ttl

Setze ein Passwort für das Rspamd-Web-UI auf Port 11334. Der Hash wird mit dem mitgelieferten Werkzeug erzeugt:

rspamadm pw

Den ausgegebenen Hash trägst du in /etc/rspamd/local.d/worker-controller.inc ein:

# /etc/rspamd/local.d/worker-controller.inc
password = "$2$<generierter-hash>";

Verifizieren: sudo rspamadm configtest muss mit syntax OK abschließen.

Schritt 7: DKIM-Schlüssel generieren und DNS-Records setzen

Rspamd signiert ausgehende Mails mit DKIM. Der private Schlüssel liegt unter /var/lib/rspamd/dkim/ und muss dem Rspamd-Benutzer gehören:

sudo mkdir -p /var/lib/rspamd/dkim
sudo rspamadm dkim_keygen -s mail -d example.org \
  -k /var/lib/rspamd/dkim/example.org.mail.key
sudo chown _rspamd /var/lib/rspamd/dkim/example.org.mail.key
sudo chmod 400 /var/lib/rspamd/dkim/example.org.mail.key

Den ausgegebenen öffentlichen Schlüssel veröffentlichst du als DNS-TXT-Record unter mail._domainkey.example.org. Danach aktivierst du das DKIM-Signing:

# /etc/rspamd/local.d/dkim_signing.conf
domain {
  example.org {
    path     = "/var/lib/rspamd/dkim/example.org.mail.key";
    selector = "mail";
  }
}

Für jeden Maildomain benötigst du außerdem diese vier DNS-Records:

Record-TypNameWert (Beispiel)
MXexample.org10 mail.example.org
TXT (SPF)example.orgv=spf1 mx ~all
TXT (DKIM)mail._domainkey.example.orgv=DKIM1; k=rsa; p=<öffentlicher Schlüssel>
TXT (DMARC)_dmarc.example.orgv=DMARC1; p=reject; rua=mailto:dmarc@example.org

Verifizieren: dig TXT mail._domainkey.example.org gibt den DKIM-Schlüssel zurück. dig TXT example.org zeigt den SPF-Record.

Schritt 8: Dovecot Sieve-Spamfilter einrichten

Rspamd setzt auf gefilterten Nachrichten den Header X-Spam: Yes. Ein globales Sieve-Skript weist Dovecot an, diese Nachrichten automatisch in den Junk-Ordner zu sortieren. Lege die Datei an und aktiviere sie:

sudo tee /var/mail/vhosts/sieve/global.sieve <<'EOF'
require ["fileinto"];
if header :is "X-Spam" "Yes" {
    fileinto "Junk";
}
EOF

In /etc/dovecot/conf.d/90-sieve.conf trägst du das globale Skript als sieve_global_path ein.

Schritt 9: Alle Dienste starten und aktivieren

Jetzt aktivierst du alle vier systemd-Units, damit sie nach dem Start und bei jedem Reboot automatisch laufen:

sudo systemctl enable --now redis-server rspamd postfix dovecot

Verifizieren: sudo systemctl status postfix dovecot rspamd redis-server sollte alle vier Dienste als active (running) zeigen. Mit ss -tlnp | grep -E '25|587|993|11332|6379' prüfst du, ob alle Ports lauschen.

Ports und Konfigurationsdateien im Überblick

DienstPortProtokollZweckKonfigurationsdatei
Postfix SMTP25TCPEingehende Mail von anderen MTAs/etc/postfix/master.cf
Postfix Submission587TCP+STARTTLSAuthentifizierte Client-Einlieferung/etc/postfix/master.cf
Postfix SMTPS465TCP+SSL/TLSAlternativer Client-Einlieferungsport/etc/postfix/master.cf
Dovecot IMAPS993TCP+SSL/TLSIMAP für Mail-Clients/etc/dovecot/conf.d/10-master.conf
Dovecot LMTPUnix-SocketIPCZustellung Postfix → Dovecot/etc/dovecot/conf.d/10-master.conf
Rspamd Milter11332TCPPostfix-Milter-Anbindung/etc/rspamd/local.d/worker-proxy.inc
Rspamd Web-UI11334TCPAdministrations-Webinterface/etc/rspamd/local.d/worker-controller.inc
Redis6379TCPRspamd-Statistik-Backend/etc/redis/redis.conf

Troubleshooting / Typische Fehler

Bei einem so vielschichtigen Setup passieren beim ersten Durchlauf fast immer kleinere Fehler. Hier die häufigsten Fallstricke:

  1. Postfix kann keine Mails an Dovecot übergeben: Der LMTP-Socket unter /var/spool/postfix/private/dovecot-lmtp muss mode=0600, user=postfix, group=postfix haben. Mit ls -la /var/spool/postfix/private/ prüfen und ggf. dovecot neu starten.
  2. Mails werden bei Rspamd-Ausfall abgelehnt: Die Direktive milter_default_action = accept in main.cf sorgt dafür, dass Mails bei einem vorübergehenden Rspamd-Ausfall trotzdem zugestellt werden. Ohne diese Zeile lehnt Postfix jede Mail ab, solange der Milter nicht erreichbar ist.
  3. Redis von außen erreichbar: /etc/redis/redis.conf muss bind 127.0.0.1 enthalten. Ein nach außen offener Redis-Server ist ein kritisches Sicherheitsrisiko. Mit ss -tlnp | grep 6379 prüfen.
  4. Rspamd-Konfiguration geht nach Update verloren: Alle Anpassungen gehören nach /etc/rspamd/local.d/ oder /etc/rspamd/override.d/. Dateien direkt in /etc/rspamd/ werden bei jedem Paket-Update überschrieben.
  5. Virtuelle Domain in mydestination eingetragen: Dann versucht Postfix die lokale Zustellung statt die MySQL-Maps abzufragen. mydestination darf nur localhost und den Hostnamen enthalten.
  6. DKIM-Schlüssel für Rspamd nicht lesbar: Den privaten Schlüssel mit sudo chown _rspamd /var/lib/rspamd/dkim/example.org.mail.key dem Rspamd-Benutzer zuweisen.
  7. Ausgehende Mails landen im Spam: SPF, DKIM und DMARC müssen korrekt in DNS eingetragen sein, bevor der Server produktiv geht. Mit dig TXT mail._domainkey.example.org und dig TXT _dmarc.example.org prüfen.
  8. Bayes-Klassifikator trifft nichts: Rspamd ist frisch nicht trainiert. Mindestens 200 Spam- und 200 Ham-Nachrichten mit rspamc learn_spam /path/to/spam.eml und rspamc learn_ham /path/to/ham.eml einlernen.
  9. TLS-Zertifikat nach Renewal abgelaufen: Ohne den Post-Renewal-Hook aus Schritt 2 laden Postfix und Dovecot das neue Zertifikat nicht nach. Den Hook einrichten und mit certbot renew --dry-run testen.

Häufige Fragen

Warum Rspamd statt SpamAssassin?

Rspamd ist asynchron und multi-threaded – bei hohem Mailaufkommen deutlich performanter als SpamAssassin. Es integriert DKIM-Signing nativ, bietet eine moderne Web-UI auf Port 11334, Redis-gestütztes Bayes-Filtering, Greylisting und Ratelimiting in einem einzigen Daemon. SpamAssassin benötigt für DKIM separate Werkzeuge und ist in vergleichbaren Konfigurationen spürbar langsamer.

Kann Postfix ohne Konflikte mit anderen Diensten auf demselben Server laufen?

Ja. Postfix, Dovecot und Rspamd laufen als eigenständige systemd-Services und teilen keine Ressourcen mit anderen Diensten. Portkonflikte auf 25, 587 und 993 sind vor der Installation zu prüfen. Ein eventuell vorhandenes sendmail muss entfernt werden: sudo apt remove sendmail.

Was ist der Unterschied zwischen local.d/ und override.d/ in Rspamd?

Dateien in local.d/ werden mit den Standardkonfigurationen zusammengeführt (Merge). Dateien in override.d/ ersetzen die Standardkonfiguration vollständig. Für die meisten Anpassungen – Redis, DKIM, Aktionsschwellen – ist local.d/ die richtige Wahl.

Wie lernt Rspamd automatisch Spam und Ham?

Über das Dovecot-IMAPSieve-Plugin: Wenn ein Benutzer eine Nachricht in den Junk-Ordner verschiebt, trägt Dovecot sie automatisch als Spam ein. Beim Herausschieben aus Junk als Ham. Alternativ funktioniert manuelles Training per rspamc learn_spam /pfad/zur/mail.eml.

Wie sichere ich das Rspamd-Web-UI ab?

Port 11334 sollte per Firewall (ufw oder nftables) nur für lokale Zugriffe oder ein VPN freigegeben sein. Das Passwort wird als bcrypt-Hash mit rspamadm pw erzeugt und in worker-controller.inc eingetragen. Empfehlenswert ist außerdem ein Nginx Reverse-Proxy mit HTTPS und HTTP-Basic-Auth davor.

Wie prüfe ich, ob Rspamd Mails korrekt filtert?

rspamc symbols < testmail.eml zeigt alle ausgelösten Regeln für eine Test-Mail. Die Web-UI auf Port 11334 zeigt Echtzeit-Statistiken, Scores und Logs. rspamadm configwizard bietet zusätzlich einen interaktiven Einrichtungsassistenten für Redis, DKIM und Bayes.

Fazit

Ein nativer Mailserver aus Postfix, Dovecot und Rspamd ist mehr Arbeit als ein Docker-Stack – aber diese Arbeit lohnt sich. Du hast vollständige Kontrolle über jede Konfigurationsdatei, kannst Probleme direkt mit journalctl -u postfix und rspamadm configtest diagnostizieren, und der laufende Overhead ist minimal. Für KMU und ambitionierte Selfhoster, die langfristig eine stabile Mailinfrastruktur betreiben wollen, ist der native Weg die solidere Grundlage. Die kritischen Punkte: DNS-Records vor dem Produktivstart setzen, Rspamd ausschließlich über local.d/ konfigurieren, Redis auf localhost binden und Bayes vor dem ersten echten Mailverkehr trainieren.

Weiterführende Anleitungen und Quellen

  1. Mailcow komplett aufsetzen – eigener Mailserver mit Docker – der Docker-basierte Weg als Vergleich
  2. OpenDKIM mit Postfix einrichten: DKIM-Signatur korrekt konfigurieren – alternative DKIM-Lösung ohne Rspamd
  3. DMARC-Reports verstehen und auswerten: von p=none sicher zu p=reject – nächster Schritt nach dem Mailserver-Setup
  4. Reverse DNS (PTR) und IPv6 für Mailserver korrekt einrichten – Pflicht für gute Zustellbarkeit
  5. VPS absichern und härten: UFW, SSH-Keys und Fail2Ban – sichere Grundlage für jeden selbstgehosteten Server
  6. Rspamd Offizielle Dokumentation: Quick Start