SMTP-Chaos im Homelab? Postfix mit Docker!

Ob Passwort-Reset, Monitoring-Alarm oder eine Benachrichtigung über ein fehlgeschlagenes Backup: Auch im Homelab ist ein zuverlässiger E-Mail-Versand elementar. Doch viele von uns scheuen den Aufwand in jeder Anwendung Zugangsdaten für den externen Mail-Anbieter (Smarthost) zu hinterlegen.

Abhilfe schafft hier ein zentrales SMTP-Relay. Dadurch müssen weniger Systeme sensible Zugangsdaten speichern, und die Konfiguration des ausgehenden Mailverkehrs lässt sich zentral verwalten. In diesem Artikel zeige ich dir, wie du das Ganze in 15 Minuten mit einem super simplen Postfix-Container umsetzt.

Das benötigst du für den Start:

Docker & Docker ComposeZum Bereitstellen und Verwalten des Postfix-Containers
Smarthost-AnbieterExterner SMTP-Server für die Zustellung der E-Mails, beispielsweise mailbox.org
TLS-ZertifikatEigenes Zertifikat für die verschlüsselte Verbindung zwischen deinen Anwendungen und Postfix

1. Docker Compose konfigurieren:

Für den SMTP-Relay verwenden wir das Image boky/postfix. Die Konfiguration erfolgt über Umgebungsvariablen in der Compose-Datei:

services:
  postfix:
    # Verwendetes Postfix-Docker-Image
    image: boky/postfix:latest

    # Name des Containers
    container_name: postfix

    # Container nach einem Neustart des Docker-Hosts automatisch starten
    restart: always

    # Postfix sieht die Quell-IP-Adressen der Clients
    network_mode: host

    environment:
      # ANPASSEN: Vollständiger Hostname des lokalen SMTP-Relays
      HOSTNAME: mailrelay.deine-domain.de

      # ANPASSEN: SMTP-Server und Port deines Anbieters
      RELAYHOST: <smtp.anbieter.org:587>

      # ANPASSEN: Benutzername für die SMTP-Authentifizierung
      RELAYHOST_USERNAME: <user@anbieter.org>

      # ANPASSEN: Passwort oder App-Passwort des Mail-Anbieters
      # Empfehlung: Zugangsdaten nicht direkt in der Compose-Datei speichern
      RELAYHOST_PASSWORD: <Passwort>

      # TLS-Verschlüsselung für die Verbindung zum externen SMTP-Server erzwingen
      RELAYHOST_TLS_LEVEL: encrypt

      # ANPASSEN: Vertrauenswürdige interne Netzwerke, die den Relay verwenden dürfen
      # Beispiel: 192.168.178.0/24 (lokales Fritz!Box-Netz)
      # Mehrere Netzwerke durch Leerzeichen trennen
      MYNETWORKS: "192.168.178.0/24"

      # ANPASSEN: Domains, die als Absenderdomains zugelassen werden sollen
      # Die Domains müssen gegebenenfalls auch beim externen Mail-Anbieter als zulässige Absender eingerichtet sein
      ALLOWED_SENDER_DOMAINS: "example.org homelab.example.net"

    volumes:
      # Zertifikate des SMTP-Relays in den Container einbinden
      # ANPASSEN: Linker Pfad zum Verzeichnis mit deinen Zertifikaten
      # Rechter Pfad: Zertifikatsverzeichnis im Container
      # :ro = nur lesender Zugriff
      - ./ssl-certs:/etc/postfix/certs:ro

      # Benutzerdefiniertes Init-Skript für die TLS-Konfiguration
      # ANPASSEN: Linker Pfad zum Skript auf dem Docker-Host
      # Das Skript muss zum verwendeten Image und dessen Init-Mechanismus passen
      - ./postfix-init-scripts/tls.sh:/docker-init.d/tls.sh:ro

An dieser Stelle möchte ich noch kurz auf Best Practices für den Umgang mit Passwörtern in Docker-Compose-Dateien eingehen. Passwörter sollten nämlich nicht direkt in der docker-compose.yml hinterlegt werden.

Stattdessen empfiehlt es sich, diese in einer separaten .env-Datei abzulegen und über Umgebungsvariablen in die Compose-Konfiguration einzubinden. Dadurch stehen Passwörter nicht direkt in der Compose-Datei, was insbesondere bei der Git-Versionsverwaltung von Vorteil ist.

Lege dazu im selben Verzeichnis eine Datei namens .env an:

