28. pepsi-ingress¶
Der eingehende SMTP-Server (MTA) und der Einstiegspunkt der Pipeline.
28.1. Rolle¶
pepsi-ingress betreibt den SMTP-Server, der Mail empfängt, sie an der Grenze authentifiziert und jede angenommene Nachricht als einen pepsi.workqueue-Datensatz bei stage = init speichert, bevor er den Dispatcher benachrichtigt. Es ist die einzige Komponente, die mit externen sendenden Clients spricht; alles Nachgelagerte operiert auf dem gespeicherten Datensatz. Die vollständige Optionsreferenz ist pepsi-ingress(1) / pepsi.conf(5).
28.2. Funktionen¶
28.2.1. Empfang (RFC 5321)¶
SMTP/ESMTP-Server mit Transport pro Listener: Klartext, STARTTLS-Upgrade (RFC 3207) und implizites TLS (RFC 8314); Listener binden TCP-, UNIX- oder systemd-aktivierte Sockets.
Nachrichtentexte über DATA oder CHUNKING/BDAT (RFC 3030).
Kündigt SIZE (das
MAX_MESSAGE_SIZE→552durchsetzt), PIPELINING, ENHANCEDSTATUSCODES, 8BITMIME (RFC 6152), SMTPUTF8 (RFC 6531) und DSN (RFC 3461) an.Nimmt Mail nur für
ACCEPTED_DOMAINSan (andere →550Relaying); nimmt das domainlose<Postmaster>immer an (RFC 5321 §4.5.1).Dauerhafte Annahme: gibt
250erst zurück, nachdem der Datensatz committet wurde; ein Datenbankausfall ergibt ein vorübergehendes451.Die Verbindungsnebenläufigkeit ist durch
MAX_CONNECTIONSund einMAX_OPEN_SOCKETS-Dateideskriptor-Budget begrenzt; eine Ratenbegrenzung pro Quelle (CONN_RATE_PER_SECOND) und, unter Druck, die Verdrängung der am längsten untätigen Verbindung im gierigsten Quellbereich schützen vor Verbindungsmissbrauch.Lese-Timeouts pro Befehl (
COMMAND_TIMEOUT/DATA_TIMEOUT, RFC 5321 §4.5.3.2) schließen langsame oder ins Stocken geratene Sitzungen, einschließlich eines hängendenSTARTTLS-Handshakes.Nachsichtige Zeilenlängen. Die Grenzen aus RFC 5321 §4.5.3.1.4/§4.5.3.1.6 (512-Oktett-Befehlszeilen, 1000-Oktett-Textzeilen) binden Sender; gemäß dem Hinweis desselben Abschnitts, dass Empfänger liberal sein sollen, nimmt Ingress längere Zeilen an. Die internen
MAX_CMD_LINE/MAX_DATA_LINE-Obergrenzen sind nur Speichererschöpfungs-Schutz — eine Zeile ohne Terminator, die über die Obergrenze wächst, lässt die Verbindung fallen — keine Konformitätsdurchsetzung.
28.2.2. Trace-Header¶
Stellt vor der Authentifizierung einen
Received:-Header gemäß RFC 5321 §4.4 voran (sodass die ARC-Versiegelung ihn abdeckt) und hält den Client (HELO/EHLO, Reverse-DNS, IP), diesen Server, den ÜbertragungstypSMTP/ESMTP/ESMTPS/ESMTPA/ESMTPSA(RFC 3848) und die Zeit fest; bei Einzelempfänger-Transaktionen wird einefor-Klausel hinzugefügt. Bei einer verschlüsselten Sitzung werden die ausgehandelte TLS-Version und -Chiffre als(version=… cipher=…)-Kommentar nach demESMTPS-Schlüsselwort angehängt (RFC 8314 §4.3).
28.2.3. Authentifizierung (an der Grenze festgehalten)¶
SPF (RFC 7208), DKIM-Verifikation (RFC 6376 / RFC 8463) und DMARC (RFC 7489), plus iprev/FCrDNS (RFC 8601).
Stellt einen Authentication-Results-Header (RFC 8601) mit dem Ingress-
HOSTNAMEalsauthserv-idvoran; die Urteile werden außerdem unterstate.auth(spf/dkim/dmarc/arc) gespeichert.Fail-open: Nur ein eindeutiger DMARC-Fehlschlag unter
DMARC_ENFORCElehnt ab (550); DNS-/Parse-Fehler werden festgehalten und die Mail angenommen.Die ARC-Verifikation/-Versiegelung wird hier nicht durchgeführt — das ist die pepsi-stage-arc-Stage, sodass Ingress keine ARC-Schlüssel hält. Ingress hält den Sitzungskontext, den die ARC-Stage benötigt, unter
state.originfest.
28.2.4. Submission (RFC 6409)¶
Ein Listener mit
SUBMISSION = yesmacht die Client-Authentifizierung verpflichtend und wendet die Submission-Korrekturen an (ein fehlendesDate:/Message-ID:wird ergänzt). Eines von vier Verfahren authentifiziert eine Sitzung: eine Gegenstellenadresse inMYNETWORKS, die Peer-Zugangsdaten eines UNIX-Sockets (AUTH_PEERCRED, der Standardwert bei einem UNIX-Listener und auf TCP abgelehnt), ein SASL-AUTH-Austausch (SASL_TYPE = dovecot, nur über TLS angeboten) oder ein festgelegtes TLS-Client-Zertifikat (TLS_AUTH_CLIENT). Eine authentifizierte Sitzung wird mitstate.local_origin = truefestgehalten;USERNAME_MAPentscheidet, unter welchen Adressen die authentifizierte Identität senden darf.Submission erfordert einen TLS-geschützten
MODE, außer auf einem lokalen UNIX-Domain-Socket, wo der Kernel die Identität liefert und es keinen Transport zu schützen gibt.Der lokale Submission-Socket, den pepsi-sendmail verwendet, braucht überhaupt keinen Listener-Abschnitt: Ingress synthetisiert einen für
[pepsi-sendmail] SOCKET, sofern nicht bereits ein ausdrücklicher Abschnitt diesen Pfad bedient.SOCKET = noneist der einzige Schalter, der ihn abschaltet; ihn nicht binden zu können ist fatal.
28.2.5. Postfach-Quota¶
Ist eine Postfach-Quota-Richtlinie in Kraft, so wird ein Empfänger, dessen gemessene Belegung über seiner Grenze liegt, bei
RCPTabgewiesen (452 4.2.2oder552 5.2.2, gemäß[pepsi] MAILBOX_OVER_QUOTA). Ingress liestpepsi.mailbox_quotaausschließlich und weist nur aufgrund einer Messung ab, die jünger alsMAILBOX_QUOTA_MAX_AGEist; jede Ungewissheit (kein Datensatz, eine veraltete oder fehlende Messung, ein Datenbankfehler) nimmt an.MAILBOX_QUOTA_RCPT_CHECK = no(Standardwertyes) verlagert die gesamte Durchsetzung auf den Zeitpunkt der Zustellung. Siehe pepsi-quota.
28.2.6. DSN-Aufnahme (RFC 3461)¶
Validiert und speichert
RET/ENVID(MAIL FROM) undNOTIFY/ORCPT(RCPT TO) unterstate.dsn; fehlerhafte Werte werden mit501abgelehnt.
28.2.7. Internationalisierte / 8-Bit-Aufnahme¶
Nimmt rohe 8-Bit-Nachrichtentexte und UTF-8-Header/-Umschlag an; hält die
BODY=-Deklaration unterstate.origin.body_8bitfest.BINARYMIMEwird abgelehnt (501). Das erneute Ankündigen/Herabstufen pro Hop geschieht später in den Relay-Stages.
28.2.8. SRS-Rückwärts-Dekodierung¶
Ein Empfänger in
SRS_DOMAIN, dessen Local-Part ein gültiges SRS-Token ist, wird zum ursprünglichen Absender dekodiert und dorthin zum Relay angenommen (auch außerhalb bedienter Domains — der HMAC autorisiert es); ein gefälschtes/abgelaufenes Token wird abgelehnt (550). So kehren Bounces zu den ursprünglichen Absendern zurück. Siehe pepsi-stage-srs.
28.2.9. Speicherung und Benachrichtigung¶
Speichert die Nachricht aufgeteilt in
headers- undbody-Spalten, mit dem Umschlag, geparstemFrom:/Subject:und den Urteilen; fügt beistage = init/status = pendingein.Weckt den Dispatcher außerhalb des Bandes und zusammengefasst, höchstens einmal je
DISPATCH_WAKE_INTERVAL(Standardwert 5 ms), nachdem der Datensatz committet wurde. Die Zulassungstransaktion selbst trägt keinNOTIFY: PostgreSQL hält von dem Moment an, in dem eine Transaktion eine Benachrichtigung einreiht, bis zu deren Commit eine datenbankweite Sperre, sodass ein benachrichtigendes Einfügen keinen Gruppen-Commit erlaubt. Ein verlorenes Wecken kostet nur die Latenz einesPOLL_INTERVALdes Dispatchers.
28.3. Konfiguration¶
Gelesen aus [pepsi-ingress] (Annahmerichtlinie, Grenzen, Timeouts, DNS), den [pepsi-ingress-listener-*]-Sockets (Transport und Client-Authentifizierung, je Listener) sowie den gemeinsamen Abschnitten [pepsi-postgres], [pepsi], [pepsi-sendmail] und [pepsi-srs]. Die Konfigurations-Überlagerung aus der Datenbank wird darüber angewendet. Vollständige Referenz: pepsi.conf(5) und Konfiguration.
28.4. Ausgaben an die Pipeline¶
Sät das state des Datensatzes mit origin (SMTP-Herkunft), auth (den SPF/DKIM/DMARC-Urteilen), local_origin, spam = false für eine Nachricht, deren einziger Empfänger <Postmaster> ist, und, falls angefordert, dsn (RFC-3461-Parameter). Siehe Architektur für das State-Modell.
28.5. Siehe auch¶
pepsi-dispatch, pepsi-stage-arc, pepsi-stage-srs, Unterstützte Funktionen, pepsi-ingress(1), pepsi.conf(5).