Benutzer-Werkzeuge

Webseiten-Werkzeuge


systeme:omnimail:golden-master

OmniMail™ · Die Mailstraße

Stand: 2026-11-04. Status: Golden Master, vom Projektverantwortlichen abgenommen. Geltung: OmniMail für omnisrv.de auf OMNISRV. Die ergänzende technische Systemübersicht bleibt separat.

OmniMail – Die Mailstraße für omnisrv.de

Vorwort

Im Rahmen des Designs hat der Autor den verschiedenen Bereichen oder Routinen im OmniMail™ umgangssprachliche Namen gegeben, damit man sich ein besseres Bild von den Kommunikationswegen machen kann. In einigen Schaugrafiken sind diese Namen als Codename angegeben. So haben wir z.B. den Mail-Eingangsserver Alois genannt und die interne Vermittlungsstelle Hildegard. Die weiteren Mitspieler sind am Ende dieses Artikels gelistet.


Teil 1 · Die Postreise einfach erklärt

Was ist OmniMail™?

OmniMail ist die Mailstraße für omnisrv.de.
Vorne nimmt ein Postfix-Dienst E-Mails aus dem Internet entgegen. Er fragt nach, ob der Empfänger existiert, und lässt die Nachricht prüfen.

Ein zweiter Postfix-Dienst transportiert angenommene Mail zum Stalwart-Postfach.

Für ausgehende Mail läuft der Weg kontrolliert in die andere Richtung.

Somit ist der interne Stalwart-Mailserver vom Internet entkoppelt.

