# Statische Vorlage fuer postfwd 1.35, ohne Jinja-Variablen. # # POSTFIX-EINBINDUNG # main.cf: smtpd_end_of_data_restrictions = # check_policy_service inet:127.0.0.1:10040 # Amavis-Rueckgabeport localhost:10025 in master.cf: # -o smtpd_end_of_data_restrictions= # Sonst kann die Wiedereinlieferung mit XFORWARD erneut gezaehlt werden. # /etc/default/postfwd: ARGS="--summary=600 --cache=0" # # AUSWERTUNG # Verschiedene Attribute einer Regel: UND. Gleiches Attribut mehrfach: ODER. # DUNNO beendet diesen postfwd-Aufruf; Postfix setzt eigene Pruefungen fort. # REJECT lehnt permanent, 450 temporaer ab. rate()/rcpt() laufen unterhalb # des Limits weiter. jump(ID) springt zur bezeichneten Regel. # final=yes ist keine Steueranweisung und wird NICHT verwendet. # # LIMITS (fuer nicht vollstaendig freigestellte, nicht lokale SMTP-Clients) # # +--------------------------------+-----------+-----------+------------------+ # | Limit | Standard | Benutzer | Benutzer nur in | # | | | 500er- | Empfaenger- | # | | | Liste | Ausnahmeliste | # +--------------------------------+-----------+-----------+------------------+ # | Nachrichten / Stunde / Benutzer| 50 | 500 | 50 | # | Empfaenger / Stunde / Benutzer| 250 | 1000 | 1000 | # | Empfaenger / Nachricht | 89 | 89 | 89 | # +--------------------------------+-----------+-----------+------------------+ # # Zusaetzlich fuer alle oben genannten Benutzer: # # +------------------------------------------+----------------------------+ # | Client-IP | Nachrichten / Minute / IP | # +------------------------------------------+----------------------------+ # | Weder IP noch Hostname in Ausnahmeliste | 50 | # | IP ODER Hostname in Ausnahmeliste | 100 | # +------------------------------------------+----------------------------+ # # Zusaetzlich fuer nicht authentifizierte Clients: # # +------------------------------------------+----------------------------+ # | client_name = unknown | 5 Nachrichten / 5 Minuten | # | | je Client-IP | # +------------------------------------------+----------------------------+ # # Unauthentifiziert + client_name=unknown: 5 Nachrichten / 300 Sekunden / IP. # SASL: 50 Nachrichten / 3600 Sekunden / Benutzer; Ausnahme: 500. # IP: 50 Nachrichten / 60 Sekunden; Ausnahme ueber IP ODER Hostname: 100. # SASL: maximal 89 Empfaenger pro Nachricht (Ablehnung ab 90). # SASL: 250 Empfaenger / 3600 Sekunden; Ausnahme: 1000. # Jeder Benutzer der 500er-Nachrichtenliste bekommt auch die 1000er- # Empfaengerausnahme. Die separate Empfaengerliste erlaubt nur 1000 statt # 250 Empfaenger/Stunde, erhoeht aber nicht das Nachrichtenlimit. # Benutzer der 500er-Nachrichtenliste sind vom IP-Minutenlimit (50 bzw. # 100 Nachrichten / 60 Sekunden) ausgenommen: sie versenden meist # automatisiert in Schueben und wuerden sonst trotz 500er-Ausnahme am # Minutenlimit haengen bleiben. Fuer alle anderen bleibt das Minutenlimit # aktiv. Die Empfaengerzahl pro Nachricht (max. 89) gilt fuer alle. # # ZAEHLWEISE # rate() zaehlt END-OF-MESSAGE-Anfragen, rcpt() addiert recipient_count. # Es sind Versandversuche, keine bestaetigten Zustellungen. Wiederholungen # und spaeter abgelehnte Versuche koennen mitgezaehlt werden. Empfaenger # werden aufsummiert, nicht dedupliziert. Kein gleitendes Kalenderstunden- # budget: postfwd verwaltet befristete Zaehler ab ihrer Anlage. # Gemeinsame IPs teilen sich das Minutenlimit, auch bei mehreren Benutzern. # # DATEIEN # file: liest Listen beim Laden der Konfiguration. Danach neu laden/starten. # Fuer IPs/Netze: client_address==file:... (CIDR-Vergleich). # Fuer SASL: sasl_username==file:... (exakte Namen, keine Regex). # Fuer Namen/Adressen: =~file:... (Perl-Regex, keine Postfix-pcre:-Tabelle). # Alle referenzierten Dateien muessen fuer den Benutzer postfw lesbar sein. # Keine Ausnahmeliste mit &&SASL_AUTH in derselben Regel kombinieren: # das waere eine ODER-Verknuepfung auf sasl_username! # Nur diese Phase verwenden; keine Zaehleranlage in anderen SMTP-Phasen. id=CHECK_PHASE protocol_state!=END-OF-MESSAGE action=DUNNO # Lokaler SMTP-Verkehr wird ausgenommen, IPv4-Loopback und IPv6-Loopback. # Dies ersetzt NICHT die Abschaltung am Amavis-Rueckgabeport: XFORWARD # kann dort die urspruengliche externe Clientadresse wiederherstellen. id=SKIP_LOOPBACK client_address==127.0.0.0/8, ::1 action=DUNNO # 1. VOLLSTAENDIGE AUSNAHMEN # Bewusst vor den Sperrlisten wie in der bisherigen Konfiguration. # Diese Listen umgehen ALLE folgenden postfwd-Regeln, auch Blacklists. # Fuer nur hoehere Versandlimits ausschliesslich die high-rate-Listen nutzen. id=WHL_NETS client_address==file:/etc/postfix/postfwd.wl-nets action=DUNNO id=WHL_HOSTS client_name=~file:/etc/postfix/postfwd.wl-hosts action=DUNNO id=WHL_USERS sasl_username==file:/etc/postfix/postfwd.wl-user action=DUNNO # Achtung: Envelope-Absender ist keine authentifizierte Identitaet. # Bestehende Freistellung bleibt erhalten; kein SPF-/DKIM-Nachweis hier. id=WHL_SENDERS sender=~file:/etc/postfix/postfwd.wl-sender action=DUNNO # 2. SPERRLISTEN: permanente Ablehnung, kein stilles DISCARD. id=BL_NETS client_address==file:/etc/postfix/postfwd.bl-nets action=REJECT Network $$client_address blocked by mailserver admins. Error:BL_NETS id=BL_HOSTS client_name=~file:/etc/postfix/postfwd.bl-hosts action=REJECT Client $$client_name blocked by mailserver admins. Error:BL_HOSTS id=BL_USERS sasl_username==file:/etc/postfix/postfwd.bl-user action=REJECT User blocked by mailserver admins. Error:BL_USERS id=BL_SENDER sender=~file:/etc/postfix/postfwd.bl-sender action=REJECT Sender blocked by mailserver admins. Error:BL_SENDER # 3. EMPFAENGERBEZOGENE GROESSE, NUR BEI GENAU EINEM EMPFAENGER # 20 MiB = 20971520 Bytes; mit > bleibt genau dieser Wert erlaubt. # Postfix liefert recipient am Nachrichtenende nur bei einem Empfaenger. # Bei mehreren Empfaengern kann diese Regel KEIN Limit durchsetzen. # Die bisher leere Empfaengerliste bleibt erhalten; solange sie leer ist, # ist diese Zusatzpruefung inaktiv. Global gilt weiter message_size_limit. # Fuer verbindliche empfaengerbezogene Limits auch bei Mehrfachadressierung # ist eine andere Loesung, z.B. ein geeigneter Milter, erforderlich. id=BLOCK_MSG_SIZE_20MB recipient_count==1 recipient=~file:/etc/postfix/postfwd.bl-recipient-exeeds-msg-size-20mb size>20971520 action=REJECT Message exceeds 20 MiB ($$size bytes). Error:BLOCK_MSG_SIZE_20MB # Permanente Empfaengerzahl-Pruefung vor die Rate-Zaehler stellen. # Das bisher wirksame Limit bleibt erhalten: 89 erlaubt, ab 90 ablehnen. id=BLOCK_MSG_RCPT sasl_username!~^$ recipient_count=>90 action=REJECT Too many recipients, maximum is 89 per message. Error:BLOCK_MSG_RCPT # 4. UNBEKANNTE, UNAUTHENTIFIZIERTE CLIENTS # 5 Nachrichten, NICHT 5 Empfaenger oder 5 TCP-Verbindungen. id=RATE_UNKNOWN_CLIENT_ADDR sasl_username=~^$ client_name==unknown action=rate(client_address/5/300/450 4.7.1 Only 5 messages per 5 minutes allowed. Error:RATE_UNKNOWN_CLIENT_ADDR) # 5. NACHRICHTEN PRO STUNDE UND SASL-BENUTZER # Auswahl VOR dem Zaehlen. Die Ausnahme springt an der 50er-Regel vorbei. # Unterhalb 500 wird nach RATE_MSG_EXCEPTION direkt mit der Empfaenger- # summe (Abschnitt 7) fortgesetzt; die IP-Minutenlimits entfallen bewusst. id=SELECT_MSG_EXCEPTION sasl_username==file:/etc/postfix/postfwd.high-rate-number-messages action=jump(RATE_MSG_EXCEPTION) id=RATE_MSG sasl_username!~^$ action=rate(sasl_username/50/3600/450 4.7.1 Maximum 50 messages per hour exceeded. Error:RATE_MSG) # Standardpfad muss die nachfolgende 500er-Regel ueberspringen. id=AFTER_RATE_MSG action=jump(SELECT_HIGH_RATE_IP) id=RATE_MSG_EXCEPTION sasl_username!~^$ action=rate(sasl_username/500/3600/450 4.7.1 Maximum 500 messages per hour exceeded. Error:RATE_MSG_EXCEPTION) # Nach erfolgreicher 500er-Pruefung die IP-Minutenlimits (Abschnitt 6) # bewusst ueberspringen: automatisierte Versender wuerden sonst am # Minutenlimit scheitern. Empfaengerlimit pro Stunde weiterhin pruefen. id=AFTER_RATE_MSG_EXCEPTION action=jump(SELECT_RCPT_EXCEPTION_MSG) # 6. NACHRICHTEN PRO MINUTE UND IP # IP oder Hostname waehlen denselben 100er-Zaehler. Auch bei zwei Treffern # nur eine Zaehlung. Hostname ist der von Postfix gelieferte client_name; # nicht identisch mit einem ungeprueften HELO oder bloss irgendeinem PTR. id=SELECT_HIGH_RATE_IP client_address==file:/etc/postfix/postfwd.high_rate_ip action=jump(HIGH_RATE_CLIENT_ADDR) id=SELECT_HIGH_RATE_HOST client_name=~file:/etc/postfix/postfwd.high_rate_hostname action=jump(HIGH_RATE_CLIENT_ADDR) id=RATE_CLIENT_ADDR action=rate(client_address/50/60/450 4.7.1 Maximum 50 messages per minute per IP exceeded. Error:RATE_CLIENT_ADDR) id=AFTER_RATE_CLIENT_ADDR action=jump(SELECT_RCPT_EXCEPTION_MSG) id=HIGH_RATE_CLIENT_ADDR action=rate(client_address/100/60/450 4.7.1 Maximum 100 messages per minute per IP exceeded. Error:HIGH_RATE_CLIENT_ADDR) # 7. EMPFAENGERSUMME PRO STUNDE UND SASL-BENUTZER # 500er-Nachrichtenausnahme erhaelt automatisch auch 1000 Empfaenger/Stunde. # So scheitert sie nicht nach spaetestens 250 Ein-Empfaenger-Nachrichten. # Die zweite Liste kann weitere Benutzer NUR fuer die Empfaengersumme nennen. id=SELECT_RCPT_EXCEPTION_MSG sasl_username==file:/etc/postfix/postfwd.high-rate-number-messages action=jump(RATE_RCPT_HIGH) id=SELECT_RCPT_EXCEPTION_LIST sasl_username==file:/etc/postfix/postfwd.high-rate-number-recipients action=jump(RATE_RCPT_HIGH) id=RATE_RCPT sasl_username!~^$ action=rcpt(sasl_username/250/3600/450 4.7.1 Maximum 250 recipients per hour exceeded. Error:RATE_RCPT) id=AFTER_RATE_RCPT action=jump(END) id=RATE_RCPT_HIGH sasl_username!~^$ action=rcpt(sasl_username/1000/3600/450 4.7.1 Maximum 1000 recipients per hour exceeded. Error:RATE_RCPT_HIGH) id=END action=DUNNO