Produktions-Mailserver im Self-Hosting (Postfix, Dovecot & DMARC)
Erstellt: 05.11.2026 · Zuletzt aktualisiert: 06.11.2026 · Nejat Hakan
Der Betrieb einer eigenen E-Mail-Infrastruktur gilt zu Recht als die Königsdisziplin der Linux-Systemadministration. Anders als ein gewöhnlicher Webserver ist E-Mail ein global föderiertes System, das auf striktem kryptografischem Vertrauen, IP-Reputation und mehrschichtiger Protokoll-Verifikation basiert.
Während kommerzielle Anbieter (Gmail, Microsoft 365) Metadaten analysieren und an proprietäre Ökosysteme binden, garantiert ein eigener gehärteter Mail-Stack 100 % Souveränität über vertrauliche Kommunikation, unbegrenzte Aliase, serverseitige Sieve-Filterung und null Daten-Mining durch Dritte.
1. Architektur, Protokolle & Voraussetzungen
Ein professioneller Linux-Mailserver ist kein einzelnes monolithisches Programm – er besteht aus einer Kette spezialisierter Dienste, die ineinandergreifen:
```mermaid
%%{init: {'flowchart': {'wrappingWidth': 600, 'subGraphTitleMargin': {'top': 15, 'bottom': 15}}}}%%
%%{init: {'flowchart': {'wrappingWidth': 600}}}%%
flowchart TB
Sender["🌐 Externer Absender-MTA (z. B. Gmail / Web.de)"]
Postfix["📮 Postfix SMTP-Listener (:25)
TLS 1.3 · DNSBL · SPF-Prüfung"]
Filter["🔐 Spam- & Virenfilter
Rspamd / SpamAssassin & ClamAV"]
Dovecot["📬 Dovecot LMTP
Serverseitige Sieve-Sortierung"]
Maildir[("💾 Verschlüsselter Maildir-Speicher
/var/vmail/domain/user/")]
Sender ==>|"SMTP :25 (STARTTLS)"| Postfix
Postfix -->|"Milter-Scan (:11332)"| Filter
Filter -->|"Gereinigte Mail"| Dovecot
Dovecot ==>|"Atomare Speicherung"| Maildir
```
%%{init: {'flowchart': {'wrappingWidth': 600, 'subGraphTitleMargin': {'top': 15, 'bottom': 15}}}}%%
flowchart TB
Client["💻 Mail-Client (Thunderbird / Mobile / Webmail)"]
subgraph InboundAccess ["📬 Postfach-Abruf (IMAP)"]
DovecotImap["📬 Dovecot IMAPS (:993)<br/>Verschlüsselter Postfach-Zugriff"]
MaildirStore[("💾 Maildir Speicher<br/>/var/vmail/")]
DovecotImap <==>|"Lese- & Schreibzugriff"| MaildirStore
end
subgraph OutboundFlow ["📤 E-Mail-Versand (SMTP Submission)"]
PostfixOut["📮 Postfix Submission (:587)<br/>SASL-Authentifizierung & TLS 1.3"]
DKIM["✍️ OpenDKIM Milter<br/>Kryptografische Signatur"]
Recipient["🌍 Empfänger-MTA im Internet (:25)"]
PostfixOut -->|"DKIM-Header"| DKIM
DKIM ==>|"SMTP :25"| Recipient
end
Client <==>|"Mails abrufen (:993)"| DovecotImap
Client ==>|"Mail senden (:587)"| PostfixOut
Die vier Kernkomponenten
-
MTA — Mail Transfer Agent (
Postfix)
Der SMTP-Router. Nimmt eingehende Nachrichten auf Port
25an, authentifiziert ausgehende Benutzerverbindungen auf Port587/465, erzwingt TLS und leitet Mails über DNS-MX-Abfragen weiter. -
MDA & IMAP — (
Dovecot)
Speichert Mails im atomaren
Maildir-Format ab, führt serverseitige Sieve-Sortierregeln aus, liefert Postfächer via IMAPS (993) aus und stellt das SASL-Authentifizierungs-Backend bereit. -
Kryptografische Absendersicherheit (
SPF / DKIM / DMARC)
Beweist Empfängerservern kryptografisch, dass dein Server autorisiert ist, Mails für deine Domain zu senden (
SPF), und dass Nachrichten unterwegs nicht manipuliert wurden (DKIM+DMARC). -
Spam- & Malware-Abwehr (
Amavis / Rspamd + ClamAV)
Prüft jede eingehende E-Mail gegen Echtzeit-DNS-Sperrlisten (DNSBLs), bayessche Heuristiken und die Virensignaturdatenbank von ClamAV.
Übersicht der Netzwerkports
| Protokoll / Rolle | Port | Transport & Verschlüsselung | Zweck |
|---|---|---|---|
| SMTP (Server-zu-Server) | 25/tcp |
Opportunistisches STARTTLS |
Pflicht für Empfang und Versand zwischen Mailservern weltweit. |
| SMTPS (Submission Wrapper) | 465/tcp |
Implizites TLS 1.3 (RFC 8314) |
Moderner Standard für Mail-Clients zum Einliefern ausgehender E-Mails. |
| SMTP Submission | 587/tcp |
Verbindliches STARTTLS |
Klassischer authentifizierter Port für Mail-Clients zum Mailversand. |
| IMAPS (Postfach-Zugriff) | 993/tcp |
Implizites TLS 1.3 (RFC 8314) |
Verschlüsselter Postfachabruf für Thunderbird, iOS, Android und Webmail. |
Pre-Flight-Checkliste: Diese 4 Punkte zwingend vorab prüfen!
- Entsperrter Port 25: Viele VPS-Provider blockieren ausgehenden TCP-Port
25standardmäßig gegen Spam. Prüfe die Erreichbarkeit vorab: - Feste öffentliche IPv4 (und IPv6): Dynamische Heim-IPs stehen auf Sperrlisten (Spamhaus PBL) und werden von 99 % aller Mailserver abgewiesen.
- Forward-Confirmed Reverse DNS (
FCrDNS / PTR): Der PTR-Eintrag deiner Server-IP beim Hoster muss exakt aufmail.meinedomain.dezeigen, und dieser Hostname muss im DNS wieder exakt auf dieselbe IP auflösen! - Saubere IP-Reputation: Prüfe die Server-IP vorab auf MXToolbox Blacklist Check.
2. DNS-Fundament: A, AAAA, MX & PTR
Bevor ein einziges Paket installiert wird, müssen DNS-Zone und Reverse DNS (PTR) beim Hoster konfiguriert werden. Ersetze meinedomain.de und 198.51.100.10 durch deine echten Daten:
| Typ | Host / Name | Wert / Ziel | Priorität | TTL |
|---|---|---|---|---|
A |
mail |
198.51.100.10 |
— | 3600 |
AAAA |
mail |
2001:db8::10 (falls IPv6 aktiv) |
— | 3600 |
MX |
@ (Root) |
mail.meinedomain.de. |
10 |
3600 |
PTR (beim VPS-Hoster) |
198.51.100.10 |
mail.meinedomain.de. |
— | — |
3. Kern-Stack: Postfix & Dovecot installieren und konfigurieren
Schritt 1: System-Hostname setzen & Pakete installieren
Der System-Hostname (FQDN) muss exakt deinem PTR- und A-Record entsprechen:
# 1. FQDN konfigurieren
sudo hostnamectl set-hostname mail.meinedomain.de
# 2. Postfix, Dovecot (IMAP + LMTP + Sieve) und Tools installieren
sudo apt update
sudo DEBIAN_PRIORITY=low apt install -y \
postfix dovecot-core dovecot-imapd dovecot-lmtpd dovecot-sieve mailutils swaks
(Im Postfix-Assistenten wählst du Internet-Site und setzt den System-Mailnamen auf meinedomain.de).
Schritt 2: Postfix (main.cf) & Dovecot-Mailboxen konfigurieren
Statt des veralteten mbox-Formats nutzen wir das robuste Maildir/-Format (eine separate Datei pro E-Mail) und richten Dovecots automatische Ordnererstellung ein (Trash, Sent, Drafts, Junk).
sudo postconf -e "myhostname = mail.meinedomain.de"
sudo postconf -e "mydomain = meinedomain.de"
sudo postconf -e "myorigin = \$mydomain"
sudo postconf -e "mydestination = \$myhostname, \$mydomain, localhost.\$mydomain, localhost"
sudo postconf -e "inet_interfaces = all"
sudo postconf -e "home_mailbox = Maildir/"
sudo postconf -e "recipient_delimiter = +"
Sub-Addressing (recipient_delimiter = +)
Mit recipient_delimiter = + stehen dir sofort wegwerfbare Adressen zur Verfügung: Mails an nejat+newsletter@meinedomain.de landen automatisch im Hauptpostfach von nejat@meinedomain.de.
Konfiguriere den Maildir-Pfad in /etc/dovecot/conf.d/10-mail.conf und die Ordnererstellung in /etc/dovecot/conf.d/15-mailboxes.conf:
namespace inbox {
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Junk {
auto = subscribe
special_use = \Junk
}
mailbox Trash {
auto = subscribe
special_use = \Trash
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
}
4. Transportverschlüsselung (Let's Encrypt TLS 1.3) & Firewall
Passwörter und Mailinhalte dürfen niemals unverschlüsselt übertragen werden. Wir beziehen ein kostenloses Let's Encrypt-Zertifikat via certbot und erzwingen modernes TLS 1.2 / TLS 1.3:
# 1. Mail-Ports (25, 465, 587, 993) & Port 80 (für Certbot) in UFW freigeben
sudo ufw allow 25,80,465,587,993/tcp
# 2. Certbot installieren und Zertifikat ausstellen
sudo apt install -y certbot
sudo certbot certonly --standalone -d mail.meinedomain.de \
--non-interactive --agree-tos --email admin@meinedomain.de \
--deploy-hook "systemctl reload postfix; systemctl reload dovecot"
Unterbrechungsfreie Zertifikatserneuerung
Der --deploy-hook sorgt dafür, dass Postfix und Dovecot bei jeder nächtlichen Erneuerung durch Certbot automatisch im laufenden Betrieb neu geladen werden.
Härte die TLS-Parameter in Postfix:
sudo postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mail.meinedomain.de/fullchain.pem"
sudo postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mail.meinedomain.de/privkey.pem"
sudo postconf -e "smtpd_tls_security_level = may"
sudo postconf -e "smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1"
sudo postconf -e "smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1"
sudo postconf -e "smtpd_tls_mandatory_ciphers = high"
sudo postconf -e "smtp_tls_security_level = may"
sudo postconf -e "smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1"
sudo postconf -e "smtp_tls_CApath = /etc/ssl/certs"
Und in /etc/dovecot/conf.d/10-ssl.conf:
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.meinedomain.de/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.meinedomain.de/privkey.pem
ssl_min_protocol = TLSv1.2
ssl_prefer_server_ciphers = yes
5. SASL-Authentifizierung & Open-Relay-Schutz
Ein Mailserver ohne Authentifizierung, der Mails an fremde Server weiterleitet, ist ein Open Relay – Botnetze missbrauchen ihn binnen Minuten.
Postfix delegiert die Prüfung der Login-Daten an den SASL-Socket von Dovecot:
%%{init: {'flowchart': {'wrappingWidth': 600}}}%%
flowchart TB
Client["💻 Mail-Client (MUA)"] ==>|"1. Port 587/465 (TLS)<br/>AUTH PLAIN / LOGIN"| Postfix["📮 Postfix smtpd"]
Postfix <==>|"2. UNIX-Socket abfragen<br/>(private/auth)"| DovecotAuth["🔐 Dovecot Auth Service"]
DovecotAuth <==>|"3. Zugangsdaten prüfen"| Backend[("🗄️ PAM / Virtuelle SQL-DB")]
Postfix ==>|"4. 235 Auth erfolgreich<br/>Relay erlaubt"| Outbound(("🌍 Ausgehende Zustellung"))
Schritt 1: Dovecot-SASL-Socket für Postfix freigeben
Aktiviere plain und login über TLS in /etc/dovecot/conf.d/10-auth.conf:
Und richte den Socket in /etc/dovecot/conf.d/10-master.conf ein:
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
Schritt 2: Postfix mit Dovecot-SASL verbinden & Ports 587 / 465 aktivieren
sudo postconf -e "smtpd_sasl_type = dovecot"
sudo postconf -e "smtpd_sasl_path = private/auth"
sudo postconf -e "smtpd_sasl_auth_enable = yes"
sudo postconf -e "smtpd_sasl_security_options = noanonymous"
sudo postconf -e "smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"
Aktiviere submission (587) und smtps (465) in /etc/postfix/master.cf:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
sudo systemctl restart dovecot postfix
sudo ls -la /var/spool/postfix/private/auth
Hands-On Lab 1: Authentifizierten Versand mit swaks testen
Teste STARTTLS und SASL-Authentifizierung auf Port 587:
swaks --server mail.meinedomain.de --port 587 \
--tls \
--auth LOGIN \
--auth-user testuser \
--auth-password 'SicheresPasswort' \
--from testuser@meinedomain.de \
--to zieladresse@extern.de \
--header "Subject: Test vom souveränen Mailserver" \
--body "Authentifiziert über TLS 1.3 via Dovecot SASL!"
6. Zustellsicherheit: SPF, DKIM & DMARC
Ohne kryptografische Absenderauthentifizierung verwerfen Gmail, Outlook und Apple ausgehende Mails oder stufen sie als Spam ein (550-5.7.26).
%%{init: {'flowchart': {'wrappingWidth': 600}}}%%
flowchart TB
Email["📧 Ausgehende E-Mail<br/>von user@meinedomain.de"]
RecvServer["🛡️ Empfänger-Mailserver (z. B. Gmail / Outlook)<br/>Startet Authentifizierungs-Prüfungen"]
SPF["1️⃣ SPF-Prüfung (DNS TXT)<br/>Darf verbindende IP für Domain senden?"]
DKIM["2️⃣ DKIM-Prüfung (RSA/Ed25519)<br/>Gültige kryptografische Signatur?"]
DMARC["3️⃣ DMARC-Richtlinie (_dmarc TXT)<br/>Alignment-Prüfung & Policy-Durchsetzung"]
Inbox["🟢 Posteingang<br/>Erfolgreich zugestellt"]
Reject["🔴 Spam-Ordner oder Abweisung<br/>SMTP 550 reject"]
Email ==>|"SMTP :25 Zustellung"| RecvServer
RecvServer --> SPF
RecvServer --> DKIM
SPF & DKIM ==> DMARC
DMARC ==>|"PASS (Kriterien erfüllt)"| Inbox
DMARC ==>|"FAIL (Verstoß gegen Policy)"| Reject
Schritt 1: SPF-Record im DNS setzen
Erstelle einen TXT-Eintrag für @ (meinedomain.de), der nur deinen Mailserver autorisiert und fremde IPs ablehnt (-all):
Name: @ (oder meinedomain.de)
Type: TXT
Wert: "v=spf1 mx a:mail.meinedomain.de -all"
Schritt 2: OpenDKIM installieren & 2048-Bit-Schlüssel generieren
# 1. OpenDKIM installieren
sudo apt install -y opendkim opendkim-tools
# 2. Verzeichnis im Postfix-Chroot anlegen
sudo usermod -aG opendkim postfix
sudo mkdir -p /var/spool/postfix/opendkim
sudo chown opendkim:postfix /var/spool/postfix/opendkim
sudo chmod 750 /var/spool/postfix/opendkim
# 3. 2048-Bit RSA-Schlüsselpaar mit Selektor 'default' erstellen
sudo mkdir -p /etc/opendkim/keys/meinedomain.de
sudo opendkim-genkey -b 2048 -d meinedomain.de -s default -D /etc/opendkim/keys/meinedomain.de/
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod 600 /etc/opendkim/keys/meinedomain.de/default.private
Konfiguriere /etc/opendkim.conf:
Syslog yes
UMask 007
Mode sv
Canonicalization relaxed/simple
Socket local:/var/spool/postfix/opendkim/opendkim.sock
UserID opendkim
PidFile /run/opendkim/opendkim.pid
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
InternalHosts refile:/etc/opendkim/TrustedHosts
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
Erstelle die Zuordnungstabellen:
cat << 'EOF' | sudo tee /etc/opendkim/KeyTable
default._domainkey.meinedomain.de meinedomain.de:default:/etc/opendkim/keys/meinedomain.de/default.private
EOF
cat << 'EOF' | sudo tee /etc/opendkim/SigningTable
*@meinedomain.de default._domainkey.meinedomain.de
EOF
cat << 'EOF' | sudo tee /etc/opendkim/TrustedHosts
127.0.0.1
localhost
::1
*.meinedomain.de
EOF
sudo chown opendkim:opendkim /etc/opendkim/KeyTable /etc/opendkim/SigningTable /etc/opendkim/TrustedHosts
Binde den OpenDKIM-Milter in Postfix ein:
sudo postconf -e "milter_default_action = accept"
sudo postconf -e "milter_protocol = 6"
sudo postconf -e "smtpd_milters = local:opendkim/opendkim.sock"
sudo postconf -e "non_smtpd_milters = \$smtpd_milters"
sudo systemctl restart opendkim postfix
Öffentlichen Schlüssel anzeigen und als TXT-Record unter default._domainkey.meinedomain.de im DNS eintragen:
sudo cat /etc/opendkim/keys/meinedomain.de/default.txt
Schritt 3: DMARC-Record im DNS veröffentlichen
Erstelle einen TXT-Eintrag für _dmarc.meinedomain.de:
Name: _dmarc
Type: TXT
Wert: "v=DMARC1; p=quarantine; rua=mailto:postmaster@meinedomain.de; adkim=r; aspf=r; pct=100"
7. Anti-Spam & Virenabwehr
%%{init: {'flowchart': {'wrappingWidth': 600}}}%%
flowchart TB
In(("🌐 Port :25")) --> RBL["1️⃣ Postfix DNSBLs<br/>(Bekannte Botnetz-IPs verwerfen)"]
RBL --> DKIM_V["2️⃣ OpenDKIM<br/>(Absendersignatur verifizieren)"]
DKIM_V --> AV["3️⃣ ClamAV Daemon<br/>(Trojaner & Malware blockieren)"]
AV --> Spam["4️⃣ SpamAssassin / Rspamd<br/>(Heuristisches Spam-Scoring)"]
Spam --> Sieve["5️⃣ Dovecot Sieve<br/>(Spam in Junk-Ordner verschieben)"]
Auf modernen Servern ersetzt Rspamd (in C geschrieben) sowohl Amavis als auch SpamAssassin und OpenDKIM in einem einzigen performanten Dienst mit Web-Dashboard (127.0.0.1:11334):
sudo apt install -y rspamd redis-server
sudo postconf -e "smtpd_milters = inet:127.0.0.1:11332"
sudo postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
sudo postconf -e "milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}"
sudo systemctl restart rspamd postfix
sudo apt install -y amavisd-new spamassassin clamav-daemon clamav-freshclam \
pyzor razor libnet-dns-perl libmail-dkim-perl
sudo adduser clamav amavis
sudo adduser amavis clamav
sudo sa-update
sudo systemctl enable --now clamav-daemon clamav-freshclam spamassassin amavis
8. Webmail-Zugang mit Roundcube
Um E-Mails im Browser abzurufen, eignet sich Roundcube Webmail angebunden an Dovecot (IMAPS :993) und Postfix (Submission :587):
services:
roundcube:
image: docker.io/roundcube/roundcubemail:latest
container_name: roundcube-webmail
restart: unless-stopped
ports:
- "127.0.0.1:8090:80"
environment:
- ROUNDCUBEMAIL_DEFAULT_HOST=ssl://mail.meinedomain.de
- ROUNDCUBEMAIL_DEFAULT_PORT=993
- ROUNDCUBEMAIL_SMTP_SERVER=tls://mail.meinedomain.de
- ROUNDCUBEMAIL_SMTP_PORT=587
- ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE=25M
volumes:
- roundcube_db:/var/roundcube/db
- roundcube_config:/var/roundcube/config
volumes:
roundcube_db:
roundcube_config:
9. Wartung: Queue-Management & Fehlerbehebung
Spickzettel für Postfix-Warteschlangen
| Befehl | Aktion |
|---|---|
mailq oder postqueue -p |
Alle Mails in den Warteschlangen auflisten. |
sudo postcat -q <QUEUE_ID> |
Header und Inhalt einer Mail in der Warteschlange ansehen. |
sudo postqueue -f |
Sofortige Neuzustellung aller verzögerten Mails anstoßen. |
sudo postsuper -h <QUEUE_ID> |
Verdächtige E-Mail anhalten (hold). |
sudo postsuper -d <QUEUE_ID> |
Bestimmte Mail aus der Queue löschen. |
sudo postsuper -d ALL deferred |
Alle verzögerten Mails aus der Queue entfernen. |
Häufige Fehlerbilder & Lösungen
1. Gmail lehnt Mails ab mit 550-5.7.1 oder 550-5.7.26
Ursache: Fehlender Reverse-DNS (PTR) oder fehlerhafte SPF/DKIM/DMARC-Signatur.
Lösung: Prüfe deinen Score auf mail-tester.com und verifiziere, dass dig -x <SERVER_IP> +short exakt mail.meinedomain.de. liefert.
2. Mail-Client meldet cannot connect to Dovecot auth
Ursache: Postfix läuft unter Debian/Ubuntu im Chroot unter /var/spool/postfix. Befindet sich der Socket außerhalb, kann Postfix ihn nicht erreichen.
Lösung: Sicherstellen, dass /etc/dovecot/conf.d/10-master.conf den Socket unter /var/spool/postfix/private/auth mit Rechten 0660 für User/Gruppe postfix anlegt.
3. Ausgehende Mails verharren in deferred (Timeout auf Port 25)
Ursache: Der VPS-Hoster blockiert ausgehenden Port 25 per Firewall.
Lösung: Ticket beim Hoster (z. B. Hetzner, Netcup) zur Freischaltung von Port 25 einreichen oder vorübergehend ein Relay (relayhost) konfigurieren.