9.0 KiB
README-SRS.md
Selektives SRS auf mx.warenform.de – Überblick
Stand: 17.10.2026
Diese Datei beschreibt bewusst nur, was eingerichtet wurde, warum es nötig ist und was im Betrieb zu beachten ist.
Für die technische Detaildokumentation siehe:
README-install-SRS.md
0. Das Grundproblem: Warum Weiterleitungen heute problematisch sein können
Mailserver wie Gmail, Microsoft, GMX oder Yahoo prüfen eingehende Nachrichten unter anderem mit SPF, DKIM und DMARC.
Bei einer klassischen Weiterleitung entsteht dabei ein grundsätzliches Problem:
ckubu@gmx.de
|
v
test@warenform.de
|
v
ckubu@gmail.com
Die ursprüngliche Nachricht kommt korrekt von einem GMX-Mailserver und besteht dort normalerweise den SPF-Test. Bei der Weiterleitung sendet anschließend aber mx.warenform.de die Nachricht weiter, während der Envelope-Absender ohne SRS weiterhin ckubu@gmx.de lautet.
Der Zielserver sieht damit vereinfacht:
Absender-Domain: gmx.de
sendender Server: mx.warenform.de
und prüft:
Darf
mx.warenform.deE-Mails fürgmx.deversenden?
Das ist natürlich nicht der Fall. Die weitergeleitete Nachricht kann deshalb trotz legitimer Herkunft einen SPF-Fehler erhalten.
Wenn zusätzlich die ursprüngliche DKIM-Signatur durch Änderungen an Headern oder Nachrichteninhalt ungültig wird, kann schließlich auch DMARC fehlschlagen. Bei strengen DMARC-Policies können Provider eine solche Nachricht ablehnen oder als Spam behandeln.
SRS löst das SPF-Problem, indem nur der SMTP-Envelope-Absender der weitergeleiteten Nachricht umgeschrieben wird:
ckubu@gmx.de
wird beispielsweise zu:
SRS0=...=gmx.de=ckubu@srs.warenform.de
Der sichtbare Header bleibt dagegen:
From: ckubu@gmx.de
Dadurch kann der Zielserver feststellen:
SPF -> PASS für srs.warenform.de
DKIM -> PASS für die ursprüngliche Absenderdomain gmx.de
DMARC -> PASS über die weiterhin gültige DKIM-Signatur
Genau dieses Verhalten wurde bei der hier dokumentierten Installation im End-to-End-Test bestätigt.
Wichtig ist dabei: SRS soll nicht pauschal auf alle ausgehenden Nachrichten angewendet werden, sondern nur auf echte externe Alias-Weiterleitungen. Daraus ergibt sich die selektive Architektur dieser Installation.
1. Ausgangssituation
mx.warenform.de ist ein produktiver Mailserver mit Postfix, AmaViS, SpamAssassin, ClamAV, OpenDKIM/OpenDMARC und Dovecot.
Der Server verwaltet auch Mail-Aliase, die teilweise an externe Empfänger weiterleiten.
Beispiel:
ckubu@gmx.de
|
v
test@warenform.de
|
+--> lokale Empfänger
|
+--> ckubu@oopen.de
Das Problem:
Bei einer klassischen Weiterleitung bleibt der ursprüngliche Envelope-Sender erhalten.
Dann würde mx.warenform.de eine Nachricht mit:
MAIL FROM:<ckubu@gmx.de>
an einen fremden Server weiterleiten.
Der fremde Server prüft SPF und sieht dabei:
Absenderdomain: gmx.de
sendender Server: mx.warenform.de
Da mx.warenform.de nicht zum SPF von GMX gehört, kann die legitime weitergeleitete Mail einen SPF-Fehler bekommen.
2. Lösung
Für echte externe Alias-Weiterleitungen wird der Envelope-Sender per SRS umgeschrieben.
Aus:
ckubu@gmx.de
wird beispielsweise:
SRS0=...=gmx.de=ckubu@srs.warenform.de
Dadurch prüft der Zielserver SPF gegen:
srs.warenform.de
und damit gegen eine Domain, für die mx.warenform.de tatsächlich senden darf.
3. Warum nicht einfach alle Nachrichten mit SRS umschreiben?
Weil SRS nur für Weiterleitungen benötigt wird.
Nicht umgeschrieben werden sollen:
- normale ausgehende Mails,
- lokale Mailbox-Zustellungen,
- lokale Aliase,
root -> argus@oopen.de,- Dovecot/Sieve-Benachrichtigungen,
- Bounces mit leerem Envelope-Sender.
Deshalb wurde eine selektive SRS-Lösung gebaut.
Sie entscheidet für jeden Empfänger einzeln:
SRS
oder
NO_SRS
4. Warum die Lösung relativ aufwendig ist
Mehrere technische Probleme mussten gleichzeitig gelöst werden.
Alias-Information darf nicht verloren gehen
Nach der Viren-/Spamprüfung über AmaViS muss noch erkennbar sein:
ursprünglicher Empfänger: test@warenform.de
endgültiges Ziel: ckubu@oopen.de
Sonst könnte die SRS-Logik nicht erkennen, dass überhaupt eine Weiterleitung stattgefunden hat.
Deshalb wurde die Reihenfolge der Postfix-Adressumschreibung bewusst angepasst.
Ein Alias kann lokale und externe Ziele enthalten
Zum Beispiel:
test@warenform.de
-> lokale Mailbox
-> lokale Mailbox
-> externe Adresse
Nur das externe Ziel braucht SRS.
Darum wird die Entscheidung pro Empfänger getroffen.
Bounces müssen zurückkommen können
Ein fremder Mailserver sieht als Envelope-Sender eine SRS-Adresse.
Wenn er einen Bounce erzeugt, muss diese Adresse wieder auf den ursprünglichen Absender zurückgeführt werden.
Deshalb gibt es zusätzlich einen Reverse-SRS-Pfad.
DKIM soll erhalten bleiben
SRS verändert nur den Envelope-Sender.
Der sichtbare:
From:
Header und die ursprüngliche DKIM-Signatur bleiben erhalten.
Das ist wichtig, damit DKIM und DMARC weiterhin funktionieren.
5. Produktive Komponenten
PostSRSd:
/usr/local/postsrsd -> /usr/local/postsrsd-2.4.1
Skripte:
/usr/local/sbin/srs-forward.py
/usr/local/sbin/srs-alias-decision.py
/usr/local/sbin/srs-reverse-map.py
/usr/local/sbin/srs-reverse-policy.py
Dienste:
postsrsd-srs.service
srs-reverse-map.service
postfix@srs-delivery.service
postfix.service
SRS-Delivery-Konfiguration:
/etc/postfix-srs/delivery
PostSRSd-Konfiguration:
/etc/postsrsd-srs
6. Ports
25 normaler SMTP-Eingang
10003 PostSRSd
10004 Reverse-SRS-Map
10028 SRS-Reinjection
10029 Reverse-SRS-Reinjection
Die SRS-internen Ports sind nur lokal erreichbar.
7. Postfix-Hauptkonfiguration
In /etc/postfix/main.cf gibt es einen automatisch verwalteten Bereich:
# BEGIN OOPEN-SRS-MANAGED
...
# END OOPEN-SRS-MANAGED
Dieser Block und insbesondere seine Marker sollen nicht manuell verändert werden.
Aktive SRS-Einstellungen:
default_transport = srs-forward
srs-forward_destination_recipient_limit = 1
recipient_canonical_maps = socketmap:inet:127.0.0.1:10004:reverse
Die separate SRS-Delivery-Postfix-Instanz wird nicht mit postmulti verwaltet.
Sie läuft direkt als:
postfix@srs-delivery.service
8. Verifizierter Normalfall
Test:
ckubu@gmx.de
->
test@warenform.de
->
ckubu@oopen.de
Am Ziel kam tatsächlich an:
Return-Path:
<SRS0=...=gmx.de=ckubu@srs.warenform.de>
Der Zielserver meldete:
SPF_PASS
DKIM_VALID
DMARC_PASS
Die originale GMX-DKIM-Signatur blieb also gültig.
9. Verifizierter lokaler Sonderfall
Lokaler Alias:
root -> argus@oopen.de
Ergebnis:
NO_SRS
Der Envelope-Sender bleibt:
root@mx.warenform.de
Das ist ausdrücklich so gewünscht.
10. Reboot-Test
Nach einem vollständigen Reboot waren automatisch aktiv:
postsrsd-srs.service
srs-reverse-map.service
postfix@srs-delivery.service
postfix.service
und die erwarteten Listener:
25
10003
10004
10028
10029
Forward- und Reverse-SRS funktionierten ebenfalls nach dem Reboot.
11. Was bei Änderungen besonders zu beachten ist
Folgende Punkte sind nicht zufällig, sondern Teil des Designs:
- SRS nur für echte externe Weiterleitungen.
- Entscheidung pro Empfänger.
- ursprünglicher Alias-Empfänger muss erhalten bleiben.
- Reverse-SRS muss erreichbar sein.
- keine globale Umschreibung aller Absender.
- kein
postmulti. - interne SRS-Ports nur auf Loopback.
- originale DKIM-Signatur möglichst unverändert lassen.
- Null-Sender niemals mit SRS umschreiben.
rootund andere lokale Aliase korrekt erkennen.btree:-Maps mitpostmap btree:/...erzeugen.
12. Betriebskontrolle
Dienste:
systemctl is-active \
postsrsd-srs.service \
srs-reverse-map.service \
postfix@srs-delivery.service \
postfix.service
Ports:
ss -ltnp | grep -E ':(25|10003|10004|10028|10029)\b'
Postfix:
postfix check
Forward-Test:
postmap -q \
'ckubu@gmx.de' \
'socketmap:inet:127.0.0.1:10003:forward'
Journal nach einem Testmail:
journalctl --since "5 minutes ago" --no-pager | \
grep -E 'test@warenform\.de|ckubu@oopen\.de|SRS0=|srs-forward|postfix-srs-delivery'
13. Spätere Automatisierung
Als nächster Schritt sollen Installations-, Update-, Enable- und Disable-Skripte erstellt werden.
Wichtig dabei:
- bestehende Postfix-Konfiguration nicht pauschal überschreiben,
- vorherige Werte gezielt sichern,
- den
OOPEN-SRS-MANAGED-Block als maschinenlesbare Schnittstelle verwenden, - SRS reproduzierbar aktivieren und deaktivieren,
- keine kompletten alten
main.cf-/master.cf-Backups zurückspielen, - PostSRSd versionsweise unter
/usr/local/postsrsd-<version>verwalten.