RELAYHOST_USERNAME=user@anbieter.org
RELAYHOST_PASSWORD=<Passwort>

Passe anschließend die Umgebungsvariablen in deiner Compose-Datei an:

environment:
  RELAYHOST_USERNAME: ${RELAYHOST_USERNAME}
  RELAYHOST_PASSWORD: ${RELAYHOST_PASSWORD}

Schütze die Datei vor dem Zugriff durch andere Benutzer:

chmod 600 .env

⚠️ Wichtig: Eine .env-Datei ist kein sicherer Passwortspeicher. Sie erleichtert es, Zugangsdaten aus der Compose-Datei herauszuhalten und über .gitignore von der Versionsverwaltung auszuschließen. Vor unbefugtem Zugriff muss die Datei trotzdem durch geeignete Dateiberechtigungen geschützt werden.

2. TLS einrichten:

Damit Clients verschlüsselt mit dem Relay kommunizieren können, lässt sich Postfix mit einem eigenen Zertifikat konfigurieren. Dazu wird ein Init-Skript verwendet, das die Zertifikatpfade im Postfix-Container hinterlegt. Es befindet sich im Bind-Mount postfix-init-scripts und trägt den Namen tls.sh:

postconf -e 'smtpd_tls_cert_file=/etc/postfix/certs/example.com.fullchain'
postconf -e 'smtpd_tls_key_file=/etc/postfix/certs/example.com.key'

Jetzt kannst du den Container endlich zum ersten Mal in Betrieb nehmen:

docker compose up -d 

💡 Tipp: Wildcard-Zertifikate für dein Homelab:

Mit acme.sh kannst du innerhalb weniger Minuten ein Wildcard-Zertifikat von Let’s Encrypt für deine eigene Domain erstellen. Die Validierung erfolgt über eine DNS-Challenge, die von zahlreichen DNS-Anbietern unterstützt wird. Du benötigst dafür lediglich einen API-Key deines DNS-Anbieters und musst die entsprechende Schnittstelle einmalig konfigurieren.

3. E-Mail-Versand testen:

Nach dem Start sollte zunächst geprüft werden, ob der Container läuft:

docker compose ps

Die Logs zeigen, ob Nachrichten angenommen und an den Smarthost-Anbieter weitergeleitet werden:

docker compose logs -f postfix

Ein erfolgreicher Versand ist beispielsweise an einer Meldung wie dieser erkennbar:

status=sent (250 2.0.0 Ok: queued as ...)

Fehler bei der Authentifizierung, TLS-Verbindungen oder Absenderadressen werden ebenfalls im Log sichtbar.

⚠️ Nr. 1 Fehlerquelle »Sender address rejected«:

Ein häufiger Fehler ist eine nicht autorisierte Absenderadresse. Die meisten SMTP-Relay-Anbieter akzeptieren nur Adressen, die für das jeweilige Konto freigegeben wurden. Als Fallback kannst du Postfix so konfigurieren, dass nicht autorisierte Absenderadressen beim Versand automatisch durch eine beim Mail-Anbieter zugelassene Adresse ersetzt werden.

Abschließende Gedanken:

Mithilfe dieses Postfix-Images lässt sich schnell ein zentraler SMTP-Relay für das Homelab einrichten. Deine Anwendungen können darüber E-Mails versenden, ohne selbst die Zugangsdaten des externen Mail-Anbieters speichern zu müssen.

Eine kleine Einschränkung gibt es bei der SMTP-Authentifizierung: Das Image bietet keine einfache Konfigurationsoption, um eine Passwortauthentifizierung für interne Clients einzurichten. Deshalb sollte der Zugriff auf vertrauenswürdige interne Netzwerke beschränkt bleiben.

💡 Tipp: Laufen alle Anwendungen auf demselben Docker-Host, kannst du Postfix und die betreffenden Container in dasselbe Docker-Netzwerk einbinden. Sie erreichen den Relay dann über postfix:587. Eine Portfreigabe auf dem Host ist nur nötig, wenn externe Clients zugreifen sollen.

Von Fabian Wüst

Er ist leidenschaftlicher Open-Source-Benutzer und ein begeisterter Technologie-Enthusiast. Als kreativer Kopf hinter Homelabtopia bringt Fabian hier seine umfangreiche Erfahrung als Linux-Admin ein. Um sicherzustellen, dass du aus seinen Beiträgen den größtmöglichen Nutzen ziehen kannst, führt er ausgiebige Tests durch und errichtet dafür immense Setups.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert