Zum Inhalt

Senden zu bestimmten Domains in der Mailcow beschränken

Diese Anleitung zeigt, wie Sie schnell und einfach das Senden zu bestimmten Domains in der Mailcow beschränken können.

Erstellen der Konfigurationsdateien

Achtung!

Ich gehe an dieser Stelle immer davon aus, dass das aktuelle Verzeichnis /opt/mailcow-dockerized ist. Alle Befehle müssen daher in diesem Verzeichnis ausgeführt werden! Wechsel in das Mailcow Verzeichnis mit:

cd /opt/mailcow-dockerized

Datei für erlaubte Domains

Im Postfix Konfigurationsverzeichnis muss folgende Datei erstellt werden:

nano data/conf/postfix/allowed_domains

Inhalt der Datei:

domain.de OK

Diese Datei besagt, dass die Accounts, die wir später restriktieren, nur an diese Domain(s) Mails versenden dürfen. Bedeutet also, dass hier alle Domains untereinander und mit einem "OK" dahinter stehen müssen, an die gesendet werden darf.

Datei für beschränkte Accounts

Im Postfix Konfigurationsverzeichnis muss folgende Datei erstellt werden:

nano data/conf/postfix/sender_access_restrictions

Inhalt der Datei:

benutzer@domain.de RESTRICT_TO_LOCAL

Diese Datei besagt, dass die Accounts, die wir hier angeben, nur an diese Domain(s) Mails versenden dürfen, die wir vorhin angegeben haben. Bedeutet also, dass hier alle User-Accounts untereinander und mit einem "RESTRICT_TO_LOCAL" dahinter stehen müssen.

Konvertieren der Konfigurationsdateien

Jetzt müssen die Dateien noch mit Postmap konvertiert werden. Dafür wechseln wir zuerst in den Postfix Container der Mailcow:

docker compose exec postfix-mailcow bash

Jetzt sollte vorne eine Art ID stehen. Wir können nun ins Postfix Konfigurationsverzeichnis wechseln und die Datei konvertieren:

1
2
3
cd /opt/postfix/conf
postmap allowed_domains
postmap sender_access_restrictions

Diese Befehle müssen ohne Fehler durchlaufen!

Den Postfix Container verlassen:

exit

Anpassen der extra.cf Datei

Jetzt müssen die beiden Dateien vom Postfix benutzt werden. Dafür legen wir in der extra.cf folgende Inhalt an:

# 1. Definiere die Restriction Class "RESTRICT_TO_LOCAL"
smtpd_restriction_classes = RESTRICT_TO_LOCAL

# 2. Definiere die Logik für diese Klasse
RESTRICT_TO_LOCAL =
    # Prüfe, ob die Empfänger-Domain in unserer Erlaubnis-Liste steht. Wenn ja -> OK
    check_recipient_access hash:/opt/postfix/conf/allowed_destinations,
    # Wenn die Domain NICHT in der Liste war, weise die E-Mail ab
    REJECT

# Füge unsere neue Prüfung als eine der ersten hinzu
smtpd_recipient_restrictions =
    check_sender_access hash:/opt/postfix/conf/sender_access_restrictions,
    check_recipient_mx_access proxy:mysql:/opt/postfix/conf/sql/mysql_mbr_access_maps.cf,
    permit_sasl_authenticated,
    permit_mynetworks,
    check_recipient_access proxy:mysql:/opt/postfix/conf/sql/mysql_tls_enforce_in_policy.cf,
    reject_invalid_helo_hostname,
    reject_unauth_destination

Große Fehlerquelle!

Unter dem Punkt smtpd_recipient_restrictions wird unser Punkt check_sender_access ... definiert. Darunter sind noch jede Menge andere Punkte, welche unbedingt dort stehen bleiben müssen. Sie kommen aus der von Mailcow mitgeliederten main.cf. Das Problem: Wir überschreiben mit der extra.cf die originale main.cf. Bedeutet: Wir müssen die originalen Werte unbedingt mit angeben, damit alles weiter funktioniert!

Wichtig: Die Werte können variieren! Unbedingt selbst die main.cf aufrufen und die Werte aus dem smptd_recipient_restrictions Abschnitt kopieren, sodass es ungefährt so aussieht, wie oben!

Übernehmen der Änderungen + Log Überprüfung

Jetzt kann der Postfix neu gestartet werden, um die Änderungen zu übernehmen:

docker compose restart postfix-mailcow

Die Logs sollten anzeigen, dass der Postfix die originalen Werte überschreibt:

docker compose logs postfix-mailcow --since 5m

Im Log sollte sowas erscheinen wie:

/usr/sbin/postconf: warning: /opt/postfix/conf/main.cf, line 218: overriding earlier entry:

Jetzt kann mal eine Test E-Mail versendet werden, um die Modifikationen zu testen.

Tipp

Am Besten mit lokalen Accounts testen, damit man nicht ewig viele Mails an externe Absender schickt.

Möchte man die Logs nebenbei laufen lassen, einfach folgenden Befehl nutzen:

docker compose logs postfix-mailcow --since 5m -f

Die Logs mit STRG+C wieder verlassen.