Kompletten Mailserver nativ aufsetzen: Postfix, Dovecot und Rspamd ohne Docker
Vollständiger SMTP/IMAP-Mailserver mit modernem Spamfilter direkt auf Ubuntu oder Debian: Postfix, Dovecot und Rspamd als native systemd-Dienste, virtuelle Postfächer in MySQL, DKIM und Sieve-Spamsortierung, ohne Docker.
Geprüft am 29.09.2026
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Mehr dazu

Statt Docker-Stacks wie Mailcow (Konfiguration tief in Volumes) installiert diese Anleitung installiert Postfix, Dovecot und Rspamd stattdessen als native systemd-Dienste mit allen Konfigurationsdateien unter /etc/: volle Kontrolle, direktes Troubleshooting, minimaler Overhead.
Voraussetzungen
- Ubuntu 22.04/24.04 LTS oder Debian 12 (Bookworm), frisch installiert. Die Konfiguration nutzt Dovecot-2.3-Syntax; Debian 13 und Ubuntu 26.04 liefern Dovecot 2.4 mit geänderten Einstellungsnamen, dort passen die Dovecot-Abschnitte nicht unverändert. Debian 11 unterstützt das Rspamd-Repository nicht mehr.
- Server oder VPS mit statischer IPv4; Reverse-DNS/PTR auf
mail.example.org - Eigene Domain mit DNS-Zugriff (MX, TXT, CNAME)
- Mindestens 1 GB RAM (empfohlen 2 GB+) für Rspamd, Redis, Dovecot und Postfix
- Port 25 vom Hoster nicht gesperrt (bei vielen günstigen VPS Standard, vorher prüfen)
- Root- oder sudo-Zugang per SSH, Linux-Grundkenntnisse
- Gültige E-Mail-Adresse für Let's-Encrypt-Benachrichtigungen
- MySQL oder MariaDB installiert und gesichert (virtuelle Mailbox-Datenbank)
Schritt 1: Pakete installieren
Pakete installieren. Rspamd kommt nicht aus Ubuntu-Universe (oft veraltet), sondern aus dem offiziellen Rspamd-APT-Repository:
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 22.04/24.04, Debian 12)
sudo mkdir -p /etc/apt/keyrings
wget -O- https://rspamd.com/apt-stable/gpg.key | gpg --dearmor | \
sudo tee /etc/apt/keyrings/rspamd.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/rspamd.gpg] http://rspamd.com/apt-stable/ $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/rspamd.list
sudo apt update && sudo apt install -y rspamdBei der Postfix-Installation Typ „Internet-Site“ wählen und den vollständigen Hostnamen (mail.example.org) eintragen.
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
TLS-Zertifikat per Certbot von Let's Encrypt; Port 80 muss für die Challenge erreichbar sein:
sudo certbot certonly --standalone -d mail.example.orgSystembenutzer für virtuelle Mailboxen; alle Mails liegen unter /var/mail/vhosts/ und gehören ihm:
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/mailPost-Renewal-Hook, damit Postfix und Dovecot nach der Zertifikatserneuerung neu laden und nicht mit dem alten Zertifikat weiterlaufen:
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.shVerifizieren: ls /etc/letsencrypt/live/mail.example.org/ zeigt fullchain.pem und privkey.pem.
Schritt 3: Postfix konfigurieren
Zentrale Konfiguration: /etc/postfix/main.cf; example.org durchgängig durch Ihre Domain ersetzen:
# /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 = 6Wichtig: mydestination bleibt leer oder enthält nur localhost. Virtuelle Domains dort stellt Postfix lokal zu statt über die MySQL-Maps.
Für Port 587 ergänzen Sie in /etc/postfix/master.cf diese Sektion (submission steht oft auskommentiert bereit). Port 465 aktivieren Sie analog über den Block smtps, zusätzlich mit -o smtpd_tls_wrappermode=yes:
# /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,rejectVerifizieren: sudo postfix check darf keine Fehler ausgeben.
Schritt 4: MySQL-Lookup-Maps anlegen
Postfix fragt Domains, Benutzer und Aliase aus MySQL ab. Datenbank, Lesebenutzer und drei Tabellen in sudo mysql anlegen:
CREATE DATABASE mailserver;
CREATE USER 'mailuser'@'127.0.0.1' IDENTIFIED BY 'sicheres_passwort';
GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1';
USE mailserver;
CREATE TABLE virtual_domains (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE);
CREATE TABLE virtual_users (id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, maildir VARCHAR(255) NOT NULL);
CREATE TABLE virtual_aliases (id INT AUTO_INCREMENT PRIMARY KEY, source VARCHAR(255) NOT NULL, destination VARCHAR(255) NOT NULL);
INSERT INTO virtual_domains (name) VALUES ('example.org');Die drei Lookup-Dateien für Postfix:
# /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-*.cfVerifizieren: 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 nimmt Nachrichten per LMTP von Postfix an, speichert sie als Maildir und liefert sie per IMAPS aus:
# /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/etc/dovecot/conf.d/10-master.conf definiert die Unix-Sockets für Postfix; falsche Berechtigungen 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
}
}SQL-Authentifizierung: In /etc/dovecot/conf.d/10-auth.conf !include auth-system.conf.ext auskommentieren, !include auth-sql.conf.ext aktivieren und auth_mechanisms = plain login setzen. Zugangsdaten und Abfragen in /etc/dovecot/dovecot-sql.conf.ext:
# /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=sicheres_passwort
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email AS user, password FROM virtual_users WHERE email='%u'
user_query = SELECT 5000 AS uid, 5000 AS gid, '/var/mail/vhosts/%d/%n' AS home FROM virtual_users WHERE email='%u'Postfach anlegen: Hash mit doveadm pw -s SHA512-CRYPT erzeugen und eintragen, z. B. INSERT INTO virtual_users (email, password, maildir) VALUES ('max@example.org', '{SHA512-CRYPT}$6$…', 'example.org/max/');. Dazu sudo chmod 640 /etc/dovecot/dovecot-sql.conf.ext.
Verifizieren: sudo doveconf -n zeigt die aktive Konfiguration ohne Fehlermeldung, und sudo doveadm auth test max@example.org meldet nach Eingabe des Passworts auth succeeded.
Schritt 6: Rspamd und Redis konfigurieren
Rspamd-Konfigurationen gehören ausschließlich nach /etc/rspamd/local.d/ oder /etc/rspamd/override.d/; Dateien direkt in /etc/rspamd/ überschreibt jedes Paket-Update.
Milter-Konfiguration für die Übergabe von Postfix an Rspamd:
# /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 auf localhost binden und Speicher begrenzen:
# /etc/redis/redis.conf – relevante Zeilen anpassen
bind 127.0.0.1
maxmemory 500mb
maxmemory-policy volatile-ttlPasswort-Hash für das Web-UI (Port 11334) erzeugen:
rspamadm pwHash in /etc/rspamd/local.d/worker-controller.inc eintragen:
# /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 unter /var/lib/rspamd/dkim/ 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Öffentlichen Schlüssel als TXT-Record unter mail._domainkey.example.org veröffentlichen, dann DKIM-Signing aktivieren:
# /etc/rspamd/local.d/dkim_signing.conf
domain {
example.org {
path = "/var/lib/rspamd/dkim/example.org.mail.key";
selector = "mail";
}
}Je Maildomain vier DNS-Records:
| Record-Typ | Name | Wert (Beispiel) |
|---|---|---|
| MX | example.org | 10 mail.example.org |
| TXT (SPF) | example.org | v=spf1 mx ~all |
| TXT (DKIM) | mail._domainkey.example.org | v=DKIM1; k=rsa; p=<öffentlicher Schlüssel> |
| TXT (DMARC) | _dmarc.example.org | v=DMARC1; p=none; rua=mailto:dmarc@example.org |
DMARC startet bewusst mit p=none; erst wenn die Reports zeigen, dass alle legitimen Absender SPF und DKIM bestehen, auf quarantine und später reject wechseln.
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 Spam den Header X-Spam: Yes; ein globales Sieve-Skript sortiert diese Mails in den Junk-Ordner. Skript anlegen und kompilieren:
sudo mkdir -p /var/mail/vhosts/sieve
sudo tee /var/mail/vhosts/sieve/global.sieve <<'EOF'
require ["fileinto", "mailbox"];
if header :is "X-Spam" "Yes" {
fileinto :create "Junk";
}
EOF
sudo sievec /var/mail/vhosts/sieve/global.sieve
sudo chown -R vmail:vmail /var/mail/vhosts/sieveAls sieve_before einbinden (läuft vor Benutzerskripten) und das Sieve-Plugin für LMTP aktivieren; sieve_global_path ist veraltet:
# /etc/dovecot/conf.d/90-sieve.conf (im Block plugin { … })
sieve_before = /var/mail/vhosts/sieve/global.sieve
# /etc/dovecot/conf.d/20-lmtp.conf
protocol lmtp {
mail_plugins = $mail_plugins sieve
}Verifizieren: sudo doveconf -n | grep -E 'sieve_before|mail_plugins' zeigt beide Einträge, und neben dem Skript liegt die kompilierte Datei global.svbin.
Schritt 9: Alle Dienste starten und aktivieren
Alle vier systemd-Units für Start und Reboot aktivieren:
sudo systemctl enable --now redis-server rspamd postfix dovecotVerifizieren: 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' lässt sich prüfen, ob alle Ports lauschen.
Ports und Konfigurationsdateien im Überblick
| Dienst | Port | Protokoll | Zweck | Konfigurationsdatei |
|---|---|---|---|---|
| Postfix SMTP | 25 | TCP | Eingehende Mail von anderen MTAs | /etc/postfix/master.cf |
| Postfix Submission | 587 | TCP+STARTTLS | Authentifizierte Client-Einlieferung | /etc/postfix/master.cf |
| Postfix SMTPS | 465 | TCP+SSL/TLS | Alternativer Client-Einlieferungsport (optional, Block smtps) | /etc/postfix/master.cf |
| Dovecot IMAPS | 993 | TCP+SSL/TLS | IMAP für Mail-Clients | /etc/dovecot/conf.d/10-master.conf |
| Dovecot LMTP | Unix-Socket | IPC | Zustellung Postfix → Dovecot | /etc/dovecot/conf.d/10-master.conf |
| Rspamd Milter | 11332 | TCP | Postfix-Milter-Anbindung | /etc/rspamd/local.d/worker-proxy.inc |
| Rspamd Web-UI | 11334 | TCP | Administrations-Webinterface | /etc/rspamd/local.d/worker-controller.inc |
| Redis | 6379 | TCP | Rspamd-Statistik-Backend | /etc/redis/redis.conf |
Troubleshooting / Typische Fehler
Häufige Fallstricke:
- Postfix übergibt keine Mails an Dovecot: LMTP-Socket
/var/spool/postfix/private/dovecot-lmtpbrauchtmode=0600,user=postfix,group=postfix. Mitls -la /var/spool/postfix/private/prüfen, ggf.dovecotneu starten. - Mails werden bei Rspamd-Ausfall abgelehnt:
milter_default_action = acceptinmain.cffehlt; ohne sie lehnt Postfix jede Mail ab, solange der Milter nicht erreichbar ist. - Redis von außen erreichbar: kritisches Sicherheitsrisiko.
/etc/redis/redis.confbrauchtbind 127.0.0.1; prüfen mitss -tlnp | grep 6379. - Rspamd-Konfiguration nach Update weg: lag direkt in
/etc/rspamd/stattlocal.d//override.d/(Schritt 6). - Virtuelle Domain in mydestination: nur
localhostund Hostname eintragen (Schritt 3). - DKIM-Schlüssel nicht lesbar:
sudo chown _rspamd /var/lib/rspamd/dkim/example.org.mail.key. - Ausgehende Mails landen im Spam: SPF, DKIM und DMARC vor dem Produktivstart eintragen; prüfen mit
dig TXT mail._domainkey.example.orgunddig TXT _dmarc.example.org. - Bayes trifft nichts: Rspamd ist untrainiert. Mindestens 200 Spam- und 200 Ham-Nachrichten mit
rspamc learn_spam /path/to/spam.emlundrspamc learn_ham /path/to/ham.emleinlernen. - TLS-Zertifikat nach Renewal abgelaufen: Post-Renewal-Hook aus Schritt 2 fehlt; einrichten und mit
certbot renew --dry-runtesten.
Häufige Fragen
Warum Rspamd statt SpamAssassin?
Rspamd ist ereignisgesteuert und bei hohem Aufkommen deutlich schneller als SpamAssassin. DKIM-Signing, Web-UI (Port 11334), Redis-gestütztes Bayes, Greylisting und Ratelimiting stecken in einem Daemon; SpamAssassin braucht für DKIM separate Werkzeuge.
Kann Postfix ohne Konflikte mit anderen Diensten auf demselben Server laufen?
Ja, alle drei laufen als eigenständige systemd-Services. Vorher Portkonflikte auf 25, 587 und 993 prüfen und ein vorhandenes sendmail entfernen: sudo apt remove sendmail.
Was ist der Unterschied zwischen local.d/ und override.d/ in Rspamd?
local.d/ wird mit der Standardkonfiguration zusammengeführt, override.d/ ersetzt sie vollständig. Meist ist local.d/ richtig.
Wie lernt Rspamd automatisch Spam und Ham?
Über das zusätzlich einzurichtende Dovecot-IMAPSieve-Plugin: Verschieben in Junk lernt Spam, Herausschieben Ham. Alternativ manuell per rspamc learn_spam /pfad/zur/mail.eml.
Wie sichere ich das Rspamd-Web-UI ab?
Port 11334 per Firewall (ufw oder nftables) nur lokal oder per VPN freigeben, Passwort-Hash per rspamadm pw in worker-controller.inc (Schritt 6). Empfehlenswert ist 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; die Web-UI zeigt Statistiken, Scores und Logs. rspamadm configwizard ist ein interaktiver Assistent für Redis, DKIM und Bayes.
Fazit
Diagnose läuft direkt über journalctl -u postfix und rspamadm configtest. Kritisch: DNS-Records vor dem Produktivstart, Rspamd nur über local.d/, Redis auf localhost, Bayes vor echtem Mailverkehr trainieren.
Weiterführende Anleitungen und Quellen
- Mailcow komplett aufsetzen – eigener Mailserver mit Docker – der Docker-basierte Weg als Vergleich
- OpenDKIM mit Postfix einrichten: DKIM-Signatur korrekt konfigurieren – alternative DKIM-Lösung ohne Rspamd
- DMARC-Reports verstehen und auswerten: von p=none sicher zu p=reject – nächster Schritt nach dem Mailserver-Setup
- Reverse DNS (PTR) und IPv6 für Mailserver korrekt einrichten – Pflicht für gute Zustellbarkeit
- VPS absichern und härten: UFW, SSH-Keys und Fail2Ban – sichere Grundlage für jeden selbstgehosteten Server
- Rspamd: offizielle Dokumentation, Quick Start
- Dovecot 2.3: LMTP-Zustellung mit Postfix


