Mit einem eigenen Rocky Linux Mail­ser­ver können Sie E-Mails unter Ihrer eigenen Domain senden, empfangen und verwalten. Dabei übernimmt Postfix den Versand und Empfang per SMTP, Dovecot stellt die Post­fä­cher über IMAP bereit und Roundcube dient als Webmail-Ober­flä­che im Browser. Damit entsteht ein voll­stän­di­ger Mail­ser­ver.

Pro­fes­sio­nel­les E-Mail-Hosting ganz nach Ihrem Bedarf
  • Per­so­na­li­sier­te E-Mail-Adresse
  • Zugriff auf E-Mails immer und überall
  • Höchste Si­cher­heits­stan­dards

An­for­de­run­gen für einen Rocky Linux Mail­ser­ver

Bevor Sie Rocky Linux, Postfix, Dovecot und Roundcube in­stal­lie­ren und einen eigenen Mail­ser­ver betreiben, benötigen Sie einen Server, der aus dem Internet dauerhaft er­reich­bar ist. Für wenige Mail­kon­ten reichen in der Regel ein bis zwei CPU-Kerne, etwa 2 GB Ar­beits­spei­cher und aus­rei­chend SSD-Speicher für Be­triebs­sys­tem, An­wen­dun­gen und Post­fä­cher aus. Ent­schei­dend sind jedoch weniger die Hardware-Res­sour­cen als eine korrekt ein­ge­rich­te­te Domain und eine feste öf­fent­li­che IP-Adresse.

Für diese Anleitung benötigen Sie:

  • einen Server mit Rocky Linux 9.x
  • Root-Rechte oder einen User mit sudo-Be­rech­ti­gung
  • eine eigene Domain
  • einen Hostnamen für den Mail­ser­ver
  • eine feste öf­fent­li­che IPv4-Adresse
  • Zugriff auf die DNS-Ein­stel­lun­gen Ihrer Domain
  • die Mög­lich­keit, beim Ser­ver­an­bie­ter einen PTR- be­zie­hungs­wei­se Reverse-DNS-Eintrag fest­zu­le­gen
  • einen Ser­ver­an­bie­ter, der ein- und aus­ge­hen­de Ver­bin­dun­gen über TCP-Port 25 erlaubt

Prüfen Sie ins­be­son­de­re den letzten Punkt vor der In­stal­la­ti­on. Einige Hosting- und Cloud-Anbieter sperren aus­ge­hen­den SMTP-Verkehr über Port 25 stan­dard­mä­ßig, um Spam zu ver­hin­dern. Ohne diesen Port kann Postfix Nach­rich­ten nicht un­mit­tel­bar an andere Mail­ser­ver im Internet zustellen. In diesem Fall benötigen Sie entweder eine Frei­schal­tung durch den Anbieter oder einen externen SMTP-Relay.

Die Anleitung verwendet folgende Bei­spiel­da­ten:

Ein­stel­lung Beispiel
Domain example.com
Mail­ser­ver mail.example.com
Öf­fent­li­che IPv4-Adresse 203.0.113.10
Bei­spiel­u­ser alice
E-Mail-Adresse alice@example.com

Ersetzen Sie diese Werte an allen Stellen durch Ihre eigenen Angaben.

Schritt 1: Rocky Linux ak­tua­li­sie­ren und Hostnamen festlegen

Melden Sie sich zunächst per SSH auf Ihrem Server an und ak­tua­li­sie­ren Sie die vor­han­de­nen Pakete:

sudo dnf upgrade -y
bash
Hinweis

Da Rocky Linux jeweils nur die neueste Minor-Version un­ter­stützt, sollten Sie Ihr System vor der weiteren Ein­rich­tung voll­stän­dig ak­tua­li­sie­ren. Ältere Minor-Versionen erhalten nach Er­schei­nen ihres Nach­fol­gers keine weiteren Si­cher­heits- und Feh­ler­kor­rek­tu­ren.

Falls dabei Kernel- oder zentrale Sys­tem­pa­ke­te ak­tua­li­siert wurden, starten Sie den Server an­schlie­ßend neu:

sudo reboot
bash

Melden Sie sich danach erneut an. Als Nächstes erhält der Server seinen voll­stän­dig qua­li­fi­zier­ten Do­main­na­men, den so­ge­nann­ten Fully Qualified Domain Name be­zie­hungs­wei­se FQDN. In diesem Beispiel lautet er mail.example.com:

sudo hostnamectl set-hostname mail.example.com
bash

Kon­trol­lie­ren Sie das Ergebnis mit:

hostname
bash

Der Hostname ist bei Mail­ser­vern besonders wichtig. Andere Mail­ser­ver verwenden ihn unter anderem zur Iden­ti­fi­ka­ti­on Ihres Systems und ver­glei­chen ihn mit den öf­fent­li­chen DNS- und Reverse-DNS-Einträgen.

Schritt 2: DNS-Einträge für den Mail­ser­ver erstellen

Noch bevor Sie Postfix produktiv verwenden, sollten Sie die wich­tigs­ten DNS-Einträge bei Ihrem Do­main­an­bie­ter anlegen:

Typ Name Wert
A mail 203.0.113.10
MX @ mail.example.com mit Priorität 10
TXT @ v=spf1 mx -all

Der A-Record verbindet mail.example.com mit der öf­fent­li­chen IPv4-Adresse des Servers. Der MX-Record legt fest, dass E-Mails für example.com an diesen Server zu­ge­stellt werden sollen. Mit dem SPF-Eintrag teilen Sie anderen Mail­ser­vern mit, dass die im MX-Record hin­ter­leg­ten Server E-Mails für Ihre Domain versenden dürfen.

Zu­sätz­lich benötigen Sie einen PTR-Record, auch Reverse-DNS-Eintrag genannt: 203.0.113.10 -> mail.example.com. Diesen Eintrag können Sie nor­ma­ler­wei­se nicht beim Do­main­an­bie­ter kon­fi­gu­rie­ren. Er wird vom Anbieter verwaltet, dem die öf­fent­li­che IP-Adresse gehört, also in der Regel von Ihrem Server- oder Clou­dan­bie­ter.

Forward- und Reverse-DNS müssen zu­ein­an­der passen: mail.example.com sollte auf die Server-IP zeigen und die Server-IP wiederum auf mail.example.com.

DMARC bereits vor­be­rei­ten

Zu­sätz­lich empfiehlt es sich, einen ersten DMARC-Eintrag anzulegen. Zum Einstieg können Sie eine reine Mo­ni­to­ring-Richt­li­nie verwenden:

v=DMARC1; p=none

Der TXT-Eintrag wird für folgenden Namen erstellt:

_dmarc.example.com

Mit p=none werden Nach­rich­ten bei einem DMARC-Fehler zunächst nicht au­to­ma­tisch zu­rück­ge­wie­sen. Für einen pro­duk­ti­ven Mail­ser­ver sollten Sie später außerdem DKIM ein­rich­ten und die DMARC-Richt­li­nie nach er­folg­rei­cher Prüfung bei­spiels­wei­se auf quarantine oder reject ver­schär­fen.

Hinweis

Ein technisch funk­tio­nie­ren­der SMTP-Server ga­ran­tiert noch keine gute Zu­stell­bar­keit. SPF, DKIM, DMARC, korrektes Reverse-DNS, TLS sowie die Re­pu­ta­ti­on der ver­wen­de­ten IP-Adresse spielen bei modernen Mail­pro­vi­dern eine ent­schei­den­de Rolle. Falls Ihr Server über IPv6 verfügt, sollten Sie nur dann einen AAAA-Eintrag ver­öf­fent­li­chen, wenn IPv6 tat­säch­lich voll­stän­dig kon­fi­gu­riert ist und auch für die öf­fent­li­che Mail­zu­stel­lung verwendet werden kann.

Schritt 3: Postfix, Dovecot, Nginx und PHP in­stal­lie­ren

In­stal­lie­ren Sie zunächst die be­nö­tig­ten Ser­ver­kom­po­nen­ten:

sudo dnf install -y \
    postfix \
    dovecot \
    nginx \
    firewalld \
    nano \
    tar \
    unzip \
    curl \
    sqlite \
    policycoreutils-python-utils
bash

Für Roundcube benötigen Sie außerdem PHP:

sudo dnf module install -y php:8.3
bash
Hinweis

Rocky Linux 9 bietet PHP 8.3 als ak­tu­ells­ten PHP-Modul-Stream in den of­fi­zi­el­len AppStream-Pa­ket­quel­len an. Neuere PHP-Versionen wie PHP 8.5 sind zwar verfügbar, müssen unter Rocky Linux 9 jedoch über ein zu­sätz­li­ches Dritt­an­bie­ter-Re­po­si­to­ry wie Remi in­stal­liert werden. Für diese Anleitung verwenden Sie deshalb PHP 8.3.

Ergänzen Sie an­schlie­ßend die für Roundcube be­nö­tig­ten PHP-Er­wei­te­run­gen:

sudo dnf install -y \
    php-fpm \
    php-mbstring \
    php-xml \
    php-intl \
    php-pdo \
    php-gd \
    php-opcache \
    php-pecl-zip
bash

Prüfen Sie die in­stal­lier­te PHP-Version:

php -v
bash

Starten und ak­ti­vie­ren Sie an­schlie­ßend Firewall, Nginx und PHP-FPM:

sudo systemctl enable --now firewalld
sudo systemctl enable --now nginx
sudo systemctl enable --now php-fpm
bash

Schritt 4: Benötigte Firewall-Ports freigeben

Ein Mail­ser­ver verwendet mehrere un­ter­schied­li­che Netz­werk­pro­to­kol­le. Öffnen Sie zunächst die Ports, die für dieses Setup benötigt werden:

sudo firewall-cmd --permanent --add-service=smtp
sudo firewall-cmd --permanent --add-port=587/tcp
sudo firewall-cmd --permanent --add-service=imaps
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
bash

Damit sind folgende Dienste er­reich­bar:

Port Protokoll Aufgabe
25 SMTP Mai­l­aus­tausch zwischen Mail­ser­vern
587 Sub­mis­si­on Versand durch an­ge­mel­de­te User
993 IMAPS ver­schlüs­sel­ter Zugriff auf Post­fä­cher
80 HTTP unter anderem für die Zer­ti­fi­kats­aus­stel­lung
443 HTTPS Roundcube-Webmail

Schritt 5: TLS-Zer­ti­fi­kat mit Let’s Encrypt ein­rich­ten

Mail-Pass­wör­ter und Nach­rich­ten sollten niemals un­ver­schlüs­selt über das öf­fent­li­che Internet über­tra­gen werden. Deshalb benötigen Postfix, Dovecot und Roundcube ein ver­trau­ens­wür­di­ges TLS-Zer­ti­fi­kat. Unter Rocky Linux 9 können Sie Certbot über das EPEL-Re­po­si­to­ry in­stal­lie­ren. In­stal­lie­ren Sie zunächst EPEL:

sudo dnf install -y epel-release
bash

Danach in­stal­lie­ren Sie Certbot:

sudo dnf install -y certbot
bash

Stellen Sie sicher, dass mail.example.com bereits per DNS auf die öf­fent­li­che IP-Adresse Ihres Servers zeigt und Port 80 er­reich­bar ist. Da die Nginx-Kon­fi­gu­ra­ti­on für Roundcube erst später ein­ge­rich­tet wird, verwenden Sie Certbot zunächst im Stan­da­lo­ne-Modus. Dabei startet Certbot vor­über­ge­hend einen eigenen Webserver auf Port 80. Stoppen Sie deshalb zunächst Nginx:

sudo systemctl stop nginx
bash

Fordern Sie an­schlie­ßend das Zer­ti­fi­kat an:

sudo certbot certonly --standalone -d mail.example.com
bash

Starten Sie Nginx nach er­folg­rei­cher Aus­stel­lung wieder:

sudo systemctl start nginx
bash

Nach er­folg­rei­cher Aus­stel­lung liegen Zer­ti­fi­kat und privater Schlüssel unter /etc/letsencrypt/live/mail.example.com/.

Certbot fragt unter anderem nach einer E-Mail-Adresse und Ihrer Zu­stim­mung zu den Nut­zungs­be­din­gun­gen. Nach er­folg­rei­cher Aus­stel­lung liegen Zer­ti­fi­kat und privater Schlüssel unterhalb von /etc/letsencrypt/live/mail.example.com/.

Nginx kann diese Dateien direkt verwenden. Für Postfix und Dovecot ist es unter Rocky Linux mit ak­ti­vier­tem SELinux robuster, Kopien an den für die je­wei­li­gen Dienste vor­ge­se­he­nen Stellen abzulegen.

Erstellen Sie zunächst die Ver­zeich­nis­se für Dovecot:

sudo mkdir -p /etc/pki/dovecot/certs
sudo mkdir -p /etc/pki/dovecot/private
bash

Kopieren Sie Zer­ti­fi­kat und Schlüssel für Postfix:

sudo install -m 0644 \
    /etc/letsencrypt/live/mail.example.com/fullchain.pem \
    /etc/pki/tls/certs/mailserver-fullchain.pem
sudo install -m 0600 \
    /etc/letsencrypt/live/mail.example.com/privkey.pem \
    /etc/pki/tls/private/mailserver.key
bash

Kopieren Sie die Dateien an­schlie­ßend für Dovecot:

sudo install -m 0644 \
    /etc/letsencrypt/live/mail.example.com/fullchain.pem \
    /etc/pki/dovecot/certs/mailserver-fullchain.pem
sudo install -m 0600 \
    /etc/letsencrypt/live/mail.example.com/privkey.pem \
    /etc/pki/dovecot/private/mailserver.key
bash

Stellen Sie an­schlie­ßend die vor­ge­se­he­nen SELinux-Kontexte wieder her:

sudo restorecon -Rv /etc/pki/tls
sudo restorecon -Rv /etc/pki/dovecot
bash

Zer­ti­fi­kat au­to­ma­tisch erneuern

Das Certbot-Paket aus EPEL enthält einen systemd-Timer für au­to­ma­ti­sche Ver­län­ge­run­gen. Ak­ti­vie­ren Sie ihn:

sudo systemctl enable --now certbot-renew.timer
bash

Da Certbot für die Er­neue­rung ebenfalls den Stan­da­lo­ne-Modus verwendet, muss Port 80 vor­über­ge­hend frei sein. Erstellen Sie deshalb einen Pre-Hook zum Stoppen und einen Post-Hook zum erneuten Starten von Nginx:

sudo mkdir -p /etc/letsencrypt/renewal-hooks/pre
sudo mkdir -p /etc/letsencrypt/renewal-hooks/post
bash

Erstellen Sie außerdem ein Stopp-Skript mit sudo nano /etc/letsencrypt/renewal-hooks/pre/stop-nginx.sh und folgendem Inhalt:

#!/bin/bash
systemctl stop nginx

Erstellen Sie das äqui­va­len­te Start-Skript mit sudo nano /etc/letsencrypt/renewal-hooks/post/start-nginx.sh und als Inhalt:

#!/bin/bash
systemctl start nginx

Machen Sie beide Dateien aus­führ­bar:

sudo chmod 700 /etc/letsencrypt/renewal-hooks/pre/stop-nginx.sh
sudo chmod 700 /etc/letsencrypt/renewal-hooks/post/start-nginx.sh
bash

Da Postfix und Dovecot mit Kopien des Zer­ti­fi­kats arbeiten, müssen diese nach einer Ver­län­ge­rung ebenfalls ak­tua­li­siert werden. Erstellen Sie hierfür:

sudo nano /etc/letsencrypt/renewal-hooks/deploy/mailserver-certs.sh
bash

Fügen Sie Folgendes ein:

#!/bin/bash
set -e
install -m 0644 "$RENEWED_LINEAGE/fullchain.pem" \
    /etc/pki/tls/certs/mailserver-fullchain.pem
install -m 0600 "$RENEWED_LINEAGE/privkey.pem" \
    /etc/pki/tls/private/mailserver.key
install -m 0644 "$RENEWED_LINEAGE/fullchain.pem" \
    /etc/pki/dovecot/certs/mailserver-fullchain.pem
install -m 0600 "$RENEWED_LINEAGE/privkey.pem" \
    /etc/pki/dovecot/private/mailserver.key
restorecon -R /etc/pki/tls /etc/pki/dovecot
systemctl reload postfix || true
systemctl reload dovecot || true
systemctl reload nginx || true

Speichern Sie die Datei und machen Sie sie aus­führ­bar:

sudo chmod 700 /etc/letsencrypt/renewal-hooks/deploy/mailserver-certs.sh
bash

Die grund­sätz­li­che Zer­ti­fi­kats­er­neue­rung können Sie an­schlie­ßend testen:

sudo certbot renew --dry-run
bash

Schritt 6: Dovecot für IMAP und Maildir kon­fi­gu­rie­ren

Dovecot übernimmt in diesem Setup zwei Aufgaben: Es stellt die Post­fä­cher per IMAP bereit und übernimmt die Au­then­ti­fi­zie­rung der Benutzer für Postfix. Außerdem lassen wir Postfix ein­ge­hen­de Nach­rich­ten per LMTP an Dovecot übergeben.

Dovecot verwendet unter Rocky Linux 9 stan­dard­mä­ßig NSS für die Be­nut­zer­da­ten und PAM für die Au­then­ti­fi­zie­rung. Somit können Sie für eine einfache In­stal­la­ti­on zunächst normale lokale Linux-Benutzer als Mail­kon­ten verwenden.

Nur IMAP und LMTP ak­ti­vie­ren

Öffnen Sie zunächst:

sudo nano /etc/dovecot/dovecot.conf
bash

Setzen Sie be­zie­hungs­wei­se ergänzen Sie:

protocols = imap lmtp

Damit de­ak­ti­vie­ren Sie das nicht benötigte POP3 und ak­ti­vie­ren neben IMAP auch LMTP.

Maildir als Post­fach­for­mat verwenden

Öffnen Sie die Kon­fi­gu­ra­ti­ons­da­tei:

sudo nano /etc/dovecot/conf.d/10-mail.conf
bash

Suchen Sie nach mail_location und setzen Sie:

mail_location = maildir:~/Maildir
bash

Damit befindet sich das Postfach des Users alice später unter /home/alice/Maildir. Maildir speichert jede Nachricht als separate Datei und lässt sich für ein einfaches Postfix-Dovecot-Setup gut nach­voll­zie­hen.

Au­then­ti­fi­zie­rung kon­fi­gu­rie­ren

Öffnen Sie:

sudo nano /etc/dovecot/conf.d/10-auth.conf
bash

Stellen Sie sicher, dass folgende Werte gesetzt sind:

disable_plaintext_auth = yes
auth_mechanisms = plain login

PLAIN und LOGIN über­tra­gen die Zu­gangs­da­ten nicht selbst ver­schlüs­selt. Deshalb dürfen sie aus­schließ­lich innerhalb einer TLS-ge­schütz­ten Ver­bin­dung verwendet werden. Dovecot ver­hin­dert in seiner sicheren Stan­dard­kon­fi­gu­ra­ti­on eine Klar­text­au­then­ti­fi­zie­rung über un­ver­schlüs­sel­te Ver­bin­dun­gen.

