Postfix
Wenn ein Unternehmen eine E-Mail verschickt, muss irgendwo ein Programm laufen, das diese Nachricht annimmt, prüft und an den richtigen Empfänger weiterleitet. Postfix ist genau dieses Programm: ein Mail Transfer Agent (MTA), der auf Unix-Systemen läuft und den Versand sowie den Empfang von E-Mails über das SMTP-Protokoll steuert.
Was ein Mail Transfer Agent tut
Ein MTA nimmt E-Mails entgegen und entscheidet, was mit ihnen passiert. Entweder ist der MTA selbst der Zielserver und stellt die Nachricht in ein lokales Postfach zu. Oder die Nachricht gehört zu einer anderen Domäne, und der MTA leitet sie an den zuständigen Server weiter. Postfix übernimmt beide Aufgaben.
Beispiel: Ein Webshop verschickt Bestellbestätigungen. Der Webserver übergibt die E-Mail an den lokalen Postfix-Prozess. Postfix schaut im DNS nach dem MX-Record der Empfängerdomäne und stellt die Nachricht per SMTP an den Zielserver zu.
Beispiel: Eine eingehende E-Mail erreicht den Server auf Port 25. Postfix prüft, ob die Empfängerdomäne lokal konfiguriert ist. Falls ja, wird die Nachricht an einen Local Delivery Agent wie Dovecot übergeben.
Postfix wurde von Wietse Venema entwickelt, erstmals veröffentlicht 1998. Es entstand als Reaktion auf die komplexe und schwer absicherbare Architektur von Sendmail, das bis dahin als Standard-MTA auf Unix-Systemen galt.
Aufbau aus einzelnen Prozessen
Postfix besteht nicht aus einem einzigen Programm, sondern aus mehreren kleinen Prozessen, die jeweils eine Aufgabe übernehmen. Der zentrale Prozess master startet und überwacht alle anderen. Jeder Teilprozess läuft mit minimalen Rechten und hat keinen Zugriff auf Daten, die er nicht benötigt.
Beispiel: Der Prozess smtpd nimmt eingehende SMTP-Verbindungen an. Er validiert die Absenderangaben und die Empfängeradresse, bevor er die Nachricht an den cleanup-Prozess übergibt. Dieser fügt fehlende Header hinzu und normalisiert die Nachricht.
Beispiel: Der Prozess qmgr (Queue Manager) verwaltet die Warteschlange. Er entscheidet, in welcher Reihenfolge Nachrichten zugestellt werden, und übergibt sie an smtp (für externe Zustellung) oder local (für lokale Zustellung).
Dieses modulare Design ist ein Sicherheitsmerkmal. Wenn ein Angreifer eine Schwachstelle in smtpd ausnutzt, hat er keinen Zugriff auf die Warteschlange oder den Zustellungsprozess. Jeder Prozess arbeitet isoliert.
Konfiguration über Textdateien
Postfix wird über zwei zentrale Dateien konfiguriert, die im Verzeichnis /etc/postfix/ liegen. Alle Änderungen erfordern in der Regel einen Reload des Dienstes mit postfix reload.
Beispiel: Die Datei main.cf enthält die globalen Parameter. Der Eintrag myhostname = mail.example.com legt fest, wie sich der Server in SMTP-Sitzungen identifiziert. Der Parameter mydestination definiert, für welche Domänen der Server lokal zuständig ist.
Beispiel: Die Datei master.cf definiert, welche Dienste Postfix startet. Jede Zeile beschreibt einen Prozess mit Typ, Adresse und Parametern. Der Eintrag smtp inet n - y - - smtpd startet den SMTP-Daemon auf Port 25.
Ein häufiger Konfigurationsfall ist das sogenannte Virtual-Mailbox-Setup. Dabei verwaltet Postfix E-Mail-Adressen, die nicht mit Unix-Benutzerkonten verknüpft sind. Die Zuordnung von Adressen zu Postfächern erfolgt über Lookup-Tabellen, die als Hash-Dateien, MySQL-Abfragen oder LDAP-Anfragen implementiert sein können.
Beispiel: In einer Virtual-Mailbox-Konfiguration steht in main.cf der Parameter virtual_mailbox_maps = hash:/etc/postfix/vmailbox. Die Datei vmailbox enthält Zeilen wie info@example.com example.com/info/, die jede Adresse einem Verzeichnispfad zuordnen.
Sicherheit und Zugriffskontrolle
Postfix bringt mehrere Mechanismen mit, um Missbrauch zu verhindern. Die wichtigsten betreffen die Kontrolle darüber, wer E-Mails einliefern darf und unter welchen Bedingungen der Server Nachrichten weiterleitet.
Beispiel: Der Parameter smtpd_relay_restrictions steuert, ob Postfix Mails für fremde Domänen weiterleitet. Eine typische Konfiguration erlaubt Relaying nur für authentifizierte Benutzer: permit_sasl_authenticated, reject_unauth_destination. Ohne diese Einschränkung wäre der Server ein offenes Relay und würde innerhalb von Stunden auf Blacklists landen.
Die Authentifizierung selbst übernimmt Postfix nicht direkt. Stattdessen nutzt es SASL (Simple Authentication and Security Layer), typischerweise über Dovecot als Authentifizierungs-Backend. Der Parameter smtpd_sasl_auth_enable = yes aktiviert die SASL-Unterstützung, und smtpd_sasl_type = dovecot verweist auf den Dovecot-Socket.
Beispiel: TLS-Verschlüsselung wird über smtpd_tls_cert_file und smtpd_tls_key_file aktiviert. Mit smtpd_tls_security_level = may bietet Postfix TLS an, erzwingt es aber nicht. Für Submission (Port 587) wird in master.cf oft smtpd_tls_security_level = encrypt gesetzt, sodass Clients ihre Zugangsdaten nicht unverschlüsselt übertragen.
Die Warteschlange und Zustellversuche
Jede Nachricht, die Postfix annimmt, durchläuft eine Warteschlange. Diese besteht aus mehreren Verzeichnissen unter /var/spool/postfix/. Die Verzeichnisse incoming, active, deferred, bounce und corrupt bilden zusammen das Queue-System.
Beispiel: Eine E-Mail an eine temporär nicht erreichbare Domäne landet in der deferred-Queue. Postfix versucht die Zustellung erneut, zunächst nach 300 Sekunden, dann in exponentiell wachsenden Intervallen. Der Parameter maximal_queue_lifetime definiert, wie lange Postfix es versucht. Der Standardwert beträgt 5 Tage. Danach generiert Postfix eine Bounce-Nachricht an den Absender.
Das Kommandozeilen-Tool mailq zeigt den aktuellen Inhalt der Warteschlange an. Für die gezielte Verwaltung stehen Werkzeuge wie postsuper (zum Löschen oder Halten von Nachrichten) und postqueue -f (zum Erzwingen eines sofortigen Zustellversuchs) zur Verfügung.
Beispiel: Nach einem Netzwerkausfall enthält die deferred-Queue mehrere hundert Nachrichten. Der Befehl postqueue -f erzwingt einen sofortigen Zustellversuch für alle aufgeschobenen Nachrichten. Der Befehl postsuper -d ALL deferred würde stattdessen alle aufgeschobenen Nachrichten löschen.
Zusammenspiel mit Authentifizierung und Filtern
In einer produktiven Mailserver-Umgebung arbeitet Postfix selten allein. Es gibt Schnittstellen für Inhaltsfilter, Virenscanner und Signaturmechanismen. Die wichtigste Schnittstelle ist das Milter-Protokoll (Mail Filter), das ursprünglich für Sendmail entwickelt wurde.
Beispiel: Für DKIM-Signaturen bindet Postfix einen Milter wie OpenDKIM ein. Der Parameter smtpd_milters = inet:localhost:8891 weist Postfix an, jede eingehende Nachricht an den OpenDKIM-Prozess auf Port 8891 zu senden. Dieser prüft eingehende DKIM-Signaturen und signiert ausgehende Nachrichten.
Neben DKIM spielen SPF und DMARC eine zentrale Rolle bei der E-Mail-Authentifizierung. SPF prüft, ob der sendende Server überhaupt im Namen der Absenderdomäne versenden darf. DMARC kombiniert die Ergebnisse von SPF und DKIM und legt fest, was mit nicht authentifizierten Nachrichten geschehen soll.
Beispiel: Ein Postfix-Server empfängt eine Nachricht von newsletter@shop.example.com. Der SPF-Check schaut per DNS nach, ob die IP-Adresse des sendenden Servers im SPF-Record der Domäne shop.example.com aufgeführt ist. Ist sie es nicht, wird die Nachricht je nach DMARC-Policy der Domäne abgelehnt oder in Quarantäne verschoben.
Für Content-Filterung kann Postfix Nachrichten über einen content_filter-Parameter an externe Prozesse übergeben. Das geschieht entweder über SMTP (Before-Queue-Filter) oder über den Transport (After-Queue-Filter). Before-Queue-Filter können Nachrichten ablehnen, bevor sie in die Warteschlange aufgenommen werden.
Lookup-Tabellen und Datenquellen
Postfix speichert Zuordnungen in sogenannten Lookup-Tabellen. Diese Tabellen bilden Schlüssel auf Werte ab und steuern damit Routing, Aliase, Zugriffsrechte und Adressumschreibungen.
Beispiel: Die Datei /etc/postfix/virtual enthält Weiterleitungsregeln wie info@example.com weiterleitung@anderer-server.com. Nach jeder Änderung muss postmap /etc/postfix/virtual ausgeführt werden, um die Textdatei in eine indexierte Hash-Datei zu konvertieren, die Postfix effizient lesen kann.
Neben Hash-Dateien unterstützt Postfix zahlreiche Backend-Typen: mysql:, pgsql:, ldap:, sqlite:, regexp: und pcre:. Die Syntax ist einheitlich: Tabellentyp:Pfad_oder_Query.
Beispiel: Bei einem ISP mit 50.000 Postfächern wären Hash-Dateien unpraktisch. Stattdessen verweist virtual_mailbox_maps = mysql:/etc/postfix/mysql-vmailbox.cf auf eine MySQL-Konfigurationsdatei, die Server, Datenbank, Benutzer und eine SQL-Abfrage enthält. Postfix führt bei jeder eingehenden Nachricht diese Abfrage aus, um zu prüfen, ob das Postfach existiert.
Diagnose und Fehlerbehebung
Postfix protokolliert alle Aktivitäten über syslog, typischerweise in /var/log/mail.log oder /var/log/maillog. Jede SMTP-Sitzung, jeder Zustellversuch und jeder Fehler erzeugt einen Logeintrag mit einer Queue-ID, die eine Nachricht durch das gesamte System verfolgbar macht.
Beispiel: Ein Eintrag wie postfix/smtp[12345]: ABC123: to=<user@example.com>, relay=mx.example.com[93.184.216.34]:25, status=sent (250 OK) zeigt eine erfolgreiche Zustellung. Die Queue-ID ABC123 identifiziert die Nachricht. Der Status sent bestätigt, dass der Zielserver die Nachricht akzeptiert hat.
Bei Zustellproblemen hilft postconf -n, das alle nicht-standardmäßigen Konfigurationsparameter ausgibt. Der Befehl postconf -d zeigt die Standardwerte. Die Differenz zwischen beiden zeigt, welche Parameter bewusst geändert wurden.
Beispiel: Ein Server stellt keine Mails mehr zu. mailq zeigt hunderte Nachrichten in der deferred-Queue mit dem Fehler Connection timed out. Die Ursache liegt oft an einer Firewall, die ausgehende Verbindungen auf Port 25 blockiert. Ein Test mit telnet mx.zielserver.com 25 bestätigt oder widerlegt diese Hypothese.
Grenzen und typische Fehlkonfigurationen
Postfix deckt den Transport von E-Mails ab, nicht deren Speicherung oder Abruf. Für IMAP- und POP3-Zugriff braucht es zusätzliche Software wie Dovecot. Für Webmail braucht es eine weitere Schicht. Postfix ist ein Transportwerkzeug.
Beispiel: Eine häufige Fehlkonfiguration ist ein offenes Relay: Der Server leitet Mails für beliebige Empfänger weiter, ohne den Absender zu authentifizieren. Das Ergebnis: Der Server wird innerhalb kurzer Zeit für Spam missbraucht und landet auf Blacklists. Die Korrektur besteht darin, smtpd_relay_restrictions restriktiv zu setzen.
Eine weitere häufige Fehlerquelle betrifft DNS. Postfix benötigt einen korrekt konfigurierten Reverse-DNS-Eintrag (PTR-Record) für die eigene IP-Adresse. Viele Empfängerserver prüfen, ob der PTR-Record zum HELO-Namen des sendenden Servers passt. Stimmt er nicht überein, wird die Zustellung abgelehnt oder die Nachricht als verdächtig eingestuft.
Beispiel: Ein Server mit der IP 192.0.2.10 meldet sich per HELO als mail.example.com. Der PTR-Record für 192.0.2.10 zeigt aber auf vps12345.hosting.example. Der Empfängerserver stuft die Nachricht als verdächtig ein, weil HELO-Name und PTR-Record nicht übereinstimmen.