Die Einrichtung eines vollwertigen E-Mail-Servers erfordert umfassendes Fachwissen. Essenziell sind dabei eine eigene Domain sowie eine gleichbleibende öffentliche IP-Adresse. Zusätzlich zum eigentlichen Mail-Server, also dem Postfix selbst, benötigt man einen Mail Delivery Agent wie Dovecot und eine zuverlässig funktionierende Anti-Spam-Erweiterung.
All das ist nicht nur kompliziert in der Einrichtung, sondern auch zeitaufwendig in der Betreuung. Glücklicherweise gibt es für uns Homelabber eine simplere Vorgehensweise. Uns genügt meist schon ein Mail-Transfer-Agent in Kombination mit einem Smarthost – also eine simple Postfix-Installation, die alle E-Mails an einen professionellen Dienst wie Mailbox.org, Posteo oder GMX weiterleitet.
Dieser übernimmt dann den finalen Mail-Versand an das Empfänger-Postfach. In diesem Tutorial zeige ich dir, wie du das in wenigen Minuten selbst einrichtest. Die Postfix-Installation kann entweder nativ auf einem Linux-Server erfolgen oder du nutzt ein fertiges Container-Image. Ich verwende beide Varianten selbst und werde sie in den folgenden Zeilen detailliert vorstellen.
Mail-Server generell erklärt:
Bevor wir mit der Installation und Einrichtung von Postfix beginnen, möchte ich dir die wichtigsten Begriffe und Ports aus dem Mail-Server-Universum vorstellen. Das ist besonders hilfreich, wenn du tiefer in die Materie eintauchen willst, denn die Postfix-Dokumentation richtet sich eher an versierte User. Wie bereits zu Beginn erwähnt, werden wir heute einen Mail-Transfer-Agent (MTA) einrichten.
Hierbei handelt es sich um eine Software, die für das Senden, Empfangen und Weiterleiten von E-Mails zuständig ist. Genutzt wird dafür das Simple Mail Transfer Protocol (SMTP). Kombiniert man den MTA mit einem Smarthost, werden die Mails nicht mehr selbst, sondern über einen speziellen E-Mail-Server, den sogenannten Relayhost, weitergeleitet.
Dieses Vorgehen bietet zahlreiche Vorteile. Der Mail-Transfer-Agent muss beispielsweise nicht mehr öffentlich erreichbar sein und ist im Handumdrehen eingerichtet. Außerdem kümmert sich der Dienstleister um wesentliche Aufgaben wie Spamerkennung, Virenschutz, die Pflege der Reputation und die Fehlersuche bei gebouncten Nachrichten.
Der Dienstleister kann ein Freemail-Anbieter wie GMX, Gmail oder Yahoo sein. Wer hingegen eine eigene Domain besitzt, kann auf Provider wie mailbox.org, mail.de oder Posteo zurückgreifen. Diese ermöglichen das Versenden von E-Mails mit der eigenen Domain. Je nach Tarif arbeitet man entweder mit einem einzigen Postfach und mehreren Aliasen oder legt für jede Adresse eine eigene Mailbox an.
Wie ein Sendonly-Mail-Server in Kombination mit einem Smarthost funktioniert, haben wir bereits geklärt, jedoch ohne dabei allzu tief ins Detail zu gehen. Das möchte ich nun nachholen. Ein E-Mail-Server lauscht in der Regel auf drei bestimmten Ports: Eine unverschlüsselte Übertragung findet über Port 25 statt, während verschlüsseltes SMTP auf Port 465 verfügbar ist.
Eine Kombination aus beiden Varianten bietet Port 587. Im Fachjargon spricht man hier von Submission mit STARTTLS. Dabei vereinbaren beide Systeme, ob die Verbindung verschlüsselt wird. Das heißt aber auch, dass zu Beginn alle Daten im Klartext übertragen werden. Der Vollständigkeit halber möchte ich an dieser Stelle noch ein paar Worte zu Mail Delivery sowie Mail User Agents verlieren.
Unser lokal installierter E-Mail-Client, wie Thunderbird, Evolution oder das altbekannte Outlook wird dabei als Mail User Agent bezeichnet. Diese Software kommuniziert unter anderem über Port 587 mit einem Mail-Server, jedoch nur, wenn E-Mails versendet werden sollen. Die restliche Kommunikation, insbesondere der Empfang von E-Mails, erfolgt über IMAP oder POP3.
Da diese Protokolle von Postfix nicht direkt unterstützt werden, kommt ein Mail Delivery Agent (MDA) wie Dovecot zum Einsatz. Dieser übernimmt die Aufgabe, E-Mails von Postfix entgegenzunehmen und sie für den Abruf durch den E-Mail-Client bereitzustellen. So wird sichergestellt, dass der E-Mail-User-Agent (MUA) vollständig und korrekt bedient werden kann.
Soweit wird dieses Tutorial allerdings nicht in die Tiefe gehen. Wenn du dem Artikel bis zum Ende gefolgt bist, wirst du einen simplen Sendonly-Service auf deinem Linux-Server haben, der ausschließlich SMTP ohne Verschlüsselung zur Mail-Entgegennahme nutzt. Das vorgestellte Container-Image ist hier besser ausgestattet und bietet eine verschlüsselte Kommunikation über Port 587.
Was in beiden Fällen nicht funktionieren wird, ist die Verwendung von Client-Software wie Thunderbird, Evolution oder Outlook. Du kannst dich allerdings via SSH auf deinem Server einloggen und so eine Test-Mail verschicken. Das klappt sogar direkt im Container, dank des Debian-Image. Aber genügend Theorie für heute. Lass uns endlich loslegen!
Aufgrund vermehrter Nachfragen möchte ich an dieser Stelle noch Fetchmail vorstellen. Es handelt sich hierbei um ein E-Mail-Retrieval-Programm, das sich mit dem Smarthost-Anbieter via IMAP oder POP3 verbindet und eingehende E-Mails so auf den lokalen Mail-Server transferiert. Dovecot übernimmt dann die letzte Etappe, also das Handling der Verbindung mi dem Mail-User-Agent.
Postfix grundlegend installieren:
Das Aufsetzen von Postfix ist relativ einfach. Je nach Linux-Distribution verwendet man unterschiedliche Paketmanager, und zusätzlich benötigte Pakete haben leicht abweichende Namen. Auch die späteren Konfigurationsdetails werden sich bei den Pfaden etwas unterscheiden. Dazu aber später mehr. An dieser Stelle werde ich erstmal das Aufspielen abhandeln.
Native Installation unter Linux:
Zu Beginn des Abschnitts möchte ich die Installation unter Debian und seinen Derivaten mithilfe des Advanced Package Tools erläutern. Die meisten dürften den Paketmanager unter der Abkürzung apt aus der Konsole kennen. Postfix lässt sich hier wie folgt einspielen:
apt install postfix -y
Sobald die Installation abgeschlossen ist, öffnet sich ein Einrichtungsassistent. Allerdings führt die generierte Konfiguration nur selten zu einem betriebsbereiten Zustand. Dies liegt nicht zuletzt daran, dass zu diesem Zeitpunkt noch kein Paket für die spätere Authentifizierung mit deinem Smarthost-Anbieter auf dem Server vorhanden ist. Das holt man wie folgt nach:
apt install libsasl2-modules -y
Auch Red Hat und seine Derivate habe ich nicht vergessen. Das Vorgehen ist natürlich ähnlich. Das Paket für die Unterstützung des Simple Authentication and Security Layer Protokolls (SASL) musst du allerdings nicht gesondert installieren. Hier genügt schon das Postfix-Paket selbst:
yum install postfix -y
Inbetriebnahme als Docker-Container:
Container sind immer mehr auf dem Vormarsch, und eine direkte Installation auf dem Server ist daher nicht immer der rationalste Ansatz. Glücklicherweise gibt es inzwischen ein gelungenes Image im Docker Hub, welches sich mit wenig Aufwand konfigurieren lässt. Persönlich verwende ich es als zentralen SMTP-Server auf einem Docker-Host.
Ein wesentlicher Vorteil eines solchen Setups besteht darin, dass die Authentifizierung beim Smarthost-Anbieter ausschließlich an dieser Stelle stattfindet. Ein kompromittierter Container bietet damit keinen direkten Zugriff auf die sensiblen Zugangsdaten. Zusätzlich zur gesteigerten Sicherheit ermöglicht dies auch die zentrale Überwachung des Mailversands.
Ebenfalls könnte hier noch eine Filterung der ausgehenden Nachrichten implementiert werden. Die folgende Docker-Compose-Datei generiert aber nur einen simplen Mail-Transfer-Agenten. Je nach Smarthost-Anbieter können darin noch ein paar Anpassungen erforderlich sein. Daher empfiehlt es sich, das folgende Kapitel zur Konfiguration von Postfix ausgiebig zu studieren.
version: "3.3"
services:
postfix-mta:
hostname: postfix-docker.example.org
environment:
- RELAYHOST=smtp.example.org:587
- RELAYHOST_USERNAME=john.doe@example.org
- RELAYHOST_PASSWORD=P@ssw0rt
- POSTFIX_myhostname=postfix-docker.example.org
- POSTFIX_smtp_tls_security_level=encrypted
- TZ=Europe/Berlin
container_name: postfix-docker
restart: always
image: boky/postfix
networks:
default:
name: production
external: true
Das Image bringt einen kleinen Minus-Punkt mit sich. Es handelt sich letztendlich um ein Open-Relay mit IP- sowie Domain-Einschränkung. Das bedeutet leider, dass keine Nutzer-Authentifizierung für den E-Mail-Versand vorgesehen ist. Gut zu wissen ist noch, dass das Image auf Port 587 lauscht und man mit dem Präfix POSTFIX_<variable> jede Direktive als Umgebungsvariable übergeben kann.
Postfix korrekt einrichten:
Je nach SMTP-Relay-Service variieren die Konfigurationsschritte für Postfix als Mail-Transfer-Agenten leicht. Jedoch sind gerade diese kleinen Nuancen später entscheidend. Die grundlegende Einrichtung bleibt allerdings stets gleich. Als Ausgangspunkt verwende ich die im Folgenden vorgestellte Konfiguration. Sie befindet sich im Verzeichnis /etc/postfix und trägt den Namen main.cf
Um das Tutorial nicht unnötig in die Länge zu ziehen und da in der Regel nur über die Loopback-Adresse mit einem Sendonly-Server kommuniziert wird, wird hier nur Port 25 für eine unverschlüsselte Datenübertragung genutzt. Sobald auch Mails von anderen Systemen aus dem Netzwerk weitergeleitet werden sollen, ist es ratsam, Port 587 sowie 465 mit TLS-Verschlüsselung in Betrieb zu nehmen.
####################################
# Hostkonfiguration #
####################################
# Spezifiziere den vollständigen Namen deines Servers:
myhostname = hostname.example.org
####################################
# Relay-Konfiguration #
####################################
# Definiere den zu nutzenden Relay-Host / Smarthost:
relayhost = [smtp.example.org]:587
####################################
# Netzwerk-Konfiguration #
####################################
# Lege alle erlaubten IP-Adressen oder Netzwerke für den Mail-Versand fest:
mynetworks = 127.0.0.0/8
####################################
# Authentifizierungs-Konfiguration #
####################################
# Aktiviere die Authentifizierung via SASL-Protokoll:
smtp_sasl_auth_enable = yes
# Gehashte Passwort-Datei mit den Zugangsdaten für den SMTP-Relay-Anbieter:
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# Postfix wird sich beim Verbindungsaufbau mit dem Smarthost stets authentifizieren:
smtp_sasl_security_options = noanonymous
###################################
# TLS-Konfiguration #
###################################
# Nutze immer eine TLS verschlüsselte Mailübertragung:
smtp_use_tls = yes
# Lege das Sicherheitsniveau für TLS-Verbindungen fest. Enrypt erzwingt lediglich TLS, es gibt aber noch strengere Vorgaben:
smtp_tls_security_level = encrypt
# Debian spezifischer Pfad zur Datei, die die Zertifikate von Zertifizierungsstellen (CAs) enthält, die zur Überprüfung der TLS-Verbindungen verwendet werden:
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
# Red Hat spezifischer Pfad zur Datei, die die Zertifikate von Zertifizierungsstellen (CAs) enthält, die zur Überprüfung der TLS-Verbindungen verwendet werden:
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
# Deaktivierung der unsicheren SSL-Protokolle. Hier empfiehlt sich nach Möglichkeit ein deutlich restriktiveres Vorgehen:
smtp_tls_protocols = !SSLv2, !SSLv3
Die Erstellung der oben genannten Konfigurationsdatei ist nur der erste Schritt. Postfix erwartet zusätzlich die vollständigen Anmeldeinformationen, einschließlich des Relay-Hosts sowie Benutzername und Passwort, in einer separaten Datei. Ich habe im Rahmen dieses Artikels den Pfad /etc/postfix/sasl_passwd gewählt:
[smtp.example.org]:587 john.doe@example.org:P@ssw0rt
Leider kann Postfix den Inhalt der oben genannten Datei nicht lesen. Um dieses Problem zu lösen, müssen wir das Postmap-Kommando verwenden, um die Textdatei in ein für Postfix geeignetes Datenbankformat umzuwandeln:
postmap /etc/postfix/sasl_passwd
Um die vorgenommenen Änderungen wirksam zu machen, führst du das Kommando postfix reload in der Shell aus. Alternativ dazu kannst du den Postfix-Service auch neu laden, indem du den Befehl systemctl reload postfix absetzt. Da wir jedoch Profis sind, prüfen wir zunächst noch kurz die Validität der Konfigurationsdatei mithilfe des Befehls postfix check.
Funktionsweise in der CLI prüfen:
Zum Abschluss der Postfix-Einrichtung solltest du eine Test-Mail versenden. Die Vorgehensweise unterscheidet sich je nach Linux-Distribution etwas. Unter Debian und seinen Derivaten brauchst du keinen Mail-Client zu installieren. Es genügt hier vollkommen, wenn du diesen Befehl in der Shell ausführst:
echo "Kleiner SMTP-Test auf einem Debian System" | mail -s "Sas ist eine Test-Mail. Sie stellt sicher, dass der Mail-Transfer-Agent Postfix korrekt eingerichtet ist." empfaenger@example.org -r absender@example.org
Bei Red Hat hingegen musst du zunächst ein Paket für das Versenden von E-Mails ausrollen. Die Frage, welches Programm am besten geeignet ist, wird gelegentlich diskutiert. Ich habe gute Erfahrungen mit mailx als auch mit s-nail gemacht. Letzteres habe ich für das Verfassen dieses Ratgebers verwendet:
yum install s-nail -y
Nun kannst du das vorgestellte Kommando verwenden, um eine kurze E-Mail an ein Postfach deiner Wahl zu verschicken. Die Syntax ähnelt der Debian-Variante, allerdings gibt es einen Unterschied bei der Angabe der Optionen und den Buchstaben, die verwendet werden:
echo "Kleiner SMTP-Test auf einem Red Hat System" | s-nail -s "Das ist eine Test-Mail. Sie stellt sicher, dass der Mail-Transfer-Agent Postfix korrekt eingerichtet ist." -S from=absender@example.org empfaenger@example.org
Auch der Docker-Container mit seinem Debian-Image kann direkt zum Testen des Mail-Versands genutzt werden. Die Vorgehensweise ähnelt einer herkömmlichen Installation auf Basis von Debian. Allerdings muss man zuerst noch die Paketlisten abrufen, damit der obligatorische Paket-Cache vorhanden ist. Anschließend wird der Mail-Client installiert, gefolgt von einem notwendigen Funktionstest:
apt update && apt install mailutils -y
echo "Kleiner SMTP-Test auf dem Postfix Container mit Debian-Image" | mail -s "Sas ist eine Test-Mail. Sie stellt sicher, dass der Mail-Transfer-Agent Postfix korrekt eingerichtet ist." empfaenger@example.org -r absender@example.org
Logs prüfen & Fehler beheben:
Der Mail-Versand über einen Smarthost ist keine Raketenwissenschaft. Allerdings kommt die erste Mail häufig nicht an. Das kann verschiedene Ursachen haben. Zu Beginn sollte man zunächst die Mail-Warteschlange inspizieren, beispielsweise mit dem Befehl mailq. Hier können Fehlermeldungen wie Connection timed out oder Recipient address rejected Aufschluss über die Fehlerursache geben.
Eine detailliertere Analyse ist natürlich über die Logs möglich. In der Shell deines Linux-Servers kannst du diese mit journalctl -u postfix –follow einsehen, während du beim Container die Logs mithilfe von docker logs <containername> anzeigen lassen kannst. Wie man häufige Meldungen löst und worauf es dabei zu achten gilt, erfährst du nun.
Connection timed out:
Diese Fehlermeldung hat meist zwei verschiedene Ursachen. Im eigenen Heimnetzwerk liegt es häufig an der Nutzung des falschen Ports beim Smarthost-Anbieter. In Firmenumgebungen hingegen benötigt man nicht selten eine Firewallfreischaltung. Andernfalls kann der Mail-Transfer-Agent den Relayhost nicht erreichen. Manche Internet-Service-Provider blocken zudem Port 25.
Connection refused:
Hier gibt es meist nur eine Fehlerursache: fehlerhafte Zugangsdaten. Entweder ist noch eine Zwei-Faktor-Authentifizierung für den Mailversand aktiv oder man muss erst noch einen dedizierten User samt Sende-Berechtigung anlegen. Oftmals ermöglichen die Anbieter auch die Authentifizierung nur mit der bei der Accounterstellung generierten Mailadresse mit der Anbieterdomain.
Recipient address rejected:
Wer mehrere Server im Homelab betreibt, wird häufig diese Fehlermeldung zu Gesicht bekommen. Dieser Logeintrag tritt auf, wenn der Relayhost die Absender-E-Mail-Adresse ablehnt. Meist ist diese nicht im Backend des Anbieters hinterlegt. Allerdings kann es auch an einem Vertipper, einer blockierten IP-Adresse oder einer fehlerhaften Spamfilterung liegen.
Wer einen Freemail-Anbieter nutzt, kann mehrheitlich nur mit der Account-Adresse Mails versenden. In solchen Fällen muss man die Absenderadresse entweder im genutzten Service oder auf dem Server selbst festlegen. Dies kann beispielsweise punktuell in der Crontab-Datei erfolgen oder allgemeingültig über eine Rewrite-Rule in der Postfix-Konfiguration.
Ich werde dir nun zeigen, wie das Letztgenannte umgesetzt wird. Zuerst erweiterst du dafür die Postfix-Konfiguration um folgende drei Einträge:
sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps = regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check
Öffne nun die Datei /etc/postfix/sender_canonical_maps in einem Texteditor wie vim oder nano und füge deine Absenderadresse wie folgt ein:
/.+/ von@example.org
Diese Prozedur wird nun mit leichter anderer Syntax unter /etc/postfix/header_check wiederholt:
/From:.*/ REPLACE From: von@example.org
Jetzt wird automatisch jede Absenderadresse durch die in den Konfigurationen spezifizierte Adresse ersetzt. Angenommen, du führt regelmäßig ein Skript als Cronjob aus, dann musst du in der Crontab-Datei nicht mehr die Direktive MAILFROM=“absender@example.org“ setzen. Außerdem werden nun durch Mails von Systembenutzern wie root keine Fehlermeldungen mehr erzeugt.