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.

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
- Ubuntu 22.04 LTS / 24.04 LTS oder Debian 11 (Bullseye) / Debian 12 (Bookworm) – frische Server-Installation
- Dedizierter Server oder VPS mit statischer IPv4-Adresse; Reverse-DNS/PTR-Eintrag muss auf
mail.example.orgzeigen - Eigene Domain mit Zugriff auf die DNS-Verwaltung (MX-, TXT- und CNAME-Records setzen)
- Mindestens 1 GB RAM (empfohlen 2 GB+) – Rspamd, Redis, Dovecot und Postfix laufen gleichzeitig
- Port 25 durch den Hoster nicht gesperrt – bei vielen günstigen VPS-Anbietern standardmäßig gesperrt, vorher prüfen
- Root- oder sudo-Zugang per SSH; grundlegende Linux-Kenntnisse (Dateien bearbeiten, systemctl, journalctl)
- Gültige E-Mail-Adresse für Let's-Encrypt-Benachrichtigungen
- 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 rspamdWä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.orgDanach 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/mailErstelle 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.shVerifizieren: 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 = 6Wichtig: 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,rejectVerifizieren: 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-*.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 ü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.pemIn /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-ttlSetze ein Passwort für das Rspamd-Web-UI auf Port 11334. Der Hash wird mit dem mitgelieferten Werkzeug erzeugt:
rspamadm pwDen 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.keyDen 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-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=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";
}
EOFIn /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 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' prüfst du, 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 | /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
Bei einem so vielschichtigen Setup passieren beim ersten Durchlauf fast immer kleinere Fehler. Hier die häufigsten Fallstricke:
- Postfix kann keine Mails an Dovecot übergeben: Der LMTP-Socket unter
/var/spool/postfix/private/dovecot-lmtpmussmode=0600,user=postfix,group=postfixhaben. Mitls -la /var/spool/postfix/private/prüfen und ggf.dovecotneu starten. - Mails werden bei Rspamd-Ausfall abgelehnt: Die Direktive
milter_default_action = acceptinmain.cfsorgt 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. - Redis von außen erreichbar:
/etc/redis/redis.confmussbind 127.0.0.1enthalten. Ein nach außen offener Redis-Server ist ein kritisches Sicherheitsrisiko. Mitss -tlnp | grep 6379prüfen. - 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. - Virtuelle Domain in mydestination eingetragen: Dann versucht Postfix die lokale Zustellung statt die MySQL-Maps abzufragen.
mydestinationdarf nurlocalhostund den Hostnamen enthalten. - DKIM-Schlüssel für Rspamd nicht lesbar: Den privaten Schlüssel mit
sudo chown _rspamd /var/lib/rspamd/dkim/example.org.mail.keydem Rspamd-Benutzer zuweisen. - 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.orgunddig TXT _dmarc.example.orgprüfen. - Bayes-Klassifikator trifft nichts: Rspamd ist frisch nicht trainiert. 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: 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-runtesten.
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
- 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