TLS für Dovecot ein­rich­ten

Öffnen Sie nun die SSL-Kon­fi­gu­ra­ti­ons­da­tei:

sudo nano /etc/dovecot/conf.d/10-ssl.conf
bash

Setzen Sie:

ssl = required
ssl_cert = </etc/pki/dovecot/certs/mailserver-fullchain.pem
ssl_key = </etc/pki/dovecot/private/mailserver.key

Beachten Sie das < un­mit­tel­bar vor den Da­tei­pfa­den.

Dovecot-Au­then­ti­fi­zie­rung für Postfix freigeben

Auch die Kon­fi­gu­ra­ti­ons­da­tei für Dovecot sollten Sie anpassen:

sudo nano /etc/dovecot/conf.d/10-master.conf
bash

Suchen Sie den vor­han­de­nen Block:

service auth {

und ergänzen Sie innerhalb dieses Blocks folgenden Listener:

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

Postfix kann damit die Dovecot-Au­then­ti­fi­zie­rung über einen lokalen Unix-Socket verwenden. Suchen Sie an­schlie­ßend im selben Dokument den Abschnitt:

service lmtp {

und kon­fi­gu­rie­ren Sie den lokalen LMTP-Socket:

service lmtp {
    unix_listener lmtp {
        mode = 0600
        user = postfix
        group = postfix
    }
}

Dovecot erzeugt damit stan­dard­mä­ßig den Socket /var/run/dovecot/lmtp und Postfix kann ein­ge­hen­de Nach­rich­ten später über diesen Socket an Dovecot übergeben.

Prüfen Sie ab­schlie­ßend die Dovecot-Kon­fi­gu­ra­ti­on:

sudo doveconf -n
bash

Wenn keine Feh­ler­mel­dung erscheint, können Sie Dovecot starten:

sudo systemctl enable --now dovecot
bash

Schritt 7: Postfix kon­fi­gu­rie­ren

Postfix ist der ei­gent­li­che SMTP-Server. Er nimmt Nach­rich­ten anderer Mail­ser­ver auf Port 25 entgegen und er­mög­licht an­ge­mel­de­ten Usern den Versand über Port 587. Rocky Linux be­zie­hungs­wei­se RHEL kon­fi­gu­riert Postfix zunächst so, dass der Dienst nur auf dem lokalen System er­reich­bar ist. Für einen öf­fent­li­chen Mail­ser­ver muss inet_interfaces deshalb auf all gesetzt werden.

Die wich­tigs­ten Ein­stel­lun­gen lassen sich mit postconf setzen. Führen Sie folgende Befehle aus:

sudo postconf -e "myhostname = mail.example.com"
sudo postconf -e "mydomain = example.com"
sudo postconf -e 'myorigin = $mydomain'
sudo postconf -e "inet_interfaces = all"
sudo postconf -e "inet_protocols = ipv4"
bash

Diese Anleitung be­schränkt Postfix zunächst auf IPv4. Wenn Ihr Server auch über voll­stän­dig ein­ge­rich­te­tes IPv6 samt AAAA- und PTR-Record verfügt, können Sie statt­des­sen inet_protocols = all verwenden.

Legen Sie an­schlie­ßend fest, für welche Domain der Server selbst zuständig ist:

sudo postconf -e 'mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain'
bash

Be­schrän­ken Sie das ohne Anmeldung ver­trau­ens­wür­di­ge Netzwerk auf den Server selbst:

sudo postconf -e "mynetworks = 127.0.0.0/8"
bash
Tipp

Tragen Sie hier nicht pauschal öf­fent­li­che oder große private Netz­be­rei­che ein. Systeme innerhalb von mynetworks dürfen Nach­rich­ten ohne SMTP-Au­then­ti­fi­zie­rung wei­ter­lei­ten. Eine zu groß­zü­gi­ge Ein­stel­lung kann Ihren Server deshalb zum offenen Mail-Relay machen.

Lokale Zu­stel­lung an Dovecot übergeben

Kon­fi­gu­rie­ren Sie Postfix so, dass Nach­rich­ten für lokale User über LMTP an Dovecot wei­ter­ge­ge­ben werden:

sudo postconf -e "mailbox_transport = lmtp:unix:/var/run/dovecot/lmtp"
bash

SMTP-Au­then­ti­fi­zie­rung mit Dovecot ak­ti­vie­ren

Ak­ti­vie­ren Sie an­schlie­ßend SASL und legen Sie Dovecot als Au­then­ti­fi­zie­rungs­dienst fest:

sudo postconf -e "smtpd_sasl_auth_enable = yes"
sudo postconf -e "smtpd_sasl_type = dovecot"
sudo postconf -e "smtpd_sasl_path = private/auth"
sudo postconf -e "broken_sasl_auth_clients = yes"
sudo postconf -e "smtpd_sasl_security_options = noanonymous, noplaintext"
sudo postconf -e "smtpd_sasl_tls_security_options = noanonymous"
sudo postconf -e "smtpd_tls_auth_only = yes"
bash

Erlauben Sie die Wei­ter­lei­tung von Nach­rich­ten aus­schließ­lich für ver­trau­ens­wür­di­ge lokale Prozesse und er­folg­reich au­then­ti­fi­zier­te User:

sudo postconf -e "smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination"
bash

Diese Ein­schrän­kung ist wichtig. Ohne eine korrekte Relay-Regel könnte ein falsch kon­fi­gu­rier­ter Mail­ser­ver von Dritten zum Spam­ver­sand miss­braucht werden.

TLS für Postfix ak­ti­vie­ren

Binden Sie das zuvor ein­ge­rich­te­te Zer­ti­fi­kat ein:

sudo postconf -e "smtpd_tls_cert_file = /etc/pki/tls/certs/mailserver-fullchain.pem"
sudo postconf -e "smtpd_tls_key_file = /etc/pki/tls/private/mailserver.key"
sudo postconf -e "smtpd_tls_security_level = may"
sudo postconf -e "smtp_tls_security_level = may"
bash

Auf dem öf­fent­li­chen SMTP-Port 25 verwenden Sie bewusst may. Damit bietet Postfix TLS an, kann aber weiterhin E-Mails von be­zie­hungs­wei­se an ältere Mail­ser­ver über­tra­gen, die kein TLS un­ter­stüt­zen.

Schritt 8: Sicheren Sub­mis­si­on-Port 587 ak­ti­vie­ren

Öffnen Sie die Postfix-Master-Kon­fi­gu­ra­ti­on:

sudo nano /etc/postfix/master.cf
bash

Suchen Sie den nor­ma­ler­wei­se aus­kom­men­tier­ten Abschnitt für submission. Ak­ti­vie­ren be­zie­hungs­wei­se ergänzen Sie folgenden Block:

submission inet n             -             n             -             -             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
    -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

Achten Sie darauf, dass die Zeilen mit -o ein­ge­rückt sind. Port 587 ist für Mail­pro­gram­me wie Thun­der­bird, Outlook oder Roundcube gedacht. Anders als beim SMTP-Verkehr zwischen Mail­ser­vern wird hier eine ver­schlüs­sel­te Ver­bin­dung sowie eine er­folg­rei­che Be­nut­zer­an­mel­dung verlangt.

Prüfen Sie an­schlie­ßend die Postfix-Kon­fi­gu­ra­ti­on:

sudo postfix check
bash

Starten Sie Postfix und ak­ti­vie­ren Sie den au­to­ma­ti­schen Start:

sudo systemctl enable --now postfix
bash

Schritt 9: Erstes Mailkonto erstellen

In dieser Ein­stei­ger­kon­fi­gu­ra­ti­on ent­spre­chen Mail­kon­ten lokalen Linux-Usern. Legen Sie bei­spiels­wei­se den User alice an:

sudo useradd --create-home --shell /sbin/nologin alice
bash

Vergeben Sie an­schlie­ßend ein sicheres Passwort:

sudo passwd alice
bash

Das Konto besitzt damit die E-Mail-Adresse alice@example.com.

/sbin/nologin ver­hin­dert, dass das Mailkonto gleich­zei­tig für einen normalen Shell-Login genutzt werden kann.

Legen Sie an­schlie­ßend die Maildir-Ver­zeich­nis­struk­tur an:

sudo -u alice mkdir -p \
    /home/alice/Maildir/cur \
    /home/alice/Maildir/new \
    /home/alice/Maildir/tmp
bash

Be­schrän­ken Sie die Zu­griffs­rech­te:

sudo chmod 700 /home/alice/Maildir
bash

Stan­dard­adres­sen ein­rich­ten

Öffnen Sie:

sudo nano /etc/aliases
bash

Ergänzen Sie:

root: alice
postmaster: alice
abuse: alice

Erstellen Sie an­schlie­ßend die Alias-Datenbank neu:

sudo newaliases
bash

Nach­rich­ten an postmaster@example.com oder abuse@example.com landen damit im Postfach von alice.

Schritt 10: Absender eines Users be­schrän­ken

Ohne zu­sätz­li­che Ein­schrän­kung könnte sich ein au­then­ti­fi­zier­ter Benutzer zwar mit seinem eigenen Konto anmelden, im SMTP-Umschlag aber eine andere Ab­sen­der­adres­se verwenden. Erstellen Sie deshalb:

sudo nano /etc/postfix/sender_login_maps
bash

Für das Bei­spiel­kon­to tragen Sie ein:

alice@example.com alice

Erzeugen Sie daraus eine Postfix-Lookup-Tabelle:

sudo postmap /etc/postfix/sender_login_maps
bash

Ak­ti­vie­ren Sie sie:

sudo postconf -e "smtpd_sender_login_maps = hash:/etc/postfix/sender_login_maps"
bash

Ergänzen Sie im bereits ein­ge­rich­te­ten submission-Block in /etc/postfix/master.cf außerdem:

-o smtpd_sender_restrictions=reject_authenticated_sender_login_mismatch

Für jedes weitere Mailkonto ergänzen Sie später eine weitere Zeile in sender_login_maps und führen danach erneut postmap aus. Postfix stellt hierfür smtpd_sender_login_maps und reject_authenticated_sender_login_mismatch bereit. Dadurch kann ein an­ge­mel­de­ter User nur Envelope-Absender verwenden, die seinem SMTP-Login zu­ge­ord­net wurden.

Laden Sie Postfix an­schlie­ßend neu:

sudo systemctl reload postfix
bash

Schritt 11: Roundcube in­stal­lie­ren

Für die Webmail-Ober­flä­che verwenden Sie die ak­tu­ells­te Version von Roundcube (aktuell 1.7.4). Vom einfachen sudo dnf install roundcubemail ist in diesem Fall abzuraten, da eine veraltete Version in­stal­liert wird. Laden Sie deshalb auf Ihrem Computer das Complete-Paket von Roundcube von der of­fi­zi­el­len Down­load­sei­te herunter.

Über­tra­gen Sie die Datei an­schlie­ßend bei­spiels­wei­se per SCP auf Ihren Server. Verwenden Sie dafür einen Benutzer, der sich per SSH anmelden darf, nicht den zuvor an­ge­leg­ten Mailuser alice :

scp ~/Downloads/roundcubemail-1.7.4-complete.tar.gz <ssh-user>@mail.example.com:/tmp/
bash

Ersetzen Sie <ssh-user> durch Ihren tat­säch­li­chen SSH-Be­nut­zer­na­men.

Entpacken Sie die Datei auf dem Server:

cd /tmp
tar -xzf roundcubemail-1.7.4-complete.tar.gz
sudo mv roundcubemail-1.7.4 /var/www/roundcube
bash

Schritt 12: Roundcube-Datenbank mit SQLite ein­rich­ten

Roundcube benötigt eine Datenbank für Ein­stel­lun­gen, Kontakte, Sitzungen und weitere Metadaten. Für einen kleinen Mail­ser­ver eignet sich SQLite, da kein zu­sätz­li­cher Da­ten­bank­ser­ver notwendig ist. Erstellen Sie das Da­ten­bank­ver­zeich­nis:

sudo install -d -o apache -g apache -m 0770 /var/lib/roundcube
bash

In­itia­li­sie­ren Sie an­schlie­ßend die Datenbank mit dem von Roundcube mit­ge­lie­fer­ten Schema:

sudo -u apache sqlite3 /var/lib/roundcube/roundcube.db \
    < /var/www/roundcube/SQL/sqlite.initial.sql
bash

Setzen Sie die Zu­griffs­rech­te:

sudo chown apache:apache /var/lib/roundcube/roundcube.db
sudo chmod 0660 /var/lib/roundcube/roundcube.db
bash

Dass der User apache heißt, obwohl Nginx verwendet wird, ist unter Rocky Linux nicht un­ge­wöhn­lich: Der stan­dard­mä­ßi­ge PHP-FPM-Pool läuft auch bei der Ver­wen­dung mit Nginx als User apache.

Schritt 13: Roundcube kon­fi­gu­rie­ren

Erstellen Sie einen zu­fäl­li­gen Schlüssel, mit dem Roundcube unter anderem temporär ge­spei­cher­te Zu­gangs­da­ten schützt:

openssl rand -base64 18
bash

Kopieren Sie die Ausgabe. Erstellen Sie an­schlie­ßend die Roundcube-Kon­fi­gu­ra­ti­on:

sudo nano /var/www/roundcube/config/config.inc.php
bash

Fügen Sie folgende Grund­kon­fi­gu­ra­ti­on ein:

<?php
$config = [];
$config['db_dsnw'] = 'sqlite:////var/lib/roundcube/roundcube.db';
$config['imap_host'] = 'ssl://mail.example.com:993';
$config['smtp_host'] = 'tls://mail.example.com:587';
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
$config['mail_domain'] = 'example.com';
$config['product_name'] = 'Webmail example.com';
$config['des_key'] = 'HIER-IHREN-24-ZEICHEN-SCHLUESSEL';
$config['plugins'] = [
    'archive',
    'zipdownload',
];
$config['skin'] = 'elastic';
$config['identities_level'] = 3;
$config['enable_installer'] = false;

Ersetzen Sie Domain, Hostname und ins­be­son­de­re des_key durch Ihre eigenen Werte. Roundcube verwendet ssl:// für eine implizit ver­schlüs­sel­te IMAP-Ver­bin­dung und tls:// für STARTTLS beim SMTP-Versand.

Setzen Sie an­schlie­ßend re­strik­ti­ve Zu­griffs­rech­te auf die Kon­fi­gu­ra­ti­on:

sudo chown root:apache /var/www/roundcube/config/config.inc.php
sudo chmod 640 /var/www/roundcube/config/config.inc.php
bash

Die Ver­zeich­nis­se temp und logs müssen dagegen vom PHP-FPM-Prozess be­schreib­bar sein:

sudo chown -R apache:apache /var/www/roundcube/temp
sudo chown -R apache:apache /var/www/roundcube/logs
bash

Schritt 14: SELinux für Roundcube kon­fi­gu­rie­ren

SELinux sollte unter Rocky Linux aktiviert bleiben. Damit Nginx und PHP-FPM auf die Roundcube-Dateien zugreifen können, weisen Sie die passenden SELinux-Kontexte zu:

sudo semanage fcontext -a -t httpd_sys_content_t \
    '/var/www/roundcube(/.*)?'
sudo semanage fcontext -a -t httpd_sys_rw_content_t \
    '/var/www/roundcube/temp(/.*)?'
sudo semanage fcontext -a -t httpd_sys_rw_content_t \
    '/var/www/roundcube/logs(/.*)?'
sudo semanage fcontext -a -t httpd_sys_rw_content_t \
    '/var/lib/roundcube(/.*)?'
bash

Wenden Sie die Regeln an­schlie­ßend an:

sudo restorecon -Rv /var/www/roundcube
sudo restorecon -Rv /var/lib/roundcube
bash

Damit Roundcube Ver­bin­dun­gen zu Postfix und Dovecot her­stel­len kann, ak­ti­vie­ren Sie zu­sätz­lich:

sudo setsebool -P httpd_can_network_connect 1
bash

Schritt 15: Nginx für Roundcube kon­fi­gu­rie­ren

Erstellen Sie eine neue Nginx-Kon­fi­gu­ra­ti­on:

sudo nano /etc/nginx/conf.d/roundcube.conf
bash

Fügen Sie folgende Kon­fi­gu­ra­ti­on ein:

server {
    listen 80;
    server_name mail.example.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    server_name mail.example.com;
    root /var/www/roundcube/public_html;
    index index.php;
    ssl_certificate /etc/letsencrypt/live/mail.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mail.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    client_max_body_size 25M;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php(?:/|$) {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php-fpm/www.sock;
    }
    location ~ /\. {
        deny all;
    }
}

Prüfen Sie an­schlie­ßend die Kon­fi­gu­ra­ti­on und laden Sie Nginx neu:

sudo nginx -t
sudo systemctl reload nginx
bash

Rufen Sie danach im Browser https://mail.example.com auf. Die Roundcube-An­mel­de­mas­ke sollte er­schei­nen.

Schritt 16: Mail­ser­ver testen

Prüfen Sie zunächst, ob alle Dienste laufen:

sudo systemctl status postfix dovecot nginx php-fpm
bash

Mit folgendem Befehl kon­trol­lie­ren Sie die ge­öff­ne­ten Ports:

sudo ss -tulpn
bash

Für dieses Setup sollten ins­be­son­de­re die Ports 25, 587, 993, 80 und 443 er­reich­bar sein. Die ver­schlüs­sel­te IMAP-Ver­bin­dung können Sie mit OpenSSL testen:

openssl s_client \
    -connect mail.example.com:993 \
    -servername mail.example.com
bash

Für SMTP über Port 587 verwenden Sie:

openssl s_client \
    -starttls smtp \
    -connect mail.example.com:587 \
    -servername mail.example.com
bash

Melden Sie sich an­schlie­ßend in Roundcube mit dem zuvor an­ge­leg­ten User an:

  • Be­nut­zer­na­me: alice
  • Passwort: das zuvor vergebene Passwort

Senden Sie testweise eine Nachricht an eine externe Adresse und an­schlie­ßend eine Nachricht von einem externen Postfach an alice@example.com.

Mail­ser­ver für den Pro­duk­tiv­be­trieb erweitern

Mit der bis­he­ri­gen Kon­fi­gu­ra­ti­on verfügen Sie über einen funk­ti­ons­fä­hi­gen Rocky Linux Mail­ser­ver. Für einen dauerhaft öf­fent­lich be­trie­be­nen Server sollten Sie das Setup jedoch noch um einige Si­cher­heits- und Zu­stell­bar­keits­funk­tio­nen erweitern.

Dazu gehören ins­be­son­de­re DKIM und DMARC, ein Spam­fil­ter wie Rspamd, Schutz vor Brute-Force-Angriffen, re­gel­mä­ßi­ge Backups sowie kon­ti­nu­ier­li­che Si­cher­heits­up­dates. Für größere In­stal­la­tio­nen mit mehreren Domains oder vielen Konten sind außerdem virtuelle Mailuser über bei­spiels­wei­se MariaDB, Post­greS­QL oder LDAP besser geeignet als lokale Linux-User.

Reviewer

Zum Hauptmenü