--- config: theme: base themeVariables: background: "#ffffff" primaryColor: "#f3f3f3" primaryTextColor: "#414141" primaryBorderColor: "#d8d8d8" lineColor: "#969696" edgeLabelBackground: "transparent" fontFamily: "Roboto,Ubuntu,Aptos,Arial,sans-serif" fontSize: "16px" flowchart: nodeSpacing: 36 rankSpacing: 48 padding: 18 themeCSS: | .node rect { fill: #f3f3f3 !important; stroke: #d8d8d8 !important; stroke-width: 1.1px !important; rx: 24px; ry: 24px; } .node.decision rect { fill: #fafafa !important; stroke-dasharray: 4 4; } .flowchart-link { stroke: #969696 !important; stroke-width: 1.2px !important; } .cluster rect { fill: #fcfcfc !important; stroke: #dedede !important; rx: 20px; ry: 20px; } .nodeLabel p { padding: 10px 0 !important; } .edgeLabel { font-size: 10px !important; } .edgeLabel .labelBkg { background: transparent !important; padding: 0 !important; border: 0 !important; } .edgeLabel .pill { background: #eaf4fb; border-radius: 8px; box-shadow: inset 0 0 0 1px #b8ccdc; display: inline-block; padding: 1px 4px; } .edgeLabel .spacer { visibility: hidden; } .edgeLabel .edge-row { display: inline-flex; align-items: center; } --- flowchart LR A["Externe E-Mail"] --> B["SMTP-Eingang"] B --> C["Empfängerprüfung"] C --> D["Spam- und Virenschutz"] D --> E["Interner Transport"] E --> F["Stalwart Mailbox"] classDef decision stroke:#d8d8d8,stroke-dasharray:4 4 class C decision

Wie liest man das Bild?

Das Schema zeigt Arbeitsschritte, keine zusätzliche Netzwerkfreigabe. Eine E-Mail für einen unbekannten Empfänger wird schon im SMTP-Gespräch abgewiesen. Spam- und Virenprüfungen können ebenfalls zur Ablehnung führen. Erst eine angenommene Nachricht gelangt in die Postfix-Queue und danach zur Mailbox.


Teil 2 · Die beteiligten Dienste

SMTP-Eingang und Empfängerprüfung

Postfix (Codename: Alois) im Container ext-qipu ist das öffentliche SMTP-Tor. Vor der Annahme fragt es den Prüfdienst von Postfix (Codename: Hildegard) im Container int-mailgateway. Dieser prüft die Empfängerexistenz bei Stalwart. Die Entscheidung kommt zum ersten SMTP-Dialog zurück.

--- config: theme: base themeVariables: background: "#ffffff" primaryColor: "#f3f3f3" primaryTextColor: "#414141" primaryBorderColor: "#d8d8d8" lineColor: "#969696" edgeLabelBackground: "transparent" fontFamily: "Roboto,Ubuntu,Aptos,Arial,sans-serif" fontSize: "16px" flowchart: nodeSpacing: 36 rankSpacing: 48 padding: 18 themeCSS: | .node rect { fill: #f3f3f3 !important; stroke: #d8d8d8 !important; stroke-width: 1.1px !important; rx: 24px; ry: 24px; } .node.decision rect { fill: #fafafa !important; stroke-dasharray: 4 4; } .flowchart-link { stroke: #969696 !important; stroke-width: 1.2px !important; } .nodeLabel p { padding: 10px 0 !important; } .edgeLabel { font-size: 10px !important; } .edgeLabel .labelBkg { background: transparent !important; padding: 0 !important; border: 0 !important; } .edgeLabel .pill { background: #eaf4fb; border-radius: 8px; box-shadow: inset 0 0 0 1px #b8ccdc; } .edgeLabel .spacer { visibility: hidden; } .edgeLabel .edge-row { display: inline-flex; align-items: center; } .edgeLabel .pill { display: inline-block; padding: 1px 4px; } --- flowchart LR A["Absender"] -->|"             TCP 25             "| Q["ext-qipu
Codename:
Alois"] Q -->|"             Policy 10031             "| H["int-mailgateway
Codename:
Hildegard"] H -->|"             SMTP RCPT
TCP 25 
            
"| S["cdf-stalwart
Stalwart Mailserver"] S -->|"             RCPT
Ergebnis 
            
"| H H -->|"             SMTP
Entscheidung 
            
"| Q classDef decision stroke:#d8d8d8,stroke-dasharray:4 4 class H decision

Was bedeuten die Begriffe?

  • TCP 25: SMTP-Anschlussnummer; kein Fehlercode.
  • Policy 10031: interner Prüfanschluss von Alois zu Hildegard.
  • RCPT: Empfängerangabe im SMTP-Gespräch.
  • Rückpfeile: Antworten zur Annahmeentscheidung, keine direkte Mailzustellung.

Warum dieser Umweg?

  1. Stalwart kennt die lokalen Konten.
  2. Alois benötigt nur die Antwort, ob die Adresse zulässig ist.
  3. Der direkte Mailweg von Alois zu Stalwart bleibt gesperrt.

Spam- und Virenschutz

Rspamd (Codename: Illapa) bewertet die eingehende Nachricht als Milter. Für die Malwareprüfung fragt Rspamd ClamAV (historischer Name: Ix Chel, im Betrieb auch „Ixcel“) ab. Redis (Codename: Itzamná) dient Rspamd als Datenspeicher. Eine Ablehnung erfolgt nach den wirksamen Regeln vor der dauerhaften Queue-Annahme.

--- config: theme: base themeVariables: background: "#ffffff" primaryColor: "#f3f3f3" primaryTextColor: "#414141" primaryBorderColor: "#d8d8d8" lineColor: "#969696" edgeLabelBackground: "transparent" fontFamily: "Roboto,Ubuntu,Aptos,Arial,sans-serif" fontSize: "16px" flowchart: nodeSpacing: 36 rankSpacing: 48 padding: 18 themeCSS: | .node rect { fill: #f3f3f3 !important; stroke: #d8d8d8 !important; stroke-width: 1.1px !important; rx: 24px; ry: 24px; } .node.decision rect { fill: #fafafa !important; stroke-dasharray: 4 4; } .flowchart-link { stroke: #969696 !important; stroke-width: 1.2px !important; } .cluster rect { fill: #fcfcfc !important; stroke: #dedede !important; rx: 20px; ry: 20px; } .nodeLabel p { padding: 10px 0 !important; } .edgeLabel { font-size: 10px !important; } .edgeLabel .labelBkg { background: transparent !important; padding: 0 !important; border: 0 !important; } .edgeLabel .pill { background: #eaf4fb; border-radius: 8px; box-shadow: inset 0 0 0 1px #b8ccdc; display: inline-block; padding: 1px 4px; } .edgeLabel .spacer { visibility: hidden; } .edgeLabel .edge-row { display: inline-flex; align-items: center; } --- flowchart LR Q["ext-qipu: Postfix"] <-->|"             Milter 11332
Prüfergebnis 
            
"| R["int-spamcheck: Rspamd"] R -->|"             ClamAV 3310             "| V["int-viruscheck: ClamAV"] R -->|"             Cache             "| C["int-mailmemcache: Redis"] classDef decision stroke:#d8d8d8,stroke-dasharray:4 4 class R decision

Zustellung und Ausgangspost

Für omnisrv.de führt die aktive Postfix-Transporttabelle von Alois über Hildegard zu Stalwart. Stalwart verwaltet die Postfächer. Authentifizierte, autorisierte Ausgangspost geht von Stalwart über Hildegard und Alois zum externen MX. Postfix ist dabei kein offenes Relay.

Eingangspost

--- config: theme: base themeVariables: background: "#ffffff" primaryColor: "#f3f3f3" primaryTextColor: "#414141" primaryBorderColor: "#d8d8d8" lineColor: "#969696" edgeLabelBackground: "transparent" fontFamily: "Roboto,Ubuntu,Aptos,Arial,sans-serif" fontSize: "16px" flowchart: nodeSpacing: 36 rankSpacing: 48 padding: 18 themeCSS: | .node rect { fill: #f3f3f3 !important; stroke: #d8d8d8 !important; stroke-width: 1.1px !important; rx: 24px; ry: 24px; } .node.decision rect { fill: #fafafa !important; stroke-dasharray: 4 4; } .flowchart-link { stroke: #969696 !important; stroke-width: 1.2px !important; } .cluster rect { fill: #fcfcfc !important; stroke: #dedede !important; rx: 20px; ry: 20px; } .nodeLabel p { padding: 10px 0 !important; } .edgeLabel { font-size: 10px !important; } .edgeLabel .labelBkg { background: transparent !important; padding: 0 !important; border: 0 !important; } .edgeLabel .pill { background: #eaf4fb; border-radius: 8px; box-shadow: inset 0 0 0 1px #b8ccdc; display: inline-block; padding: 1px 4px; } .edgeLabel .spacer { visibility: hidden; } .edgeLabel .edge-row { display: inline-flex; align-items: center; } --- flowchart LR E1["Alois
ext-qipu"] -->|"             TCP 25             "| E2["Hildegard
int-mailgateway"] E2 -->|"             lokale Zustellung             "| E3["Stalwart
cdf-stalwart"]

Ausgangspost

--- config: theme: base themeVariables: background: "#ffffff" primaryColor: "#f3f3f3" primaryTextColor: "#414141" primaryBorderColor: "#d8d8d8" lineColor: "#969696" edgeLabelBackground: "transparent" fontFamily: "Roboto,Ubuntu,Aptos,Arial,sans-serif" fontSize: "16px" flowchart: nodeSpacing: 36 rankSpacing: 48 padding: 18 themeCSS: | .node rect { fill: #f3f3f3 !important; stroke: #d8d8d8 !important; stroke-width: 1.1px !important; rx: 24px; ry: 24px; } .node.decision rect { fill: #fafafa !important; stroke-dasharray: 4 4; } .flowchart-link { stroke: #969696 !important; stroke-width: 1.2px !important; } .cluster rect { fill: #fcfcfc !important; stroke: #dedede !important; rx: 20px; ry: 20px; } .nodeLabel p { padding: 10px 0 !important; } .edgeLabel { font-size: 10px !important; } .edgeLabel .labelBkg { background: transparent !important; padding: 0 !important; border: 0 !important; } .edgeLabel .pill { background: #eaf4fb; border-radius: 8px; box-shadow: inset 0 0 0 1px #b8ccdc; display: inline-block; padding: 1px 4px; } .edgeLabel .spacer { visibility: hidden; } .edgeLabel .edge-row { display: inline-flex; align-items: center; } --- flowchart LR A1["Stalwart
cdf-stalwart"] -->|"             autorisierter Ausgang             "| A2["Hildegard
int-mailgateway"] A2 -->|"             Relay             "| A3["Alois
ext-qipu"] A3 -->|"             SMTP TCP 25             "| A4["externer MX"]

Zwei getrennte DNS-Wege

Alois verwendet für DNS-Abfragen den externen BIND-Dienst; Hildegard nutzt den internen BIND-Dienst. So fragt jeder Postdienst nur die für ihn vorgesehene Namenssicht ab.


Teil 3 · Der Zertifikats-Kurier

Warum braucht OmniMail einen Kurier?

Caddy beschafft und verwaltet die TLS-Zertifikate. Die Maildienste sollen dafür weder Caddys gesamtes Zertifikatslager sehen noch untereinander Schlüssel austauschen. Ein lokaler Selektor legt nur die Pakete für ausdrücklich zugelassene Namen in ein geschütztes Eingangsfach. Von dort verteilt der Zertifikats-Kurier die geprüften Pakete an getrennte Zielfächer. Der Kurier selbst hat keine Netzwerkverbindung.

--- config: theme: base themeVariables: background: "#ffffff" primaryColor: "#f3f3f3" primaryTextColor: "#414141" primaryBorderColor: "#d8d8d8" lineColor: "#969696" edgeLabelBackground: "transparent" fontFamily: "Roboto,Ubuntu,Aptos,Arial,sans-serif" fontSize: "16px" flowchart: nodeSpacing: 36 rankSpacing: 48 padding: 18 themeCSS: | .node rect { fill: #f3f3f3 !important; stroke: #d8d8d8 !important; stroke-width: 1.1px !important; rx: 24px; ry: 24px; } .node.decision rect { fill: #fafafa !important; stroke-dasharray: 4 4; } .flowchart-link { stroke: #969696 !important; stroke-width: 1.2px !important; } .cluster rect { fill: #fcfcfc !important; stroke: #dedede !important; rx: 20px; ry: 20px; } .nodeLabel p { padding: 10px 0 !important; } .edgeLabel { font-size: 10px !important; } .edgeLabel .labelBkg { background: transparent !important; padding: 0 !important; border: 0 !important; } .edgeLabel .pill { background: #eaf4fb; border-radius: 8px; box-shadow: inset 0 0 0 1px #b8ccdc; display: inline-block; padding: 1px 4px; } .edgeLabel .spacer { visibility: hidden; } .edgeLabel .edge-row { display: inline-flex; align-items: center; } --- flowchart LR C["Caddy
ACME-Zertifikate"] --> X["exakter
Selektor"] X --> I["geschütztes
Eingangsfach"] I --> K["Zertifikats-Kurier
ohne Netz"] K --> Z["versionierte
Zielfächer"] Z --> W["lokaler Wächter
und TLS-Reload"]

Was prüft und verteilt er?

  1. Eingang: Der Kurier liest das geschützte Eingangsfach, aber nicht Caddys vollständigen ACME-Speicher.
  2. Prüfung: Er kontrolliert, ob Zertifikat und privater Schlüssel zusammenpassen, die Zertifikatskette gültig ist, der Name im SAN steht, noch genügend Gültigkeit bleibt und das Ziel in seiner festen Liste freigeschaltet ist.
  3. Übergabe: Erst danach veröffentlicht er ein vollständiges, versioniertes Paket. Der Wechsel auf die neue Version erfolgt atomar; die bisherige funktionsfähige Version bleibt für eine Rücknahme erhalten.
  4. Aktivierung: Jeder Dienst sieht nur sein eigenes Zielfach schreibgeschützt. Ein lokaler Wächter bemerkt den Wechsel, lädt das Zertifikat beim Dienst nach und vergleicht anschließend den TLS-Fingerabdruck.

Wer bekommt ein Zertifikat?

Ziel Wofür? Wie wird es aktiv?
Stalwart IMAPS, Submission und die interne HTTPS-Verwaltung Stalwarts lokaler TLS-Reload
Alois STARTTLS am SMTP-Eingang lokaler Postfix-Reload
Privater Konfigurationsdienst HTTPS für AutoConfig und AutoDiscover kontrollierter Reload des internen Webdienstes

Wenn etwas schiefgeht

Ein unvollständiges oder unpassendes Paket wird nicht veröffentlicht. Schlägt das Nachladen fehl, versucht der jeweilige Wächter die vorherige gültige Version wiederherzustellen. Der vorhandene Fünf-Minuten-Zyklus prüft neue Pakete und überspringt unveränderte Versionen. Private Schlüssel gehören ausschließlich in die geschützten Fächer, nicht in diese Seite, ins Git-Repository oder in Protokolle.


Teil 4 · Monitoring und Backup

Wenn die Mailstraße Hilfe braucht

Ein Host-Monitor prüft die beteiligten Dienste und meldet relevante Zustandswechsel per Info-Mail an das hinterlegte Administrator-Konto. Der Alarmdienst versendet seine Nachricht über Stalwart.

Sicherung und Wiederherstellung

Die Mail- und Konfigurationsdateien werden über das in einem separaten Artikel beschriebene OmniBackup™ in regelmäßigem Rhythmus archiviert. Die Sicherung erfolgt derzeit stündlich in mehrere verschlüsselte Borg-Repositories.


Teil 5 · Technische Referenz

Live-Container, Netze und Adressen

Technischer Dienst Container / Hostdienst Netz und IPv4 Protokoll / Port
Postfix-Eingang und Internet-Relay ext-qipu ext-net 10.0.0.10; inbound-mail-checks 10.0.70.10; int-mailforward 10.0.71.10 SMTP 25; Policy 10.0.71.20:10031; Milter 10.0.70.20:11332
Postfix-Transport und Empfänger-Policy int-mailgateway int-mailforward 10.0.71.20; int-net 10.0.50.10 SMTP 25; Policy 10031; Stalwart-RCPT 10.0.40.10:25
Rspamd int-spamcheck inbound-mail-checks 10.0.70.20 Milter 11332
ClamAV int-viruscheck inbound-mail-checks 10.0.70.21 ClamAV 3310
Redis int-mailmemcache inbound-mail-checks 10.0.70.22 Nur freigegebener Rspamd-Datenpfad
Stalwart cdf-stalwart cdf-mail-net 10.0.40.10 SMTP 25; IMAPS 993; TLS-Submission 465; internes HTTPS 443; interner Listener 8080
BIND intern int-bind-internal int-net 10.0.50.2 DNS 53
BIND extern ext-bind-public ext-net 10.0.0.2 DNS 53
Caddy intern int-caddy cdf-web-net 10.0.30.10 HTTPS-Routing gemäß Caddy-Labels
Private Autokonfiguration omnimail-m01-private-autoconfig int-net 10.0.50.20 internes HTTPS für Clientkonfiguration

Diese Adressen stammen aus Docker-Inspect vom 03.11.2026. Die fünf Stalwart-Listener wurden zusätzlich im Container als TCP-Listener geprüft; ein Listener allein ist keine öffentliche Freigabe. Das HTTP-/API-Interface auf 8080 ist kein öffentlicher Admin-Zugang. HOME0 und autorisierte WireGuard-Clients erreichen die ausdrücklich freigegebenen Stalwart-Dienste; die Administration auf 443 bleibt intern.

Konfiguration und Schutzgrenzen

Mailverarbeitung und Postfächer
Postfix-Build und Compose: /opt/omnisrv/omnimail-m01-deploy-001/; aktive Hauptdateien alois-main-m01d008a.cf, hildegard-main-m01d002.cf und Transport-/Empfänger-Maps. Die laufenden Container-Mounts sind für den IST-Stand maßgeblich.

Rspamd: aktive local.d-/override.d-Bindungen aus demselben Deploy-Verzeichnis; DKIM- und Redis-Geheimnisse liegen getrennt unter /opt/omnisrv/secrets.

Stalwart: /mnt/docker-container/cdf-stalwart/config/config.json und persistente Daten; Zertifikate aus geschütztem Kurierziel. Die dynamische Konfiguration wird nicht als Klartext in Git abgebildet.

DNS und Betriebssteuerung
DNS: getrennte int-bind- und ext-bind-Konfigurationen unter /mnt/docker-container/; TSIG und dynamische Journale nicht im Quellrepo.

Start, Netzgrenzen und Überwachung: installierte omnimail-*.service und omnimail-*.timer unter /etc/systemd/system, Skripte im genannten Deploy-Verzeichnis.

Sicherheitsgrenzen
Verbotene direkte Mailwege laut M01-Netzvertrag: Alois → Stalwart, Rspamd → Stalwart und Stalwart → Alois. Hildegard darf DNS nicht über ext-bind beziehen; fremde Clients erhalten keinen offenen Relayzugang.

Betrieb und Wiederherstellung

Bei Zustellproblemen zuerst Monitorstatus, Postfix-Queues, Stalwart-Health und DNS-Antworten aus den jeweils berechtigten Netzen prüfen. Zertifikatswechsel über den vorhandenen Kurier/Watcher und dessen Fingerprint-Readback bewerten. Die isolierte Borg-Recovery aus M01-DEPLOY-015C-B ist ein Teilnachweis, keine vollständige Ersatzhost-Abnahme. Diese Dokumentation beschreibt den geprüften Aufbau; sie ändert keine laufenden Maildienste, DNS-, Firewall- oder Backup-Einstellungen.


Pantheon-Legende™

Die erste Grundordnung ist ein historischer Scaffold-Stand. Sie bestimmt Namen und Rollen, beweist aber für sich keine heutige Containerbelegung. Live-Zuordnungen sind unten ausdrücklich gekennzeichnet.

Codename Herkunft Technische Funktion / Stand Tatsächliches Ziel
Alois Ein Urgestein als Postbote … Aktiver äußerer Postfix-Eingang und Internet-Relay ext-qipu, 10.0.0.10
Hildegard Eine nette Mitarbeiterin aus der Postverteilstelle … Aktiver interner Postfix-Transport und Empfänger-Policy int-mailgateway, 10.0.71.20 / 10.0.50.10
Kukulkan Aus dem Maya-Pantheon
Die gefiederte Schlange, verehrt als Gottheit des Wissens.
Historische Rollenbezeichnung für Postfix-Transport/Queues; heute auf Alois und Hildegard verteilt Kein eigener Container; siehe ext-qipu und int-mailgateway
Illapa Aus dem Inka-Pantheon
Gott des Blitzes und Donners.
Aktive Rspamd-Spamprüfung int-spamcheck, 10.0.70.20
Ix Chel / Ixcel Aus dem Maya-Pantheon
Göttin der Schwangerschaft und Heilkunst; „Ixcel“ ist der Betriebsname.
Aktive ClamAV-Malwareprüfung int-viruscheck, 10.0.70.21
Itzamná Aus dem Maya-Pantheon
Schöpfergott, dem auch die Schrift zugeschrieben wurde.
Aktiver Redis-Datenspeicher für Rspamd int-mailmemcache, 10.0.70.22
Hermes Aus dem griechischen Pantheon
Götterbote und Schutzherr der Reisenden.
Symbolischer Bote der Ausgangspost; keine zusätzliche Containerpflicht Kein eigener Container; Transport durch Stalwart, Hildegard und Alois
Inti Aus dem Inka-Pantheon
Als Sonnengott verehrt.
Symbolische oberste Prüfungsinstanz im historischen Scaffold Kein eigener Container oder IP-Ziel
QIPU Aus der Inka-Kultur
Knotenschnüre für Aufzeichnungen und Nachrichten; keine Gottheit.
Bezeichnung der Mailgateway-Welt, nicht zusätzlicher Dienst Unter anderem ext-qipu; kein separates QIPU-Backend
Stalli-Maus Projektinterner Stalwart-Spitzname aus M01-Arbeitsaufträgen Stalwart-Postfach- und Verwaltungsdienst cdf-stalwart, 10.0.40.10
Brunhilde, Kunigunde, Jolanthe Projektinterne Namen synthetischer Testpostfächer Konten, keine technischen Transportdienste Stalwart; keine eigenen Container-IPs
Julius Projektinterner Name des externen Testabsenders Testrolle, kein lokales Mailkonto Kein OmniMail-Container

Zeus und weitere Figuren bleiben nach der Grundordnung künstlerische Figuren ohne technische Zuständigkeit.

systeme/omnimail/golden-master.txt · Zuletzt geändert: von Holger Wehrs

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki