Inhaltsverzeichnis

Konfiguration unseres MTAs Postfix 3.x unter CentOS 7

Postfix-Logo Das schlimmste, was uns passieren kann, wäre der Betrieb eines offenen Mailrelais gefolgt von einem Mailserver der sich beharrlich weigert eMails anzunehmen, zu versenden und weiterzuleiten. Mit unserer Grundinstallation haben wir schon mal den wichtigsten Part Mailrelay mit den Definitionen in der main.cf erschlagen und sichergestellt, dass kein Fremder Nachrichten an Dritte verschickt, für die unser MX sich nicht zuständig und verantwortlich fühlt.

Auch wurde der Versand unserer eMails bereits entsprechend berücksichtigt.

Damit aber nun unser Mailserver nicht jeden Dreck - aka SPAM & Co - annimmt und auch versendet, definieren wir uns nun ein Regelwerk, mit Hilfe dessen wir festlegen, wann unser Server Mails annehmen oder ablehnen soll. Diese Festlegungen erfolgt mit Hilfe der Restrictions.

Der entscheidenste Moment, an dem wir nicht nur SPAM sondern auch all die anderen unerwünschten Nachrichten abzuwehren, ist der Einlieferungszeitpunkt! Was wir nicht annehmen brauchen wir auch später nicht weiterverarbeiten bzw. beachten. Analog dem Briefverkehr legen wir quasi fest, welche Sendungen überhaupt in unseren Briefkasten geworfen werden können und dürfen.

Wie bereits auch schon bei der Grundkonfiguration wurden die wichtigsten Details mit Hilfe der beiden Bücher Postfixbuch und Postfix: Einrichtung, Betrieb und Wartung erarbeitet, bzw. den dortigen Beispielen entnommen.

Postfix from the scratch

In der Vergangenheit, dokumentiert in den Konfigurationsbeispielen zu CentOS 5 und CentOS 6, wurden bei den Konfigurationsbeispielen als Basis die Distributionsspezifischen Vorlagen verwendet. Rückblickend ist aber festzustellen, dass einige der (ungeübteren) Administratoren mit unter Schwierigkeiten sich zurecht zu finden, waren doch verschiedene Konfigurationsoptionen etwas verstreut in der /etc/postfix/main.cf verteilt.

Wir werden daher bei den nun folgendem Beispiel zur Konfiguration unter CentOS 7 einen, auf den ersten ungewöhnlichen Schritt unternehmen und die main.cf beiseite legen und eine eigene anlegen; folgende vier Schritte sind hierzu notwendig:

  1. Wir stoppen den vorhandenen Postfix-SMTP-Server.
     # systemctl stop postfix
  2. Anschließend wechseln wir in das Konfigurationsverzeichnis /etc/postfix/.
     # cd /etc/postfix
  3. Nun löschen oder verschieben wir die nicht benötigten Dateien:
    1. löschen
       # rm canonical generic header_checks relocated virtual transport \
            main.cf main.cf.proto master.cf.proto -f
    2. verschieben
       # mkdir -p /etc/postfix/.orig/
       # mv canonical generic header_checks relocated virtual transport \
            main.cf main.cf.proto master.cf.proto /etc/postfix/.orig/ -f
  4. Anlegen einer leeren main.cf.
     # touch main.cf

Somit befinden sich nun nur noch zwei Dateien im Verzeichnis /etc/postfix.

/etc/postfix/
├── access
├── dynamicmaps.cf
├── dynamicmaps.cf.d
├── main.cf
├── master.cf
└── postfix-files
 # ls -Al  /etc/postfix/
total 12
-rw-r--r--. 1 root root  164 Jan 17 17:09 dynamicmaps.cf
drwxr-xr-x. 2 root root    6 Jan 17 17:09 dynamicmaps.cf.d
-rw-r--r--. 1 root root    0 Jan 27 17:50 main.cf
-rw-r--r--. 1 root root 6295 Jan 17 17:09 master.cf

Zur Strukturierung unserer eigenen main.cf nutzen wir jeweils folgende Überschriftszeile.

################################################################################
## < beschreibenden Text > 
#

Wir werden später die einzelnen Konfigurationsoptionen strukturieren, d.h. zusammenfassen und jeweils bei den betreffenden Sektionen eintragen.

Installations- und Konfigurations Informationen

Als erstes definieren wir alle Installations- und Konfigurationsinformationen, die verwendet werden, wenn eine neue Version von Postfix installiert wird, wie z.B. bei einem Update der Postfixversion. Die nachfolgenden Konfigurationsoptionen sind jeweils entsprechend mit Kommentaren versehen, so dass eine zusätzliche Beschreibung hier im Wiki nicht notwendig ist. Jeweils tiefer gehende Informationen und Beschreibungen findet man am einfachsten in Wietse's Onlinedokumentation oder in den beiden Eingangs erwähnten Fachbüchern.

 # vim /etc/postfix/main.cf
################################################################################
## INSTALLATIONS-KONFIGURATIONS INFORMATIONEN 
#
# Der Kopatibilitäts Level definiert, welche Standardeinstellungen Postfix für 
# die Einstellungen main.cf und master.cf verwendet. Diese Standardeinstellungen 
# werden sich im Laufe der Zeit voraussichtlich ändern!
#
# Damit die Lauffähigkeit des Postfix-Daemon nicht gefährdet wird der Daemon
# rückwärtskompatible Standardeinstellungen verwenden und dies auch entsprechend
# protokollieren. So kann bei einer Migration definiert werden,  ob rückwärts-
# kompatible Standardeinstellungen in main.cf oder master.cf dauerhaft 
# vorgenommen werden müssen.
#
# Nach erfolgter Überprüfung ist der compatibility_level, wie in der Datei 
# /usr/share/doc/postfix-3.*/README_FILES/RELEASE_NOTES 
# empfohlen, entsprechend anzupassen.
#
# Django : 2019-01-27 - Kompatibilitäts-Level der Postfix 3 Installation
#          Standardwert 2 definiert eine Neuinstalltion und kein (!) Upgrade.
# default: compatibility_level = 2
compatibility_level = 2
 
# Folgende Default-Parameter werden benutzt, sobald eine neue Postfix-Version 
# installiert wird.
#
# Django : 2019-01-27 - Vollständiger Pfad zum Postfix sendmail Programm, dem
#          zu senmail kompatiblen sendmail Befehl.
# default: sendmail_path = /usr/sbin/sendmail
sendmail_path = /usr/sbin/sendmail.postfix
 
# Django : 2019-01-27 - Vollständiger Pfad zum Postfix newaliases Programm, dem
#          zu sendmail kompatiblen Programm zum Anlegen der Alias Datenbanken.
# default: newaliases_path = /usr/bin/newaliases
newaliases_path = /usr/bin/newaliases.postfix
 
# Django : 2019-01-27 - Vollständiger Pfad zum Postfix qmail-Programm, dem zu
#          sendmail kompatiblen Programm zum Anzeigen der Maile-Queues
# default: mailq_path = /usr/bin/mailq
mailq_path = /usr/bin/mailq.postfix
 
# Django : 2019-01-27 - Gruppe für die Befehle mail submission und queue
#          management. Die Gruppe muss eine numerische eigene ID haben
#          und darf nicht mit anderen Benutzeraccounts geteilt werden,
#          auch nicht mit dem Postfix User! 
# default: setgid_group = postdrop 
setgid_group = postdrop
 
# Django : 2019-01-27 - Pfad für die Postfix Postfix HTML Dokumentation.
# default: html_directory
html_directory = no
 
# Django : 2019-01-27 - Pfad für die Postfix online man-pages.
# default: manpage_directory = /usr/local/man
manpage_directory = /usr/share/man
 
# Django : 2019-01-27 - Pfadangabe für die Postfix Beispielkonfigurationsdateien.
#          Dieser Parameter ist obsolete seit Postfix 2.1.
# default: sample_directory = /etc/postfix
sample_directory = /usr/share/doc/postfix-3.3.2/samples
 
# Django : 2019-01-27 - Pfadangabe für die Postfix README Dateien.
# default: readme_directory = no
readme_directory = /usr/share/doc/postfix-3.3.2/README_FILES
 
# Django : 2019-01-27 - Pfadangabe für das Postfix Metadirectory
# default: meta_directory = /etc/postfix
meta_directory = /etc/postfix
 
# Django : 2019-01-27 - Pfadangabe für das SHLIB-Verzeichnis
# default: shlib_directory = /usr/lib/postfix
shlib_directory = /usr/lib/postfix

Pfadangaben der lokalen Installation

Als nächstes legen wir in der Section PFADANGABEN DER LOKALEN INSTALLATION die Pfade unserer lokalen Installation fest.

 # vim /etc/postfix/main.cf
################################################################################
## PFADANGABEN DER LOKALEN INSTALLATION
#
# Django : 2019-01-27 - Definition des Speicherortes für die Queue-Dateien von
#          Postfix. Dies ist auch der root-Pfad, falls Postfix in einer
#          chroot-Umgebung laufen sollte. In der Datei examples/chroot-setup
#          findet man bei Bedarf nützliche Hinweise und Beispiele, die 
#          beschreiben, wie man Postfix in einer chroot-Umgebung aufsetzen und 
#          betreiben kann. 
# default: queue_directory = /var/spool/postfix
queue_directory = /var/spool/postfix
 
# Django : 2019-01-27 - Vollständiger Pfad zu allen postXXX-Programmen.
# default: command_directory = /usr/sbin
command_directory = /usr/sbin
 
# Django : 2019-01-27 Vollständiger Pfad zum Verzeichnis, in dem sich alle
#          postfix Daemon Programme (die z.B. auch in der master.cf
#          aufgeführt sind) befinden. Das Verzeichnis muss root gehören!
# default: daemon_directory = /usr/libexec/postfix
daemon_directory = /usr/libexec/postfix
 
# Django : 2019-01-27 - Datenverzeichnis, in dem Postfix alle variablen Daten
#          ablegt, wie z.B. Caches, Zufallszahlen ect. pp. Das Verzeichnis 
#          muss dem nachfolgendem "mail_owner" gehören!
# default: data_directory = /var/lib/postfix
data_directory = /var/lib/postfix

Rechte bei Queues und Prozessen

Im folgendem Schritt definieren wir die RECHTE BEI QUEUES UND PROZESSEN .

 # vim /etc/postfix/main.cf
################################################################################
## RECHTE BEI QUEUES UND PROZESSEN
#
# Django : 2019-01-27 - Definition des Nutzers, unter dem die meisten Postfix
#          Daemons laufen und mit dem die Queue-Dateien geschrieben werden.
#          Die User muss unique sein, d.h. er darf weder einer anderen Gruppe 
#          noch einem Anderen User angehören, sowie fremde Dateirechte und 
#          Prozesse auf dem System besitzen! Also unbedingt einen separaten 
#          Nutzer verwenden! 
# default: mail_owner = postfix
mail_owner = postfix
 
# Django : 2019-01-27 - Festlegung der Defaultrechte, die vom LDA (Local 
#          Delivery Agent) verwendet werden, wenn dieser Nachrichten in eine 
#          externe Datei schreibt, oder einem anderen Befehl übergibt.
#          Der Parameter wird auch verwendet, sollten keine userbezogenen
#          Vorgaben vorhanden sein. 
#          Auf keinen Fall einen privilegierten Nutzer oder gar den Benutzer
#          postfix verwenden!
# default: default_privs = nobody
default_privs = nobody

Debugging

Für ggf. später notwendige Fehlersuchen definieren wir nun die Rahmenbedingungen in der Section DEBUGGING.

 # vim /etc/postfix/main.cf
################################################################################
## DEBUGGING 
#
# Django : 2019-01-27 - Mit dem Parameter "debug_peer_level" wird festgelegt
#          um welchen Faktor der Logging-Level erhöht wird, wenn ein SMTP 
#          Client, ein Hostname oder eine IP-Adresse zu den Definitionen des
#          nachfolgenden "debug_peer_list"-Parameters passt.
# default: debug_peer_level = 2
debug_peer_level = 2
 
# Django : 2019-01-27 : Definition einer Liste aus Netzwerk-Adressen,
#          Namen, IP-Adressen oder entsprechender Postfix-Listen 
#          "type:name", für die der Loglevel gemäß dem obigen Loglevelwert
#          erhöht werden soll.
#          Bsp: debug_peer_list = 127.0.0.1
#               debug_peer_list = some.domain
#               cidr:/etc/postfix/debug_peer_list
# default: debug_peer_list =
 
# Django : 2019-01-27 - Debugger-Befehlszeile
#          Die Option "debugger_command" definiert den kompletten Debug-Aufruf,
#          das ausgeführt werden soll, sofern der Postfix Daemon mit der 
#          Option -D gestartet wurde.
#          Am Ende der Befehlskette sollte man ein "... & sleep 5" anfügen, 
#          damit damit der Debugger genügend Zeit hat loszulegen, bevor das 
#          Programm aufgerufen wird.
#
#          Da wir kein X-System auf unserem Mailserver installiert haben (wozu 
#          auch?), verwenden wir nachfolgendes Beispiel. Als Ergebnis erhalten 
#          wir damit eine Datei mit dem Namen des Prozesses und der zugehörigen 
#          ID, die im Konfigurationsverzeichnis abgespeichert wird.
#
debugger_command =
           PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont;
           echo where) | gdb $daemon_directory/$process_name $process_id 2>&1
           >$config_directory/$process_name.$process_id.log & sleep 5

Basics

Zuständigkeiten, vertrauenswürdige Netze und Netzwerk-Definitionen

In der Sektion ZUSTÄNDIGKEITEN, VERTRAUENSWÜRDIGE NETZE UND NETZWERKK-DEFINITIONEN erfolgt nun die Mailserver spezifische Konfiguration.

HINWEISE:

Werden einem Parameter mehrere Optionen zugewiesen, so hat es sich bewährt, diese nicht mit Kommatas getrennt hintereinander aufzuzählen, sondern untereinander „eingerückt“ zu schreiben. Dies erleichtert nicht nur die Lesbarkeit der Konfigurationsdatei, sondern gestattet es uns später durch Voranstellen eines # einzelne Optionen zu deaktivieren.

Bsp.:

  • mynetworks mit allen Netzen.
    mynetworks =
                    127.0.0.0/8
                    [::1]/128
                    10.0.0.0/24
                    10.0.10.0/26
  • mynetworks ohne das Netz 10.0.0.0/24
    mynetworks =
                    127.0.0.0/8
                    [::1]/128
    #                10.0.0.0/24
                    10.0.10.0/26

Wie schon zuvor wurden die einzelnen Optionen mit hilfreichen Kommentaren ergänzt.

 # vim /etc/postfix/main.cf
################################################################################
## ZUSTÄNDIGKEITEN, VERTRAUENSWÜRDIGE NETZE UND NETZWERKK-DEFINITIONEN
#
# Django : 2019-01-27 - Hostname auf "offiziellen" DNS-MX-Record Namen gesetzt
# default: myhostname = FQDN
myhostname = mx1.nausch.org
 
# Django : 2019-01-27 - Domainpart der lokal generierten Nachrichten gesetzt
# default: myorigin = $myhostname
myorigin = $mydomain
 
# Django : 2019-01-27 - Für welche Domains ist unser Mailserver zuständig,
#          also final destination? Zusätzlich zu den Defaultwerten soll der MTA 
#          auch noch Nachrichten für die beiden Sub-Domains lists.nausch.org 
#          (Mailman) und dmarc.nausch.org (DMARC-Reportmails) annehmen.
# default: mydestination = $myhostname, localhost.$mydomain, localhost
mydestination =
                $myhostname
                localhost.$mydomain
                localhost
                lists.nausch.org
                dmarc.nausch.org
 
# Django : 2019-01-27 - Ablehnung unbekannter Empfänger sollen abgewiesen und
#          nicht mit einem temporären Fehler 450 abgewiesen werden.
# default: unknown_local_recipient_reject_code = 550
#          unverified_recipient_reject_code = 450
unverified_recipient_reject_code = 577
 
# Django : 2019-01-27 - Soll bei einem unbekanntem Ziel der genaue Tabellenname
#          bei der Ablehnung genannt werden?
# default: show_user_unknown_table_name = yes 
show_user_unknown_table_name = no
 
# Django : 2019-01-27 - auf allen Interfaces und Protokollen (IPv4 und IPv6) 
#          soll gelauscht werden 
# default: inet_interfaces = all
# default: inet_protocols = all
 
# Django : 2019-01-27 - Grundsätzlich soll erst einmal unser Mailserver nur dem
#          eigenen Host trauen, sonst niemanden! 
# default: mynetworks_style = subnet
mynetworks_style = host
 
mynetworks =
                127.0.0.0/8
                [::1]/128
                10.0.0.0/24
                10.0.10.0/25
 
# Django : 2019-01-27 - Backup-Mailserver explizit erlauben
# default: permit_mx_backup_networks =
permit_mx_backup_networks = 88.217.171.167/32

Routing

In der Sektion ROUTING - WEITERLEITEN VON NACHRICHTEN AN DAS EIGENTLICHE ZIEL legen wir fest, wo und wie die einzelnen Zielserver erreichbar sind, an die unser Postfix SMTP-Server seine Nachrichten weiterleiten soll.

Auch wenn es für einen kleinen Server erst einmal als Overkill erscheinen mag, den IMAP-Server via LMTP anzusprechen, ist es dennoch von unschätzbaren Wert, sollte später doch noch ein separater IMAP-Server erforderlich sein. Somit muss später „nur“ noch die IP-Adresse oder der Name des IMAP-Servers geändert werden und nicht zusätzlich an der Konfiguration noch grundlegende Anpassungen vorgenommen werden!

 # vim /etc/postfix/main.cf
################################################################################
## ROUTING - WEITERLEITEN VON NACHRICHTEN AN DAS EIGENTLICHE ZIEL
#
# Django : 2019-01-27 - Relayhost: Alle Nachrichten werden an den Relayhost
#          smtp-out.dmz.nausch.org gesendet.
# default: relayhost =
# relayhost = [smtp-out.dmz.nausch.org]
 
# Django : 2019-01-27 - Backup-Relayhost: Sollte der $relayhost nicht erreichbar
#          sein, soll sich unser MTA an den backup-relayhost 
#          smtp-backup.dmz.nausch.org senden
# default: smtp_fallback_relay = $fallback_relay 
# smtp_fallback_relay = [smtp-backup.dmz.nausch.org]
 
# Django : 2019-01-27 - Relay Domains: Postfix als eingehendes Mailrelay vor 
#          einem anderen Server
# default: relay_domains = $mydestination 
relay_domains = btree:/etc/postfix/relay_domains
 
# Django : 2019-01-27 - Nachrichten für eine bestimmte Richtung sollen
#          abweichend von den MX-Definitionen im DNS an dedizierte Ziele
#          geroutet/weitergeleitet werden.
# default: transport_maps =
transport_maps = btree:/etc/postfix/transport_maps
 
# Django : 2019-01-27 - Definition zur Erreichbarkeit unseres MDA-Servers 
#          Dovecot-IMAP
# default: virtual_transport = virtual
virtual_transport = lmtp:[imap.dmz.nausch.org]:24

relay_domains

transport_maps

Queueing

Je nach Kundenwunsch stellen wir für die Mail-Queues eine maximale Verweildauer der Nachrichten in der/den Queues ein. Diese Dinge setzen wir in der Section QUEUEING-VERHALTEN.

 # vim /etc/postfix/main.cf
################################################################################
## QUEUEING-VERHALTEN
#
# Django : 2019-01-27 - Queue-Lifetime auf 3 Tage heruntersetzen, defininiert
#          die maximale Zeit, die der MX versuchen darf, eine Nachricht zuzu-
#          stellen
# default: maximal_queue_lifetime = 5d
maximal_queue_lifetime = 3d
 
# Django : 2019-01-27- Bounce-Queue-Lifetime auf 3 Tage heruntersetzen, die
#          der MTA versuchen soll eine Bouncenachricht zuzustellen.
# default: bounce_queue_lifetime = 5d
bounce_queue_lifetime = 3d

Nachrichtengrößen und Zustellversuche/-Mengen

Wie auch schon in der Section Queueing, gibt es für einzelne Installationen sehr oft Anforderungen im Bezug auf Nachrichtengrößen und Zustellversuche. Hierfür steht nachfolgende Section NACHRICHTENGROESSE UND ZUSTELLVERSUCHE/-MENGEN zur Verfügung.

 # vim /etc/postfix/main.cf
################################################################################
## NACHRICHTENGROESSE UND ZUSTELLVERSUCHE/-MENGEN 
#
# Django : 2019-01-27 Maximale Nachrichtengröße festlegen. Maximale Nachrichten-
#          größe einer Nachricht incl. der Headerinformationen darf maximal 
#          50 MB ( 52428800 = 50*1024*1024 ) betragen, darüber verweigert 
#          Postfix die Annahme. 
# default: message_size_limit = 10240000
message_size_limit = 52428800
 
# Django : 2019-01-27 Maximale Mailboxgröße einer einzelnen Mailbox bzw. 
#          Maildir-Files. Der Wert darf nicht kleiner als die maximale 
#          Nachrichtengröße (message_size_limit) sein.
# default: mailbox_size_limit = 10240000
mailbox_size_limit = 52428800
 
# Django : 2019-01-27 - Rate Limiting (DOS-Attacken verhindern) maximale
#          Zustellung limitieren (Kapitel 24 des Buches Postfix)
#          (Kapitel 13.14 Rate-Limiting gegenüber Clients durchsetzen)
#          Basiszeiteinheit für die Kalkulation der rate-limits
# default: anvil_rate_time_unit = 60s
#
#          Maximale Anzahl gleichzeitiger Verbindungen pro einliefernenden Host
# default : smtpd_client_connection_count_limit = 50 
smtpd_client_connection_count_limit = 20
#
#          Maximale Anzahl von Verbindungsversuchen je definierter Zeiteinheit 
#          (anvil_rate_time_unit) pro einliefernden Host
# default: smtpd_client_connection_rate_limit = 0
smtpd_client_connection_rate_limit = 20
#
#          Maximale Anzahl von erlaubten Empfänger Adressen je definierter 
#          Zeiteinheit (anvil_rate_time_unit) pro einliefernden Host
# default: smtpd_client_recipient_rate_limit = 0
smtpd_client_recipient_rate_limit = 50
#
#          Maximale Anzahl von erlaubten Anzahl von eMails je definierter Zeit-
#          einheit (anvil_rate_time_unit) pro einliefernden Host
# default: smtpd_client_message_rate_limit = 0
smtpd_client_message_rate_limit = 50
#
#          Welche Clients sollen vom Rate-Limeting ausgenommen werden? Per
#          Default sind dies alle Clients aus dem eigenen Netzwerk $mynetworks
# default: smtpd_client_event_limit_exceptions = 
#          ${smtpd_client_connection_limit_exceptions:$mynetworks}
#
#          Wie oft soll der anvil-Daemon Statistikdaten ins Maillog schreiben?
# default: anvil_status_update_time = 600s         
#
#          Ausgehende Verbindungen der Delivery-Clients limitieren. Für jeden
#          einzelnen Transport kann bei Bedarf eine eigene Rate definiert 
#          werden.
# default: default_destination_rate_delay = 0s
#          error_destination_rate_delay = $default_destination_rate_delay
#          lmtp_destination_rate_delay = $default_destination_rate_delay
#          local_destination_rate_delay = $default_destination_rate_delay
#          relay_destination_rate_delay = $default_destination_rate_delay
#          retry_destination_rate_delay = $default_destination_rate_delay
#          smtp_destination_rate_delay = $default_destination_rate_delay
#          virtual_destination_rate_delay = $default_destination_rate_delay
#          Ausgehende Nachrichten des MAilinglistenservers auf 2,5 Minuten
#          setzen
smtp_destination_rate_delay = 150s

WICHTIG:
Die Option gilt für alle Clients! Das bedeutet, dass ein smtp_destination_rate_delay = 150s die Zustellversuche an alle SMTP-Ziele gilt. Im Maillog des Servers wird nicht extra ein Hinweis eingetragen, dass das rate_limiting zugeschlagen hat!

Rückmeldungen beeinflussen und individualisieren

In der Section RÜCKMELDUNGEN BEEINFLUSSEN UND INDIVIDUALISIEREN können wir festlegen, welche Informationen unser Mailserver unterdrücken und weitergeben soll. Auch eine Individualisierung auf Mailserverbetreiberebene sind möglich.

So werden z.B. bei der Option smtpd_reject_footer zusätzlich zu dem Fehlercode noch weitere Informationen zur Rückmeldemöglichkeit über den Roleaccount postmaster@ gegeben. Die anderen Optionen sind in dem Konfigurationsabschnitt entsprechend erklärt.

 # vim /etc/postfix/main.cf
################################################################################
## RÜCKMELDUNGEN BEEINFLUSSEN UND INDIVIDUALISIEREN
#
# Django : 2019-01-27 - Greeting Banner bei der 220er Begrüßung des MTA
smtpd_banner = $myhostname ESMTP $mail_name
 
# Django : 2019-01-27 - Extra-Footer als zweite Zeiler jeder Fehlermeldungen 
#          anfügen
smtpd_reject_footer = \c. Contact your postmaster/admin for technical assistance. He can achieve our postmaster via email: postmaster@nausch.org or via fax: +49 8121 883179. In any case, please provide the following information in your problem report: This error message, time ($localtime), client ($client_address) and server ($server_name).
 
# Django : 2019-01-27 - Anzeige des Tabellen-Namens, in der der Empfänger
#          nicht gefunden wurde. Das unterdrücken macht unter Umständen die
#          Fehlersuche etwas aufwändiger, aber Externen geht diese Detailinfo
#          im Grunde nichts an. 
# default: show_user_unknown_table_name = yes
show_user_unknown_table_name = no
 
# Django : 2019-01-27 - Adressverifikationsdetails unterdrücken
#          Weder den numerischen SMTP-reply-Code, noch den enhanced status code
#          zurückgeben. Lediglich "Recipient address lookup failed" zurückmelden.
# default: unverified_recipient_reject_reason =
unverified_recipient_reject_reason = Recipient address lookup failed
 
# Django : 2019-01-27 - Adressverifikationsdetails unterdrücken
#          Weder den numerischen SMTP-reply-Code, noch den enhanced status code
#          zurückgeben. Lediglich "Recipient address lookup failed" zurückmelden.
# default: unverified_sender_reject_reason =
unverified_sender_reject_reason = Sender address lookup failed
 
# Django : 2019-01-27 Definition der benutzerspezifischen und individualisierten 
#          Bounce-Nachrichten mit deutsch- und englischsprachigen Texten aktiviert
# default: bounce_template_file =
bounce_template_file = /etc/postfix/bounce.de-DE.cf
 
# Django : 2019-01-27 - Delivery Status Notification (DSN) selectiv sperren
#          oder freigeben
# default: smtpd_discard_ehlo_keyword_address_maps =
smtpd_discard_ehlo_keyword_address_maps = cidr:/etc/postfix/esmtp_access
 
# Django : 2019-01-27 - SMTP-Kommando VRFY sperren, mit dem eine einfache und
#          schnelle Addressverifizierung möglich ist.
# default: disable_vrfy_command = no
disable_vrfy_command = yes
 
# Django : 2019-01-27 - Fehlercode bei Verwendung der Option 
#          reject_plaintext_session beim Einsatz von verpflichtender
#          TLS-Transportverschlüsselung.  
#          https://tools.ietf.org/html/rfc3463#section-3.8
# default: plaintext_reject_code = 450
plaintext_reject_code = 571

Da wir ja nicht nur englischsprachige Nutzer haben, die bei unserem MX Post abliefern dürfen, möchten wir unter Umständen auch individuelle Bouncemessages verwenden. In der Sektion RÜCKMELDUNGEN BEEINFLUSSEN UND INDIVIDUALISIEREN haben wir bereits den Parameter bounce_template_file gesetzt. was uns jetzt noch fehlt ist das zugehörige File. Dieses mustergültiges Nachrichtentemplate von den beiden Spezialisten Patrick Koetter und Ralf Hildebrandt aus dem Web herunter.

 # cd /etc/postfix
 # wget http://postfix.state-of-mind.de/bounce-templates/bounce.de-DE.cf

Lookup-Tabellen

Bevor wir uns nun die einzelnen Lookup-Tabellen genauer ansehen, werfen wir noch einen Blick in die nachfolgende Übersicht um festzustellen, wann die einzelnen Tabellen in der Mailbearbeitung gezogen werden, also überhaupt einen Einfluß haben.

masterQueue└── maildropDaemon└── pickupDaemon└── anvilDaemon└── dnsblogDaemon└── tlsproxyDaemon└── postscreenDaemon└── verifyDaemon└── tlsmgrDaemon└── scacheDaemon└── qmqpdAgent└── discardAgent├── error└── retryDaemon└── virtualDaemon└── cleanupDaemon└── showqDaemon└── trivial-rewriteDaemon├── bounce├── defer└── traceDaemon└── smtpdQueue└── incomingQueue└── holdQueue└── corruptQueue└── activeQueue└── deferredDaemon└── qmgrDaemon└── flushModul└── resolveMDA└── localMailclient└── pipeMailclient└── lmtpMailclient└── smtpDaemon├── proxymap└── proxywriteDaemonQMQP-Modul/usr/bin/sendmailPostfix - Modul"postdrop"MTA - MTA VerkehrTCP/IP - Port 25MUA - MSA VerkehrTCP/IP - Port 587MDA(Mail Delivery Agent)Dovecot IMAP-ServerTCP/IP - Port 24MTA(Mail Transport Agent)andere SMTP-Server (Relayhosts)im Internet bzw. IntranetTCP/IP - Port 25MailmanWeitergabe der eMailan Mailinglisten / wie Mailmanoder via UUCP ...mailboxPostfix - Queue"mailbox"lokale ZustellungLookup Table canonical_mapsÜbersetzungstabelle zumUmschreiben von nicht-lokalenEmpfängeradressenLookup Table virtual_mapsTabelle mit der Empfängeradressealler lokalen, virtuellen undentfernten eMailadressenRealtime Blockhole ListsNutzung von RBL zum Prüfenvon einliefernden Hostsreverse DNS-Abfrage z.B.bei SPAMHAUSLookup Table relocated_mapsTabelle für die Bounce-Nachrichtenmit Angabe der neuen eMailadressebei verzogenen Accounts.Lookup Table access_clientLookup Table access_heloLookup Table access_recipientLookup Table access_recipient-rfcLookup Table access_senderTabellen zum Black- und Whitelistenan Hand der IP-Adrese, Hostname,Empfänger oder SenderLookup Table transport_mapsTabelle zur adressabhängigenWeiterleitung an einenweiteren (finalen) MTA.Lookup Table /etc/aliasesTabelle mit der lokalen eMailsan lokale Empfänger zugewiesenwerden können.Lookup Table .forwardTabelle zur Steuerung vonautomatischen AnwesenheitsnachrichtenLookup Table generic_mapsTabelle zum Umschreibenvon eMailadressenbeim Versenden.Lookup Table lmtp_generic_mapsTabelle zum Umschreiben von EmpfängereMail-Adressen im Envelope und Header

Am Anfang der Definition unserer Lookup-Tabellen setzen wir noch zwei (Adress-)Listenspezifische Werte. Statt der Defaultmäßigen Tabellen im hash-Format setzen wir auf die wesentlich performanteren btree-Tabellen.

Damit wir später unsere Datenbankfiles einfach durch den Aufruf

 # postmap <lookup-table>

anlegen können, setzen wir noch den Wert default_database_type auf btree. Anderen Falls müssten wir bei jedem Aufruf von postmap den Datenbanktabellentyp mit angeben!

 # postmap btree:<lookup-table>
# Django : 2019-01-27 - default Datenbank Typ für die Befehle newaliases, 
#          postalias und postmap auf das performantere btree umgestellt.
# default default_database_type = hash
default_database_type = btree

Zur Abtrennung von Usernamen und Adresserweiterung wollen das +-Zeichen verwenden. Diese Festlegung erfolgt über die Option recipient_delimiter. Mit Hilfe dieses Zeichens können die Mailboxinhaber Benutzerspezifische zusätzliche Adressen generieren, um z.B. später mit Hilfe von sieve-Regeln ankommende Nachrichten in gewünschte Unterordner einsortieren zu lassen.

# Django : 2019-01-27 - Trennzeichen zwischen Usernamen und Adresserweiterung 
# default: recipient_delimiter =
recipient_delimiter = +

aliases

Mit Hilfe der aliases-Tabelle lassen sich lokale eMailadressen umschreiben und so die Nachrichten an andere Postfächer umleiten. Die Alias-Tabelle aliases und die zugehörige Datenbankdatei aliases.db befinden sich aus historischen Gründen nicht im Postfix-Konfigurationspfad /etc/postfix sondern im Verzeichnis /etc.

Im Gegensatz zu den anderen Tabellen, wird der erste Tabellenwert jeweils mit einem : abgeschlossen.

Bsp.:

# Django : 2019-01-27 - Weiterleitung an den User django
root:           django@nausch.org

Dieser Doppelpunkt bedingt dann auch, dass die zugehörige indizierte Map-Datei nicht mit dem Befehl postmap erstellt wird, sondern mit newaliases.

 # less /etc/aliases*
/etc/aliases
#
#  Aliases in this file will NOT be expanded in the header from
#  Mail, but WILL be visible over networks or from /bin/mail.
#
#	>>>>>>>>>>	The program "newaliases" must be run after
#	>> NOTE >>	this file is updated for any changes to
#	>>>>>>>>>>	show through to sendmail.
#
 
# Basic system aliases -- these MUST be present.
mailer-daemon:	postmaster
postmaster:	root
 
# General redirections for pseudo accounts.
bin:		root
daemon:		root
adm:		root
lp:		root
sync:		root
shutdown:	root
halt:		root
mail:		root
news:		root
uucp:		root
operator:	root
games:		root
gopher:		root
ftp:		root
nobody:		root
radiusd:	root
nut:		root
dbus:		root
vcsa:		root
canna:		root
wnn:		root
rpm:		root
nscd:		root
pcap:		root
apache:		root
webalizer:	root
dovecot:	root
fax:		root
quagga:		root
radvd:		root
pvm:		root
amanda:		root
privoxy:	root
ident:		root
named:		root
xfs:		root
gdm:		root
mailnull:	root
postgres:	root
sshd:		root
smmsp:		root
postfix:	root
netdump:	root
ldap:		root
squid:		root
ntp:		root
mysql:		root
desktop:	root
rpcuser:	root
rpc:		root
nfsnobody:	root
 
ingres:		root
system:		root
toor:		root
manager:	root
dumper:		root
abuse:		root
 
newsadm:	news
newsadmin:	news
usenet:		news
ftpadm:		ftp
ftpadmin:	ftp
ftp-adm:	ftp
ftp-admin:	ftp
www:		webmaster
webmaster:	root
noc:		root
security:	root
hostmaster:	root
info:		postmaster
marketing:	postmaster
sales:		postmaster
support:	postmaster
 
 
# trap decode to catch security attacks
decode:		root
 
# Person who should get root's mail
#root:		marc
# Django : 2019-01-27 - Weiterleitung an den User django
root:           django@nausch.org

Achtung: Die aliases-Tabelle wird nur vom Postfix-Modul local ausgewertet, wenn diese lokal zugestellt werden. Erfolgt die Zustellung mit Hilfe von LMTP oder SMTP oder anderen Transportmethoden, wird die aliases-Tabelle ignoriert!

Die für Postfix relevante Konfigurationsoptionen sind hierbei alaias_maps und alias_database.

# Django : 2019-01-27 - Alias-Tabelle für die Zustellung von lokalen Nachrichten
#          durch den MDA (Mail Delivery Agent) "local". Nach Änderungen an der
#          Tabelle /etc/aliases ist "newaliases" zum Neubau des Datenbankfiles
#          notwendig!
# default: alias_maps = hash:/etc/aliases, nis:mail.aliase
alias_maps =              hash:/etc/aliases
alias_database =          hash:/etc/aliases

access

manpage

In der Manpage zu access bzw. in der Datei /etc/postfix/access finden wir detaillierte Informationen zur access - Postfix SMTP server access table.

 # man 5 access
ACCESS(5)                                      File Formats Manual                                      ACCESS(5)

NAME
       access - Postfix SMTP server access table

SYNOPSIS
       postmap /etc/postfix/access

       postmap -q "string" /etc/postfix/access

       postmap -q - /etc/postfix/access <inputfile

DESCRIPTION
       This  document  describes access control on remote SMTP client information: host names, network addresses,
       and envelope sender  or  recipient  addresses;  it  is  implemented  by  the  Postfix  SMTP  server.   See
       header_checks(5) or body_checks(5) for access control on the content of email messages.

       Normally,  the access(5) table is specified as a text file that serves as input to the postmap(1) command.
       The result, an indexed file in dbm or db format, is used for fast searching by the  mail  system.  Execute
       the command "postmap /etc/postfix/access" to rebuild an indexed file after changing the corresponding text
       file.

       When the table is provided via other means such as NIS, LDAP or SQL, the same  lookups  are  done  as  for
       ordinary indexed files.

       Alternatively,  the  table can be provided as a regular-expression map where patterns are given as regular
       expressions, or lookups can be directed to TCP-based server. In those cases, the lookups  are  done  in  a
       slightly different way as described below under "REGULAR EXPRESSION TABLES" or "TCP-BASED TABLES".

CASE FOLDING
       The  search  string is folded to lowercase before database lookup. As of Postfix 2.3, the search string is
       not case folded with database types such as regexp: or pcre: whose lookup fields can match both upper  and
       lower case.

TABLE FORMAT
       The input format for the postmap(1) command is as follows:

       pattern action
              When pattern matches a mail address, domain or host address, perform the corresponding action.

       blank lines and comments
              Empty  lines and whitespace-only lines are ignored, as are lines whose first non-whitespace charac‐
              ter is a `#'.

       multi-line text
              A logical line starts with non-whitespace text. A line that starts with whitespace continues a log‐
              ical line.

EMAIL ADDRESS PATTERNS
       With lookups from indexed files such as DB or DBM, or from networked tables such as NIS, LDAP or SQL, pat‐
       terns are tried in the order as listed below:

       user@domain
              Matches the specified mail address.

       domain.tld
              Matches domain.tld as the domain part of an email address.

              The pattern domain.tld also matches subdomains, but  only  when  the  string  smtpd_access_maps  is
              listed in the Postfix parent_domain_matches_subdomains configuration setting.

       .domain.tld
              Matches  subdomains  of domain.tld, but only when the string smtpd_access_maps is not listed in the
              Postfix parent_domain_matches_subdomains configuration setting.

       user@  Matches all mail addresses with the specified user part.

       Note: lookup of the null sender address is not possible with some types of lookup table. By default, Post‐
       fix   uses   <>   as   the   lookup   key   for   such   addresses.   The  value  is  specified  with  the
       smtpd_null_access_lookup_key parameter in the Postfix main.cf file.

EMAIL ADDRESS EXTENSION
       When a mail address localpart contains the  optional  recipient  delimiter  (e.g.,  user+foo@domain),  the
       lookup order becomes: user+foo@domain, user@domain, domain, user+foo@, and user@.

HOST NAME/ADDRESS PATTERNS
       With  lookups from indexed files such as DB or DBM, or from networked tables such as NIS, LDAP or SQL, the
       following lookup patterns are examined in the order as listed:

       domain.tld
              Matches domain.tld.

              The pattern domain.tld also matches subdomains, but  only  when  the  string  smtpd_access_maps  is
              listed in the Postfix parent_domain_matches_subdomains configuration setting.

       .domain.tld
              Matches  subdomains  of domain.tld, but only when the string smtpd_access_maps is not listed in the
              Postfix parent_domain_matches_subdomains configuration setting.

       net.work.addr.ess

       net.work.addr

       net.work

       net    Matches the specified IPv4 host address or subnetwork. An IPv4 host address is a sequence  of  four
              decimal octets separated by ".".

              Subnetworks  are  matched  by  repeatedly  truncating  the  last ".octet" from the remote IPv4 host
              address string until a match is found in the access table, or until further truncation is not  pos‐
              sible.

              NOTE  1: The access map lookup key must be in canonical form: do not specify unnecessary null char‐
              acters, and do not enclose network address information with "[]" characters.

              NOTE 2: use the cidr lookup table type to specify network/netmask patterns. See  cidr_table(5)  for
              details.

       net:work:addr:ess

       net:work:addr

       net:work

       net    Matches  the specified IPv6 host address or subnetwork. An IPv6 host address is a sequence of three
              to eight hexadecimal octet pairs separated by ":".

              Subnetworks are matched by repeatedly truncating the last ":octetpair" from the  remote  IPv6  host
              address  string until a match is found in the access table, or until further truncation is not pos‐
              sible.

              NOTE 1: the truncation and comparison are done with the string  representation  of  the  IPv6  host
              address. Thus, not all the ":" subnetworks will be tried.

              NOTE  2: The access map lookup key must be in canonical form: do not specify unnecessary null char‐
              acters, and do not enclose network address information with "[]" characters.

              NOTE 3: use the cidr lookup table type to specify network/netmask patterns. See  cidr_table(5)  for
              details.

              IPv6 support is available in Postfix 2.2 and later.

ACCEPT ACTIONS
       OK     Accept the address etc. that matches the pattern.

       all-numerical
              An  all-numerical  result  is treated as OK. This format is generated by address-based relay autho‐
              rization schemes such as pop-before-smtp.

       For other accept actions, see "OTHER ACTIONS" below.

REJECT ACTIONS
       Postfix version 2.3 and later support enhanced status codes as defined in RFC 3463.  When no code is spec‐
       ified at the beginning of the text below, Postfix inserts a default enhanced status code of "5.7.1" in the
       case of reject actions, and "4.7.1" in the case of defer actions. See "ENHANCED STATUS CODES" below.

       4NN text

       5NN text
              Reject the address etc. that matches the pattern, and respond with the numerical  three-digit  code
              and text. 4NN means "try again later", while 5NN means "do not try again".

              The following responses have special meaning for the Postfix SMTP server:

              421 text (Postfix 2.3 and later)

              521 text (Postfix 2.6 and later)
                     After  responding  with the numerical three-digit code and text, disconnect immediately from
                     the SMTP client.  This frees up SMTP server resources so that they can be made available  to
                     another SMTP client.

                     Note: The "521" response should be used only with botnets and other malware where interoper‐
                     ability is of no concern.  The "send 521 and disconnect" behavior is NOT defined in the SMTP
                     standard.

       REJECT optional text...
              Reject  the  address  etc.  that  matches the pattern. Reply with "$access_map_reject_code optional
              text..." when the optional text is specified, otherwise reply with a generic  error  response  mes‐
              sage.

       DEFER optional text...
              Reject  the  address  etc.  that  matches  the pattern. Reply with "$access_map_defer_code optional
              text..." when the optional text is specified, otherwise reply with a generic  error  response  mes‐
              sage.

              This feature is available in Postfix 2.6 and later.

       DEFER_IF_REJECT optional text...
              Defer  the  request  if  some  later  restriction  would  result  in  a  REJECT  action. Reply with
              "$access_map_defer_code 4.7.1 optional text..." when the  optional  text  is  specified,  otherwise
              reply with a generic error response message.

              Prior to Postfix 2.6, the SMTP reply code is 450.

              This feature is available in Postfix 2.1 and later.

       DEFER_IF_PERMIT optional text...
              Defer  the  request  if  some  later  restriction  would result in a an explicit or implicit PERMIT
              action.  Reply with "$access_map_defer_code 4.7.1  optional text..."  when  the  optional  text  is
              specified, otherwise reply with a generic error response message.

              Prior to Postfix 2.6, the SMTP reply code is 450.

              This feature is available in Postfix 2.1 and later.

       For other reject actions, see "OTHER ACTIONS" below.

OTHER ACTIONS
       restriction...
              Apply the named UCE restriction(s) (permit, reject, reject_unauth_destination, and so on).

       BCC user@domain
              Send one copy of the message to the specified recipient.

              If  multiple BCC actions are specified within the same SMTP MAIL transaction, with Postfix 3.0 only
              the last action will be used.

              This feature is available in Postfix 3.0 and later.

       DISCARD optional text...
              Claim successful delivery and silently discard the message.  Log the optional  text  if  specified,
              otherwise log a generic message.

              Note:  this  action currently affects all recipients of the message.  To discard only one recipient
              without discarding the entire message, use the transport(5) table to direct mail to the  discard(8)
              service.

              This feature is available in Postfix 2.0 and later.

       DUNNO  Pretend  that  the  lookup  key  was not found. This prevents Postfix from trying substrings of the
              lookup key (such as a subdomain name, or a network address subnetwork).

              This feature is available in Postfix 2.0 and later.

       FILTER transport:destination
              After the message is queued, send the entire message through the specified external content filter.
              The  transport name specifies the first field of a mail delivery agent definition in master.cf; the
              syntax of the next-hop destination is described in the manual page of  the  corresponding  delivery
              agent.  More information about external content filters is in the Postfix FILTER_README file.

              Note 1: do not use $number regular expression substitutions for transport or destination unless you
              know that the information has a trusted origin.

              Note 2: this action overrides the main.cf content_filter setting, and affects all recipients of the
              message. In the case that multiple FILTER actions fire, only the last one is executed.

              Note  3: the purpose of the FILTER command is to override message routing.  To override the recipi‐
              ent's transport but not the next-hop destination, specify an empty filter destination (Postfix  2.7
              and  later),  or specify a transport:destination that delivers through a different Postfix instance
              (Postfix 2.6 and earlier). Other options are using the recipient-dependent  transport_maps  or  the
              sender-dependent sender_dependent_default_transport_maps features.

              This feature is available in Postfix 2.0 and later.

       HOLD optional text...
              Place  the message on the hold queue, where it will sit until someone either deletes it or releases
              it for delivery.  Log the optional text if specified, otherwise log a generic message.

              Mail that is placed on hold can be examined with the postcat(1) command, and can  be  destroyed  or
              released with the postsuper(1) command.

              Note: use "postsuper -r" to release mail that was kept on hold for a significant fraction of $maxi‐
              mal_queue_lifetime or $bounce_queue_lifetime, or longer. Use "postsuper -H" only for mail that will
              not expire within a few delivery attempts.

              Note: this action currently affects all recipients of the message.

              This feature is available in Postfix 2.0 and later.

       PREPEND headername: headervalue
              Prepend  the  specified message header to the message.  When more than one PREPEND action executes,
              the first prepended header appears before the second etc. prepended header.

              Note: this action must execute before the message content is received; it  cannot  execute  in  the
              context of smtpd_end_of_data_restrictions.

              This feature is available in Postfix 2.1 and later.

       REDIRECT user@domain
              After  the  message  is  queued,  send the message to the specified address instead of the intended
              recipient(s).  When multiple REDIRECT actions fire, only the last one takes effect.

              Note: this action overrides the FILTER action, and currently overrides all recipients of  the  mes‐
              sage.

              This feature is available in Postfix 2.1 and later.

       INFO optional text...
              Log  an informational record with the optional text, together with client information and if avail‐
              able, with helo, sender, recipient and protocol information.

              This feature is available in Postfix 3.0 and later.

       WARN optional text...
              Log a warning with the optional text, together with client information and if available, with helo,
              sender, recipient and protocol information.

              This feature is available in Postfix 2.1 and later.

ENHANCED STATUS CODES
       Postfix version 2.3 and later support enhanced status codes as defined in RFC 3463.  When an enhanced sta‐
       tus code is specified in an access table, it is subject to modification. The following transformations are
       needed when the same access table is used for client, helo, sender, or recipient access restrictions; they
       happen regardless of whether Postfix replies to a MAIL FROM, RCPT TO or other SMTP command.

       ·      When a sender address matches a REJECT action, the Postfix SMTP server will transform  a  recipient
              DSN status (e.g., 4.1.1-4.1.6) into the corresponding sender DSN status, and vice versa.

       ·      When  non-address  information  matches  a  REJECT action (such as the HELO command argument or the
              client hostname/address), the Postfix SMTP server will transform a sender or recipient  DSN  status
              into a generic non-address DSN status (e.g., 4.0.0).

REGULAR EXPRESSION TABLES
       This section describes how the table lookups change when the table is given in the form of regular expres‐
       sions. For a description of regular expression lookup table syntax, see regexp_table(5) or pcre_table(5).

       Each pattern is a regular expression that is applied to the entire string being looked  up.  Depending  on
       the  application, that string is an entire client hostname, an entire client IP address, or an entire mail
       address. Thus, no parent domain or parent network search is done, user@domain mail addresses are not  bro‐
       ken up into their user@ and domain constituent parts, nor is user+foo broken up into user and foo.

       Patterns  are  applied  in  the order as specified in the table, until a pattern is found that matches the
       search string.

       Actions are the same as with indexed file lookups, with the additional  feature  that  parenthesized  sub‐
       strings from the pattern can be interpolated as $1, $2 and so on.

TCP-BASED TABLES
       This section describes how the table lookups change when lookups are directed to a TCP-based server. For a
       description of the TCP client/server lookup protocol, see tcp_table(5).  This feature is not available  up
       to and including Postfix version 2.4.

       Each  lookup operation uses the entire query string once.  Depending on the application, that string is an
       entire client hostname, an entire client IP address, or an entire mail address.  Thus, no parent domain or
       parent  network  search  is done, user@domain mail addresses are not broken up into their user@ and domain
       constituent parts, nor is user+foo broken up into user and foo.

       Actions are the same as with indexed file lookups.

EXAMPLE
       The following example uses an indexed file, so that the order of table entries does not matter. The  exam‐
       ple  permits  access by the client at address 1.2.3.4 but rejects all other clients in 1.2.3.0/24. Instead
       of hash lookup tables, some systems use dbm.  Use the command "postconf -m" to find out what lookup tables
       Postfix supports on your system.

       /etc/postfix/main.cf:
           smtpd_client_restrictions =
               check_client_access hash:/etc/postfix/access

       /etc/postfix/access:
           1.2.3   REJECT
           1.2.3.4 OK

       Execute the command "postmap /etc/postfix/access" after editing the file.

BUGS
       The table format does not understand quoting conventions.

SEE ALSO
       postmap(1), Postfix lookup table manager
       smtpd(8), SMTP server
       postconf(5), configuration parameters
       transport(5), transport:nexthop syntax

README FILES
       Use "postconf readme_directory" or "postconf html_directory" to locate this information.
       SMTPD_ACCESS_README, built-in SMTP server access control
       DATABASE_README, Postfix lookup table overview

LICENSE
       The Secure Mailer license must be distributed with this software.

AUTHOR(S)
       Wietse Venema
       IBM T.J. Watson Research
       P.O. Box 704
       Yorktown Heights, NY 10598, USA

       Wietse Venema
       Google, Inc.
       111 8th Avenue
       New York, NY 10011, USA

                                                                                                        ACCESS(5)

Wir editieren nun aber nicht diese Vorlage- und Musterdatei /etc/postfix/access, sondern legen uns für die einzelnen Anwendungsfälle eigene Dateien an, auch wenn diese eventuell erst einmal ohne Inhalt sind. Wir haben so später kein Problem mehr, wenn wir ad hoc auf eine Anforderung schnell reagieren müssen.

Access-Aktionen

Bei den einzelnen folgenden Access-Tabellen stehen uns folgende Access-Aktionen zur Verfügung:

Steuerwort Ergebnis
OK Die Anfrage wird zugelassen
BCCuser@domäne.tld Sendet die empfangene eMail an einen gesonderten Empfänger als Blindcopy bcc
DEFER_IF_REJECT Wenn ein nachfolgender Test einen fatalen REJECT liefern würde, wird an den Client ein temporärer Fehler (4xx) signalisiert.
DEFER_IF_PERMIT Signalisiert an den Client einen temporären Fehler (4xx), obwohl die eMail sonst angenommen worden wäre.
DISCARD Die eMail wird für alle Empfänger verworfen, sobald nur ein einzelner Empfänger diesen DISCARD auslöst! Dem einliefernden Client wird eine erfolgreiche Zustellung signalisiert.
DUNNO Die Anfrage wird nicht abgelehnt, liefert jedoch auch kein ausdrückliches OK zurück. Die Access-Prüfung wird beendet - weitere Prüfungen können jedoch nich erfolgen.
FILTERnexthop Routet die eMail an nexthop und überschreibt dabei die Einstellung content_Filter
HOLD Nimmt die eMail entgegen und stellt diese in die hold-Queue
PREPENDMailheader:Wert Fügt in den Mailheader der eMail den Mailheader:Wert ein.
REDIRECTuser@domäne.tld Leitet die eMail an die neue eMail-Adresse um und verwirft dabei alle anderen angegebenen Empfänger!
REJECT Die Anfrage wird mit einem fatalen Fehlercode 5xx abgelehnt
REJECTHinweistext Die Anfrage wird abgelehnt und der Text Hinweistext ausgegeben
4xxHinweistext Die Anfrage wird mit einem temporären Fehlercode 4xx und dem Text Hinweistext abgelehnt
5xxHinweistext Die Anfrage wird mit einem fatalen Fehlercode 5xx und dem Text Hinweistext abgelehnt
WARNHinweistext Im Maillog des Mailservers wird ein Logeintrag mit den Informationen:
- Absender
- Empfänger
- HELO
- etc.
zusammen mit dem Hinweistext eingefügt.
restriction Es kommt eine der permit- oder reject-Restrictions-Regeln zur Anwendung

Access-Dateien

check_client_access
check_helo_access
check_recipient_access-rfc
check_recipient_access
check_sender_access

canonical

Lookup-Tabelle zum Umschreibungen von Absender und/oder Empfänger eMail-Adressen im SMTP-Envelop und im Header der eMail.

manpage

In der Manpage zu canonical bzw. in der Datei /etc/postfix/canonical finden wir detaillierte Informationen zur canonical - Postfix canonical table format.

 # man 5 canonical
CANONICAL(5)                                   File Formats Manual                                   CANONICAL(5)

NAME
       canonical - Postfix canonical table format

SYNOPSIS
       postmap /etc/postfix/canonical

       postmap -q "string" /etc/postfix/canonical

       postmap -q - /etc/postfix/canonical <inputfile

DESCRIPTION
       The  optional  canonical(5) table specifies an address mapping for local and non-local addresses. The map‐
       ping is used by the cleanup(8) daemon, before mail is stored into  the  queue.   The  address  mapping  is
       recursive.

       Normally,  the  canonical(5) table is specified as a text file that serves as input to the postmap(1) com‐
       mand.  The result, an indexed file in dbm or db format, is used for fast searching  by  the  mail  system.
       Execute  the command "postmap /etc/postfix/canonical" to rebuild an indexed file after changing the corre‐
       sponding text file.

       When the table is provided via other means such as NIS, LDAP or SQL, the same  lookups  are  done  as  for
       ordinary indexed files.

       Alternatively,  the  table can be provided as a regular-expression map where patterns are given as regular
       expressions, or lookups can be directed to TCP-based server. In those cases, the lookups  are  done  in  a
       slightly different way as described below under "REGULAR EXPRESSION TABLES" or "TCP-BASED TABLES".

       By  default  the  canonical(5)  mapping  affects both message header addresses (i.e. addresses that appear
       inside messages) and message envelope addresses (for example, the addresses that are used in SMTP protocol
       commands). This is controlled with the canonical_classes parameter.

       NOTE:  Postfix  versions 2.2 and later rewrite message headers from remote SMTP clients only if the client
       matches the local_header_rewrite_clients parameter, or if the  remote_header_rewrite_domain  configuration
       parameter  specifies  a non-empty value. To get the behavior before Postfix 2.2, specify "local_header_re‐
       write_clients = static:all".

       Typically, one would use the canonical(5) table to replace login names by Firstname.Lastname, or to  clean
       up addresses produced by legacy mail systems.

       The  canonical(5)  mapping  is  not  to  be confused with virtual alias support or with local aliasing. To
       change the destination but not the headers, use the virtual(5) or aliases(5) map instead.

CASE FOLDING
       The search string is folded to lowercase before database lookup. As of Postfix 2.3, the search  string  is
       not  case folded with database types such as regexp: or pcre: whose lookup fields can match both upper and
       lower case.

TABLE FORMAT
       The input format for the postmap(1) command is as follows:

       pattern address
              When pattern matches a mail address, replace it by the corresponding address.

       blank lines and comments
              Empty lines and whitespace-only lines are ignored, as are lines whose first non-whitespace  charac‐
              ter is a `#'.

       multi-line text
              A logical line starts with non-whitespace text. A line that starts with whitespace continues a log‐
              ical line.

TABLE SEARCH ORDER
       With lookups from indexed files such as DB or DBM, or from networked tables such as NIS, LDAP or SQL, each
       user@domain query produces a sequence of query patterns as described below.

       Each  query  pattern  is sent to each specified lookup table before trying the next query pattern, until a
       match is found.

       user@domain address
              Replace user@domain by address. This form has the highest precedence.

              This is useful to clean up addresses produced by legacy mail systems.  It can also be used to  pro‐
              duce Firstname.Lastname style addresses, but see below for a simpler solution.

       user address
              Replace  user@site  by  address when site is equal to $myorigin, when site is listed in $mydestina‐
              tion, or when it is listed in $inet_interfaces or $proxy_interfaces.

              This form is useful for replacing login names by Firstname.Lastname.

       @domain address
              Replace other addresses in domain by address.  This form has the lowest precedence.

              Note: @domain is a wild-card. When this form is applied to recipient addresses,  the  Postfix  SMTP
              server accepts mail for any recipient in domain, regardless of whether that recipient exists.  This
              may turn your mail system into a backscatter source: Postfix first accepts  mail  for  non-existent
              recipients  and  then  tries  to  return  that  mail  as "undeliverable" to the often forged sender
              address.

RESULT ADDRESS REWRITING
       The lookup result is subject to address rewriting:

       ·      When the result has the form @otherdomain, the result becomes the same user in otherdomain.

       ·      When "append_at_myorigin=yes", append "@$myorigin" to addresses without "@domain".

       ·      When "append_dot_mydomain=yes", append ".$mydomain" to addresses without ".domain".

ADDRESS EXTENSION
       When a mail address localpart contains the  optional  recipient  delimiter  (e.g.,  user+foo@domain),  the
       lookup order becomes: user+foo@domain, user@domain, user+foo, user, and @domain.

       The  propagate_unmatched_extensions  parameter  controls  whether an unmatched address extension (+foo) is
       propagated to the result of table lookup.

REGULAR EXPRESSION TABLES
       This section describes how the table lookups change when the table is given in the form of regular expres‐
       sions. For a description of regular expression lookup table syntax, see regexp_table(5) or pcre_table(5).

       Each  pattern  is  a  regular  expression  that  is  applied  to the entire address being looked up. Thus,
       user@domain mail addresses are not broken up into  their  user  and  @domain  constituent  parts,  nor  is
       user+foo broken up into user and foo.

       Patterns  are  applied  in  the order as specified in the table, until a pattern is found that matches the
       search string.

       Results are the same as with indexed file lookups, with the additional  feature  that  parenthesized  sub‐
       strings from the pattern can be interpolated as $1, $2 and so on.

TCP-BASED TABLES
       This section describes how the table lookups change when lookups are directed to a TCP-based server. For a
       description of the TCP client/server lookup protocol, see tcp_table(5).  This feature is not available  up
       to and including Postfix version 2.4.

       Each  lookup  operation  uses the entire address once.  Thus, user@domain mail addresses are not broken up
       into their user and @domain constituent parts, nor is user+foo broken up into user and foo.

       Results are the same as with indexed file lookups.

BUGS
       The table format does not understand quoting conventions.

CONFIGURATION PARAMETERS
       The following main.cf parameters are especially relevant.  The text below provides only a  parameter  sum‐
       mary. See postconf(5) for more details including examples.

       canonical_classes
              What addresses are subject to canonical address mapping.

       canonical_maps
              List of canonical mapping tables.

       recipient_canonical_maps
              Address mapping lookup table for envelope and header recipient addresses.

       sender_canonical_maps
              Address mapping lookup table for envelope and header sender addresses.

       propagate_unmatched_extensions
              A  list  of address rewriting or forwarding mechanisms that propagate an address extension from the
              original address to the result.  Specify zero  or  more  of  canonical,  virtual,  alias,  forward,
              include, or generic.

       Other parameters of interest:

       inet_interfaces
              The  network  interface  addresses  that  this system receives mail on.  You need to stop and start
              Postfix when this parameter changes.

       local_header_rewrite_clients
              Rewrite message header addresses in mail from these clients and update  incomplete  addresses  with
              the  domain name in $myorigin or $mydomain; either don't rewrite message headers from other clients
              at all, or rewrite message headers and update incomplete addresses with the domain specified in the
              remote_header_rewrite_domain parameter.

       proxy_interfaces
              Other  interfaces  that  this  machine  receives mail on by way of a proxy agent or network address
              translator.

       masquerade_classes
              List of address classes subject to masquerading: zero or more of envelope_sender,  envelope_recipi‐
              ent, header_sender, header_recipient.

       masquerade_domains
              List of domains that hide their subdomain structure.

       masquerade_exceptions
              List of user names that are not subject to address masquerading.

       mydestination
              List of domains that this mail system considers local.

       myorigin
              The domain that is appended to locally-posted mail.

       owner_request_special
              Give special treatment to owner-xxx and xxx-request addresses.

       remote_header_rewrite_domain
              Don't  rewrite  message headers from remote clients at all when this parameter is empty; otherwise,
              rewrite message headers and append the specified domain name to incomplete addresses.

SEE ALSO
       cleanup(8), canonicalize and enqueue mail
       postmap(1), Postfix lookup table manager
       postconf(5), configuration parameters
       virtual(5), virtual aliasing

README FILES
       Use "postconf readme_directory" or "postconf html_directory" to locate this information.
       DATABASE_README, Postfix lookup table overview
       ADDRESS_REWRITING_README, address rewriting guide

LICENSE
       The Secure Mailer license must be distributed with this software.

AUTHOR(S)
       Wietse Venema
       IBM T.J. Watson Research
       P.O. Box 704
       Yorktown Heights, NY 10598, USA

       Wietse Venema
       Google, Inc.
       111 8th Avenue
       New York, NY 10011, USA

                                                                                                     CANONICAL(5)

Auch hier editieren wir nicht die Vorlage- und Musterdatei /etc/postfix/canonical, sondern legen uns für die einzelnen Anwendungsfälle eigene Dateien an, auch wenn diese eventuell erst einmal ohne Inhalt sind. Wir haben so später kein Problem mehr, wenn wir ad hoc auf eine Anforderung schnell reagieren müssen.

Canonical-Dateien

sender_canonical_maps
recipient_canonical_maps

generic

Tabelle zum Umschreiben von eMailadressen. Im Gegensatz zu den beiden canonical-Maps, die die Adresse beim Empfang umschreibt, wird bei der generic-Tbelle die Adresse beim Versenden umgeschrieben.

manpage

In der Manpage zu generic bzw. in der Datei /etc/postfix/generic finden wir detaillierte Informationen zur generic - Postfix generic table format.

 # man 5 generic
GENERIC(5)                                     File Formats Manual                                     GENERIC(5)

NAME
       generic - Postfix generic table format

SYNOPSIS
       postmap /etc/postfix/generic

       postmap -q "string" /etc/postfix/generic

       postmap -q - /etc/postfix/generic <inputfile

DESCRIPTION
       The  optional  generic(5)  table specifies an address mapping that applies when mail is delivered. This is
       the opposite of canonical(5) mapping, which applies when mail is received.

       Typically, one would use the generic(5) table on a system that does not have a valid Internet domain  name
       and  that uses something like localdomain.local instead.  The generic(5) table is then used by the smtp(8)
       client to transform local mail addresses into valid Internet mail addresses  when  mail  has  to  be  sent
       across the Internet.  See the EXAMPLE section at the end of this document.

       The  generic(5) mapping affects both message header addresses (i.e. addresses that appear inside messages)
       and message envelope addresses (for example, the addresses that are used in SMTP protocol commands).

       Normally, the generic(5) table is specified as a text file that serves as input to the postmap(1) command.
       The  result,  an  indexed file in dbm or db format, is used for fast searching by the mail system. Execute
       the command "postmap /etc/postfix/generic" to rebuild an indexed file  after  changing  the  corresponding
       text file.

       When  the  table  is  provided  via other means such as NIS, LDAP or SQL, the same lookups are done as for
       ordinary indexed files.

       Alternatively, the table can be provided as a regular-expression map where patterns are given  as  regular
       expressions,  or  lookups  can  be  directed to TCP-based server. In those case, the lookups are done in a
       slightly different way as described below under "REGULAR EXPRESSION TABLES" or "TCP-BASED TABLES".

CASE FOLDING
       The search string is folded to lowercase before database lookup. As of Postfix 2.3, the search  string  is
       not  case folded with database types such as regexp: or pcre: whose lookup fields can match both upper and
       lower case.

TABLE FORMAT
       The input format for the postmap(1) command is as follows:

       pattern result
              When pattern matches a mail address, replace it by the corresponding result.

       blank lines and comments
              Empty lines and whitespace-only lines are ignored, as are lines whose first non-whitespace  charac‐
              ter is a `#'.

       multi-line text
              A logical line starts with non-whitespace text. A line that starts with whitespace continues a log‐
              ical line.

TABLE SEARCH ORDER
       With lookups from indexed files such as DB or DBM, or from networked tables such as NIS, LDAP or SQL, each
       user@domain query produces a sequence of query patterns as described below.

       Each  query  pattern  is sent to each specified lookup table before trying the next query pattern, until a
       match is found.

       user@domain address
              Replace user@domain by address. This form has the highest precedence.

       user address
              Replace user@site by address when site is equal to $myorigin, when site is  listed  in  $mydestina‐
              tion, or when it is listed in $inet_interfaces or $proxy_interfaces.

       @domain address
              Replace other addresses in domain by address.  This form has the lowest precedence.

RESULT ADDRESS REWRITING
       The lookup result is subject to address rewriting:

       ·      When the result has the form @otherdomain, the result becomes the same user in otherdomain.

       ·      When "append_at_myorigin=yes", append "@$myorigin" to addresses without "@domain".

       ·      When "append_dot_mydomain=yes", append ".$mydomain" to addresses without ".domain".

ADDRESS EXTENSION
       When  a  mail  address  localpart  contains  the optional recipient delimiter (e.g., user+foo@domain), the
       lookup order becomes: user+foo@domain, user@domain, user+foo, user, and @domain.

       The propagate_unmatched_extensions parameter controls whether an unmatched  address  extension  (+foo)  is
       propagated to the result of table lookup.

REGULAR EXPRESSION TABLES
       This section describes how the table lookups change when the table is given in the form of regular expres‐
       sions. For a description of regular expression lookup table syntax, see regexp_table(5) or pcre_table(5).

       Each pattern is a regular expression that is  applied  to  the  entire  address  being  looked  up.  Thus,
       user@domain  mail  addresses  are  not  broken  up  into  their user and @domain constituent parts, nor is
       user+foo broken up into user and foo.

       Patterns are applied in the order as specified in the table, until a pattern is  found  that  matches  the
       search string.

       Results  are  the  same  as with indexed file lookups, with the additional feature that parenthesized sub‐
       strings from the pattern can be interpolated as $1, $2 and so on.

TCP-BASED TABLES
       This section describes how the table lookups change when lookups are directed to a TCP-based server. For a
       description  of the TCP client/server lookup protocol, see tcp_table(5).  This feature is not available up
       to and including Postfix version 2.4.

       Each lookup operation uses the entire address once.  Thus, user@domain mail addresses are  not  broken  up
       into their user and @domain constituent parts, nor is user+foo broken up into user and foo.

       Results are the same as with indexed file lookups.

EXAMPLE
       The  following shows a generic mapping with an indexed file.  When mail is sent to a remote host via SMTP,
       this replaces his@localdomain.local by his ISP mail address, replaces  her@localdomain.local  by  her  ISP
       mail  address,  and replaces other local addresses by his ISP account, with an address extension of +local
       (this example assumes that the ISP supports "+" style address extensions).

       /etc/postfix/main.cf:
           smtp_generic_maps = hash:/etc/postfix/generic

       /etc/postfix/generic:
           his@localdomain.local   hisaccount@hisisp.example
           her@localdomain.local   heraccount@herisp.example
           @localdomain.local      hisaccount+local@hisisp.example

       Execute the command "postmap /etc/postfix/generic" whenever the table is changed.  Instead of  hash,  some
       systems  use  dbm  database  files. To find out what tables your system supports use the command "postconf
       -m".


BUGS
       The table format does not understand quoting conventions.

CONFIGURATION PARAMETERS
       The following main.cf parameters are especially relevant.  The text below provides only a  parameter  sum‐
       mary. See postconf(5) for more details including examples.

       smtp_generic_maps
              Address  mapping lookup table for envelope and header sender and recipient addresses while deliver‐
              ing mail via SMTP.

       propagate_unmatched_extensions
              A list of address rewriting or forwarding mechanisms that propagate an address extension  from  the
              original  address  to  the  result.   Specify  zero  or more of canonical, virtual, alias, forward,
              include, or generic.

       Other parameters of interest:

       inet_interfaces
              The network interface addresses that this system receives mail on.  You  need  to  stop  and  start
              Postfix when this parameter changes.

       proxy_interfaces
              Other  interfaces  that  this  machine  receives mail on by way of a proxy agent or network address
              translator.

       mydestination
              List of domains that this mail system considers local.

       myorigin
              The domain that is appended to locally-posted mail.

       owner_request_special
              Give special treatment to owner-xxx and xxx-request addresses.

SEE ALSO
       postmap(1), Postfix lookup table manager
       postconf(5), configuration parameters
       smtp(8), Postfix SMTP client

README FILES
       Use "postconf readme_directory" or "postconf html_directory" to locate this information.
       ADDRESS_REWRITING_README, address rewriting guide
       DATABASE_README, Postfix lookup table overview
       STANDARD_CONFIGURATION_README, configuration examples

LICENSE
       The Secure Mailer license must be distributed with this software.

HISTORY
       A genericstable feature appears in the Sendmail MTA.

       This feature is available in Postfix 2.2 and later.

AUTHOR(S)
       Wietse Venema
       IBM T.J. Watson Research
       P.O. Box 704
       Yorktown Heights, NY 10598, USA

       Wietse Venema
       Google, Inc.
       111 8th Avenue
       New York, NY 10011, USA

                                                                                                       GENERIC(5)

Auch hier editieren wir nicht diese Vorlage- und Musterdatei /etc/postfix/generic, sondern legen uns für die einzelnen Anwendungsfälle eigene Dateien an, auch wenn diese eventuell erst einmal ohne Inhalt sind. Wir haben so später kein Problem mehr, wenn wir ad hoc auf eine Anforderung schnell reagieren müssen.

generic-Dateien

lmtp_generic_maps
smtp_generic_maps

relocated

Lookup-Tabelle zum Aktivieren von „Bounce-Nachrichten“ an den Absender einer eMail über nicht existierende eMailadressen mit Angabe der neu zu nutzenden eMailadresse des Empfängers.

manpage

In der Manpage zu relocated bzw. in der Datei /etc/postfix/relocated finden wir detaillierte Informationen zur relocated - Postfix relocated table format.

 # man 5 relocated
RELOCATED(5)                                   File Formats Manual                                   RELOCATED(5)

NAME
       relocated - Postfix relocated table format

SYNOPSIS
       postmap /etc/postfix/relocated

DESCRIPTION
       The  optional relocated(5) table provides the information that is used in "user has moved to new_location"
       bounce messages.

       Normally, the relocated(5) table is specified as a text file that serves as input to the  postmap(1)  com‐
       mand.   The  result,  an  indexed file in dbm or db format, is used for fast searching by the mail system.
       Execute the command "postmap /etc/postfix/relocated" to rebuild an indexed file after changing the  corre‐
       sponding relocated table.

       When  the  table  is  provided  via other means such as NIS, LDAP or SQL, the same lookups are done as for
       ordinary indexed files.

       Alternatively, the table can be provided as a regular-expression map where patterns are given  as  regular
       expressions,  or  lookups  can  be  directed to TCP-based server. In those case, the lookups are done in a
       slightly different way as described below under "REGULAR EXPRESSION TABLES" or "TCP-BASED TABLES".

       Table lookups are case insensitive.

CASE FOLDING
       The search string is folded to lowercase before database lookup. As of Postfix 2.3, the search  string  is
       not  case folded with database types such as regexp: or pcre: whose lookup fields can match both upper and
       lower case.

TABLE FORMAT
       The input format for the postmap(1) command is as follows:

       ·      An entry has one of the following form:

                   pattern      new_location

              Where new_location specifies contact information such as an email  address,  or  perhaps  a  street
              address or telephone number.

       ·      Empty  lines and whitespace-only lines are ignored, as are lines whose first non-whitespace charac‐
              ter is a `#'.

       ·      A logical line starts with non-whitespace text. A line that starts with whitespace continues a log‐
              ical line.

TABLE SEARCH ORDER
       With lookups from indexed files such as DB or DBM, or from networked tables such as NIS, LDAP or SQL, pat‐
       terns are tried in the order as listed below:

       user@domain
              Matches user@domain. This form has precedence over all other forms.

       user   Matches user@site when site is $myorigin, when site is listed in $mydestination, or  when  site  is
              listed in $inet_interfaces or $proxy_interfaces.

       @domain
              Matches other addresses in domain. This form has the lowest precedence.

ADDRESS EXTENSION
       When  a  mail  address  localpart  contains  the optional recipient delimiter (e.g., user+foo@domain), the
       lookup order becomes: user+foo@domain, user@domain, user+foo, user, and @domain.

REGULAR EXPRESSION TABLES
       This section describes how the table lookups change when the table is given in the form of regular expres‐
       sions  or  when lookups are directed to a TCP-based server. For a description of regular expression lookup
       table syntax, see regexp_table(5) or pcre_table(5). For a  description  of  the  TCP  client/server  table
       lookup protocol, see tcp_table(5).  This feature is not available up to and including Postfix version 2.4.

       Each  pattern  is  a  regular  expression  that  is  applied  to the entire address being looked up. Thus,
       user@domain mail addresses are not broken up into  their  user  and  @domain  constituent  parts,  nor  is
       user+foo broken up into user and foo.

       Patterns  are  applied  in  the order as specified in the table, until a pattern is found that matches the
       search string.

       Results are the same as with indexed file lookups, with the additional  feature  that  parenthesized  sub‐
       strings from the pattern can be interpolated as $1, $2 and so on.

TCP-BASED TABLES
       This section describes how the table lookups change when lookups are directed to a TCP-based server. For a
       description of the TCP client/server lookup protocol, see tcp_table(5).  This feature is not available  up
       to and including Postfix version 2.4.

       Each  lookup  operation  uses the entire address once.  Thus, user@domain mail addresses are not broken up
       into their user and @domain constituent parts, nor is user+foo broken up into user and foo.

       Results are the same as with indexed file lookups.

BUGS
       The table format does not understand quoting conventions.

CONFIGURATION PARAMETERS
       The following main.cf parameters are especially relevant.  The text below provides only a  parameter  sum‐
       mary. See postconf(5) for more details including examples.

       relocated_maps
              List of lookup tables for relocated users or sites.

       Other parameters of interest:

       inet_interfaces
              The  network  interface  addresses  that  this system receives mail on.  You need to stop and start
              Postfix when this parameter changes.

       mydestination
              List of domains that this mail system considers local.

       myorigin
              The domain that is appended to locally-posted mail.

       proxy_interfaces
              Other interfaces that this machine receives mail on by way of a  proxy  agent  or  network  address
              translator.

SEE ALSO
       trivial-rewrite(8), address resolver
       postmap(1), Postfix lookup table manager
       postconf(5), configuration parameters

README FILES
       Use "postconf readme_directory" or "postconf html_directory" to locate this information.
       DATABASE_README, Postfix lookup table overview
       ADDRESS_REWRITING_README, address rewriting guide

LICENSE
       The Secure Mailer license must be distributed with this software.

              List of lookup tables for relocated users or sites.

       Other parameters of interest:

       inet_interfaces
              The  network  interface  addresses  that  this system receives mail on.  You need to stop and start
              Postfix when this parameter changes.

       mydestination
              List of domains that this mail system considers local.

       myorigin
              The domain that is appended to locally-posted mail.

       proxy_interfaces
              Other interfaces that this machine receives mail on by way of a  proxy  agent  or  network  address
              translator.

SEE ALSO
       trivial-rewrite(8), address resolver
       postmap(1), Postfix lookup table manager
       postconf(5), configuration parameters

README FILES
       Use "postconf readme_directory" or "postconf html_directory" to locate this information.
       DATABASE_README, Postfix lookup table overview
       ADDRESS_REWRITING_README, address rewriting guide

LICENSE
       The Secure Mailer license must be distributed with this software.

AUTHOR(S)
       Wietse Venema
       IBM T.J. Watson Research
       P.O. Box 704
       Yorktown Heights, NY 10598, USA

       Wietse Venema
       Google, Inc.
       111 8th Avenue
       New York, NY 10011, USA

                                                                                                     RELOCATED(5)

Wir editieren nun aber nicht diese Vorlage- und Musterdatei /etc/postfix/relocated, sondern legen uns eine eigene Dateien an, auch wenn diese eventuell erst einmal ohne Inhalt sind. Wir haben so später kein Problem mehr, wenn wir ad hoc auf eine Anforderung schnell reagieren müssen.

relocated-Datei

transport

Lookup-Tabelle zum Aktivieren einer alternativen Mailrouting bei der Zustellung an einen weiteren Mailserver.

manpage

In der Manpage zu transport bzw. in der Datei /etc/postfix/transport finden wir detaillierte Informationen zur transport - Postfix transport table format.

 # man 5 transport
TRANSPORT(5)                                   File Formats Manual                                   TRANSPORT(5)

NAME
       transport - Postfix transport table format

SYNOPSIS
       postmap /etc/postfix/transport

       postmap -q "string" /etc/postfix/transport

       postmap -q - /etc/postfix/transport <inputfile

DESCRIPTION
       The  optional  transport(5)  table specifies a mapping from email addresses to message delivery transports
       and next-hop destinations.  Message delivery transports such as local or smtp are defined in the master.cf
       file,  and  next-hop  destinations are typically hosts or domain names. The table is searched by the triv‐
       ial-rewrite(8) daemon.

       This mapping overrides the default transport:nexthop selection that is built into Postfix:

       local_transport (default: local:$myhostname)
              This is the default for final delivery to domains listed with mydestination,  and  for  [ipaddress]
              destinations  that  match $inet_interfaces or $proxy_interfaces. The default nexthop destination is
              the MTA hostname.

       virtual_transport (default: virtual:)
              This is the default for final delivery to domains listed with virtual_mailbox_domains. The  default
              nexthop destination is the recipient domain.

       relay_transport (default: relay:)
              This  is the default for remote delivery to domains listed with relay_domains. In order of decreas‐
              ing precedence, the nexthop destination  is  taken  from  relay_transport,  sender_dependent_relay‐
              host_maps, relayhost, or from the recipient domain.

       default_transport (default: smtp:)
              This  is the default for remote delivery to other destinations.  In order of decreasing precedence,
              the nexthop destination is taken from  sender_dependent_default_transport_maps,  default_transport,
              sender_dependent_relayhost_maps, relayhost, or from the recipient domain.

       Normally,  the  transport(5) table is specified as a text file that serves as input to the postmap(1) com‐
       mand.  The result, an indexed file in dbm or db format, is used for fast searching  by  the  mail  system.
       Execute  the command "postmap /etc/postfix/transport" to rebuild an indexed file after changing the corre‐
       sponding transport table.

       When the table is provided via other means such as NIS, LDAP or SQL, the same  lookups  are  done  as  for
       ordinary indexed files.

       Alternatively,  the  table can be provided as a regular-expression map where patterns are given as regular
       expressions, or lookups can be directed to TCP-based server. In those case, the  lookups  are  done  in  a
       slightly different way as described below under "REGULAR EXPRESSION TABLES" or "TCP-BASED TABLES".

CASE FOLDING
       The  search  string is folded to lowercase before database lookup. As of Postfix 2.3, the search string is
       not case folded with database types such as regexp: or pcre: whose lookup fields can match both upper  and
       lower case.

TABLE FORMAT
       The input format for the postmap(1) command is as follows:

       pattern result
              When pattern matches the recipient address or domain, use the corresponding result.

       blank lines and comments
              Empty  lines and whitespace-only lines are ignored, as are lines whose first non-whitespace charac‐
              ter is a `#'.

       multi-line text
              A logical line starts with non-whitespace text. A line that starts with whitespace continues a log‐
              ical line.

       The pattern specifies an email address, a domain name, or a domain name hierarchy, as described in section
       "TABLE LOOKUP".

       The result is of the form transport:nexthop and specifies how or where to deliver mail. This is  described
       in section "RESULT FORMAT".

TABLE SEARCH ORDER
       With lookups from indexed files such as DB or DBM, or from networked tables such as NIS, LDAP or SQL, pat‐
       terns are tried in the order as listed below:

       user+extension@domain transport:nexthop
              Deliver mail for user+extension@domain through transport to nexthop.

       user@domain transport:nexthop
              Deliver mail for user@domain through transport to nexthop.

       domain transport:nexthop
              Deliver mail for domain through transport to nexthop.

       .domain transport:nexthop
              Deliver mail for any subdomain of domain through transport to nexthop. This applies only  when  the
              string  transport_maps is not listed in the parent_domain_matches_subdomains configuration setting.
              Otherwise, a domain name matches itself and its subdomains.

       * transport:nexthop
              The special pattern * represents any address (i.e. it functions as the wild-card  pattern,  and  is
              unique to Postfix transport tables).

       Note  1:  the  null  recipient  address  is  looked  up  as $empty_address_recipient@$myhostname (default:
       mailer-daemon@hostname).

       Note 2: user@domain or user+extension@domain lookup is available in Postfix 2.0 and later.

RESULT FORMAT
       The lookup result is of the form transport:nexthop.  The transport field specifies a mail delivery  trans‐
       port such as smtp or local. The nexthop field specifies where and how to deliver mail.

       The  transport  field  specifies  the name of a mail delivery transport (the first name of a mail delivery
       service entry in the Postfix master.cf file).

       The interpretation of the nexthop field is transport dependent. In the case of SMTP, specify a service  on
       a  non-default  port  as  host:service,  and  disable  MX  (mail  exchanger)  DNS  lookups  with [host] or
       [host]:port. The [] form is required when you specify an IP address instead of a hostname.

       A null transport and null nexthop result means "do not change": use the  delivery  transport  and  nexthop
       information that would be used when the entire transport table did not exist.

       A  non-null  transport  field  with  a  null nexthop field resets the nexthop information to the recipient
       domain.

       A null transport field with non-null nexthop field does not modify the transport information.

EXAMPLES
       In order to deliver internal mail directly, while using a mail relay for all other mail,  specify  a  null
       entry  for  internal  destinations  (do  not change the delivery transport or the nexthop information) and
       specify a wildcard for all other destinations.

            my.domain    :
            .my.domain   :
            *            smtp:outbound-relay.my.domain

       In order to send mail for example.com and its subdomains via the uucp transport to  the  UUCP  host  named
       example:

            example.com      uucp:example
            .example.com     uucp:example

       When no nexthop host name is specified, the destination domain name is used instead. For example, the fol‐
       lowing directs mail for user@example.com via the slow transport to a mail exchanger for example.com.   The
       slow transport could be configured to run at most one delivery process at a time:

            example.com      slow:

       When  no  transport  is  specified,  Postfix uses the transport that matches the address domain class (see
       DESCRIPTION above).  The following sends all mail for example.com and its subdomains to host gateway.exam‐
       ple.com:

            example.com      :[gateway.example.com]
            .example.com     :[gateway.example.com]

       In  the  above example, the [] suppress MX lookups.  This prevents mail routing loops when your machine is
       primary MX host for example.com.

       In the case of delivery via SMTP, one may specify hostname:service instead of just a host:

            example.com      smtp:bar.example:2025

       This directs mail for user@example.com to host bar.example port 2025. Instead of a numerical port  a  sym‐
       bolic name may be used. Specify [] around the hostname if MX lookups must be disabled.

       The error mailer can be used to bounce mail:

            .example.com     error:mail for *.example.com is not deliverable

       This causes all mail for user@anything.example.com to be bounced.

REGULAR EXPRESSION TABLES
       This section describes how the table lookups change when the table is given in the form of regular expres‐
       sions. For a description of regular expression lookup table syntax, see regexp_table(5) or pcre_table(5).

       Each pattern is a regular expression that is  applied  to  the  entire  address  being  looked  up.  Thus,
       some.domain.hierarchy  is  not  looked  up  via  its  parent  domains, nor is user+foo@domain looked up as
       user@domain.

       Patterns are applied in the order as specified in the table, until a pattern is  found  that  matches  the
       search string.

       The  trivial-rewrite(8)  server disallows regular expression substitution of $1 etc. in regular expression
       lookup tables, because that could open a security hole (Postfix version 2.3 and later).

TCP-BASED TABLES
       This section describes how the table lookups change when lookups are directed to a TCP-based server. For a
       description  of the TCP client/server lookup protocol, see tcp_table(5).  This feature is not available up
       to and including Postfix version 2.4.

       Each lookup operation uses the entire recipient address once.  Thus, some.domain.hierarchy is  not  looked
       up via its parent domains, nor is user+foo@domain looked up as user@domain.

       Results are the same as with indexed file lookups.

CONFIGURATION PARAMETERS
       The  following  main.cf parameters are especially relevant.  The text below provides only a parameter sum‐
       mary. See postconf(5) for more details including examples.

       empty_address_recipient
              The address that is looked up instead of the null sender address.

       parent_domain_matches_subdomains
              List of Postfix features that use domain.tld  patterns  to  match  sub.domain.tld  (as  opposed  to
              requiring .domain.tld patterns).

       transport_maps
              List of transport lookup tables.

SEE ALSO
       trivial-rewrite(8), rewrite and resolve addresses
       master(5), master.cf file format
       postconf(5), configuration parameters
       postmap(1), Postfix lookup table manager

README FILES
       Use "postconf readme_directory" or "postconf html_directory" to locate this information.
       ADDRESS_REWRITING_README, address rewriting guide
       DATABASE_README, Postfix lookup table overview
       FILTER_README, external content filter

LICENSE
       The Secure Mailer license must be distributed with this software.

AUTHOR(S)
       Wietse Venema
       IBM T.J. Watson Research
       P.O. Box 704
       Yorktown Heights, NY 10598, USA

       Wietse Venema
       Google, Inc.
       111 8th Avenue
       New York, NY 10011, USA

                                                                                                     TRANSPORT(5)

transport-Datei

virtual

Lookup-Tabelle zum Verwalten der virtuellen Domains und virtuellen eMail-Adressen.

manpage

In der Manpage zu virtual bzw. in der Datei /etc/postfix/virtual finden wir detaillierte Informationen zur virtual - Postfix virtual alias table format.

 # man 5 transport
VIRTUAL(5)                                     File Formats Manual                                     VIRTUAL(5)

NAME
       virtual - Postfix virtual alias table format

SYNOPSIS
       postmap /etc/postfix/virtual

       postmap -q "string" /etc/postfix/virtual

       postmap -q - /etc/postfix/virtual <inputfile

DESCRIPTION
       The  optional  virtual(5)  alias  table  rewrites  recipient addresses for all local, all virtual, and all
       remote mail destinations.  This is unlike the aliases(5) table which is used only for  local(8)  delivery.
       Virtual aliasing is recursive, and is implemented by the Postfix cleanup(8) daemon before mail is queued.

       The main applications of virtual aliasing are:

       ·      To redirect mail for one address to one or more addresses.

       ·      To implement virtual alias domains where all addresses are aliased to addresses in other domains.

              Virtual  alias domains are not to be confused with the virtual mailbox domains that are implemented
              with the Postfix virtual(8) mail delivery agent.  With  virtual  mailbox  domains,  each  recipient
              address can have its own mailbox.

       Virtual  aliasing  is  applied  only to recipient envelope addresses, and does not affect message headers.
       Use canonical(5) mapping to rewrite header and envelope addresses in general.

       Normally, the virtual(5) alias table is specified as a text file that serves as input  to  the  postmap(1)
       command.   The result, an indexed file in dbm or db format, is used for fast searching by the mail system.
       Execute the command "postmap /etc/postfix/virtual" to rebuild an indexed file after  changing  the  corre‐
       sponding text file.

       When  the  table  is  provided  via other means such as NIS, LDAP or SQL, the same lookups are done as for
       ordinary indexed files.

       Alternatively, the table can be provided as a regular-expression map where patterns are given  as  regular
       expressions,  or  lookups  can  be  directed to TCP-based server. In those case, the lookups are done in a
       slightly different way as described below under "REGULAR EXPRESSION TABLES" or "TCP-BASED TABLES".

CASE FOLDING
       The search string is folded to lowercase before database lookup. As of Postfix 2.3, the search  string  is
       not  case folded with database types such as regexp: or pcre: whose lookup fields can match both upper and
       lower case.

TABLE FORMAT
       The input format for the postmap(1) command is as follows:

       pattern address, address, ...
              When pattern matches a mail address, replace it by the corresponding address.

       blank lines and comments
              Empty lines and whitespace-only lines are ignored, as are lines whose first non-whitespace  charac‐
              ter is a `#'.

       multi-line text
              A logical line starts with non-whitespace text. A line that starts with whitespace continues a log‐
              ical line.

TABLE SEARCH ORDER
       With lookups from indexed files such as DB or DBM, or from networked tables such as NIS, LDAP or SQL, each
       user@domain query produces a sequence of query patterns as described below.

       Each  query  pattern  is sent to each specified lookup table before trying the next query pattern, until a
       match is found.

       user@domain address, address, ...
              Redirect mail for user@domain to address.  This form has the highest precedence.

       user address, address, ...
              Redirect mail for user@site to address when site is equal to $myorigin,  when  site  is  listed  in
              $mydestination, or when it is listed in $inet_interfaces or $proxy_interfaces.

              This  functionality overlaps with functionality of the local aliases(5) database. The difference is
              that virtual(5) mapping can be applied to non-local addresses.

       @domain address, address, ...
              Redirect mail for other users in domain to address.  This form has the lowest precedence.

              Note: @domain is a wild-card. With this form, the Postfix SMTP server accepts mail for any  recipi‐
              ent  in domain, regardless of whether that recipient exists.  This may turn your mail system into a
              backscatter source: Postfix first accepts mail for non-existent recipients and then tries to return
              that mail as "undeliverable" to the often forged sender address.

RESULT ADDRESS REWRITING
       The lookup result is subject to address rewriting:

       ·      When  the  result has the form @otherdomain, the result becomes the same user in otherdomain.  This
              works only for the first address in a multi-address lookup result.

       ·      When "append_at_myorigin=yes", append "@$myorigin" to addresses without "@domain".

       ·      When "append_dot_mydomain=yes", append ".$mydomain" to addresses without ".domain".

ADDRESS EXTENSION
       When a mail address localpart contains the  optional  recipient  delimiter  (e.g.,  user+foo@domain),  the
       lookup order becomes: user+foo@domain, user@domain, user+foo, user, and @domain.

       The  propagate_unmatched_extensions  parameter  controls  whether an unmatched address extension (+foo) is
       propagated to the result of table lookup.

VIRTUAL ALIAS DOMAINS
       Besides virtual aliases, the virtual alias table can also be used to implement virtual alias domains. With
       a virtual alias domain, all recipient addresses are aliased to addresses in other domains.

       Virtual  alias  domains  are not to be confused with the virtual mailbox domains that are implemented with
       the Postfix virtual(8) mail delivery agent. With virtual mailbox domains, each recipient address can  have
       its own mailbox.

       With  a  virtual  alias  domain,  the virtual domain has its own user name space. Local (i.e. non-virtual)
       usernames are not visible in a virtual alias domain. In particular, local  aliases(5)  and  local  mailing
       lists are not visible as localname@virtual-alias.domain.

       Support for a virtual alias domain looks like:

       /etc/postfix/main.cf:
           virtual_alias_maps = hash:/etc/postfix/virtual

       Note:  some  systems  use  dbm databases instead of hash.  See the output from "postconf -m" for available
       database types.

       /etc/postfix/virtual:
           virtual-alias.domain    anything (right-hand content does not matter)
           postmaster@virtual-alias.domain postmaster
           user1@virtual-alias.domain      address1
           user2@virtual-alias.domain      address2, address3

       The virtual-alias.domain anything entry is required for a virtual alias domain. Without this  entry,  mail
       is rejected with "relay access denied", or bounces with "mail loops back to myself".

       Do  not  specify  virtual  alias  domain names in the main.cf mydestination or relay_domains configuration
       parameters.

       With a virtual alias domain, the Postfix SMTP server accepts mail for known-user@virtual-alias.domain, and
       rejects mail for unknown-user@virtual-alias.domain as undeliverable.

       Instead of specifying the virtual alias domain name via the virtual_alias_maps table, you may also specify
       it via the main.cf virtual_alias_domains configuration parameter.  This latter  parameter  uses  the  same
       syntax as the main.cf mydestination configuration parameter.

REGULAR EXPRESSION TABLES
       This section describes how the table lookups change when the table is given in the form of regular expres‐
       sions. For a description of regular expression lookup table syntax, see regexp_table(5) or pcre_table(5).

       Each pattern is a regular expression that is  applied  to  the  entire  address  being  looked  up.  Thus,
       user@domain  mail  addresses  are  not  broken  up  into  their user and @domain constituent parts, nor is
       user+foo broken up into user and foo.

       Patterns are applied in the order as specified in the table, until a pattern is  found  that  matches  the
       search string.

       Results  are  the  same  as with indexed file lookups, with the additional feature that parenthesized sub‐
       strings from the pattern can be interpolated as $1, $2 and so on.

TCP-BASED TABLES
       This section describes how the table lookups change when lookups are directed to a TCP-based server. For a
       description  of the TCP client/server lookup protocol, see tcp_table(5).  This feature is not available up
       to and including Postfix version 2.4.

       Each lookup operation uses the entire address once.  Thus, user@domain mail addresses are  not  broken  up
       into their user and @domain constituent parts, nor is user+foo broken up into user and foo.

       Results are the same as with indexed file lookups.

BUGS
       The table format does not understand quoting conventions.

CONFIGURATION PARAMETERS
       The  following  main.cf parameters are especially relevant to this topic. See the Postfix main.cf file for
       syntax details and for default values. Use the "postfix reload" command after a configuration change.

       virtual_alias_maps
              List of virtual aliasing tables.

       virtual_alias_domains
              List of virtual alias domains. This uses the same syntax as the mydestination parameter.

       propagate_unmatched_extensions
              A list of address rewriting or forwarding mechanisms that propagate an address extension  from  the
              original  address  to  the  result.   Specify  zero  or more of canonical, virtual, alias, forward,
              include, or generic.

       Other parameters of interest:

       inet_interfaces
              The network interface addresses that this system receives mail on.  You  need  to  stop  and  start
              Postfix when this parameter changes.

       mydestination
              List of domains that this mail system considers local.

       myorigin
              The domain that is appended to any address that does not have a domain.

       owner_request_special
              Give special treatment to owner-xxx and xxx-request addresses.

       proxy_interfaces
              Other  interfaces  that  this  machine  receives mail on by way of a proxy agent or network address
              translator.

SEE ALSO
       cleanup(8), canonicalize and enqueue mail
       postmap(1), Postfix lookup table manager
       postconf(5), configuration parameters
       canonical(5), canonical address mapping

README FILES
       Use "postconf readme_directory" or "postconf html_directory" to locate this information.
       ADDRESS_REWRITING_README, address rewriting guide
       DATABASE_README, Postfix lookup table overview
       VIRTUAL_README, domain hosting guide

LICENSE
       The Secure Mailer license must be distributed with this software.

AUTHOR(S)
       Wietse Venema
       IBM T.J. Watson Research
       P.O. Box 704
       Yorktown Heights, NY 10598, USA

       Wietse Venema
       Google, Inc.
       111 8th Avenue
       New York, NY 10011, USA

                                                                                                       VIRTUAL(5)

virtual-Dateien

virtual_alias_domains

virtual_alias files in Verbindung mit postfixadmin

Verwalten wir die Domänen und Nutzerkonten mit Hilfe von Postfixadmin, werden wir nachfolgend in unsere Postfix-Konfigurationsdatei /etc/postfix/main.cf folgenden Block einfügen.

# Django : 2014-10-15 - virtuelle Mail-Domains und Mailboxen mit Anbindung an
#          das mySQL-Datenbankbackend (Verwaltung mit Hilfe von postfixadmin)
# default: virtual_mailbox_domains = $virtual_mailbox_maps
#          virtual_alias_maps = $virtual_maps
#          virtual_mailbox_maps =
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
 
virtual_alias_maps =      proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
                          proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf
                          proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf
 
virtual_mailbox_maps =    proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
                          proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf

Die zugehörigen Dateien, haben dann folgende Inhalte.

mysql_virtual_domains_maps.cf
 # vim /etc/postfix/mysql_virtual_domains_maps.cf
/etc/postfix/mysql_virtual_domains_maps.cf
# Django : 2019-01-27
# Definition der Datenbankanbindung zur Abfrage der virtuellen Domaenen
#
user = postfix_user
password = rbgsDK39DeM2b2btx9iMHfzd
hosts = mariadb.dmz.nausch.org
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
mysql_virtual_alias_maps.cf
 # vim /etc/postfix/mysql_virtual_alias_maps.cf
/etc/postfix/mysql_virtual_alias_maps.cf
# Django : 2019-01-27
# Definition der Datenbankanbindung zur Abfrage der virtual Alias Maps
#
user = postfix_user
password = rbgsDK39DeM2b2btx9iMHfzd
hosts = mariadb.dmz.nausch.org
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
mysql_virtual_alias_domain_maps.cf
 # vim /etc/postfix/mysql_virtual_alias_domain_maps.cf
/etc/postfix/mysql_virtual_alias_domain_maps.cf
# Django : 2019-01-27
# Definition der Datenbankanbindung zur Abfrage der virtual Alias Domain Maps
#
user = postfix_user
password = rbgsDK39DeM2b2btx9iMHfzd
hosts = mariadb.dmz.nausch.org
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' AND
           alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1
           AND alias_domain.active='1'
mysql_virtual_alias_domain_catchall_maps.cf
 # vim /etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf
/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf
# Django : 2019-01-27
# Definition der Datenbankanbindung zur Abfrage der virtual Alias Domain Catchall Maps
#
user = postfix_user
password = rbgsDK39DeM2b2btx9iMHfzd
hosts = mariadb.dmz.nausch.org
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' AND
           alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1
           AND alias_domain.active='1'
mysql_virtual_mailbox_maps.cf
 # vim /etc/postfix/mysql_virtual_mailbox_maps.cf
/etc/postfix/mysql_virtual_mailbox_maps.cf
# Django : 2019-01-27
# Definition der Datenbankanbindung zur Abfrage der virtual Mailbox Maps
#
user = postfix_user
password = rbgsDK39DeM2b2btx9iMHfzd
hosts = mariadb.dmz.nausch.org
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
mysql_virtual_alias_domain_mailbox_maps.cf
 # vim /etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf
/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf
# Django : 2019-01-27
# Definition der Datenbankanbindung zur Abfrage der virtual Alias Domain Mailbox Maps
#
user = postfix_user
password = rbgsDK39DeM2b2btx9iMHfzd
hosts = mariadb.dmz.nausch.org
dbname = postfix
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d'
           AND mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND
           mailbox.active = 1 AND alias_domain.active='1'

bcc

Ergänzend zu den aus dem RPM enthaltenen Loogup_Tabellen, legen wir uns noch zwei weitere Tabellen an, nämlich die recipient_bcc_maps und die sender_bcc_maps.

bcc-Dateien

recipient_bcc_maps

main.cf

In der Sektion LOOKUP-TABELLEN definieren wir nun die zuvor vorgestellten Lookup-Tabellen in der Hauptkonfigurationsdatei main.cf.

 # vim /etc/postfix/main.cf
################################################################################
## LOOKUP-TABELLEN
#
# Django : 2019-01-27 - default Datenbank Typ für die Befehle newaliases, 
#          postalias und postmap auf das performantere btree umgestellt.
# default default_database_type = hash
default_database_type = btree
 
# Django : 2019-01-27 - Trennzeichen zwischen Usernamen und Adresserweiterung 
# default: recipient_delimiter =
recipient_delimiter = +
 
# Django : 2019-01-27 - Alias-Tabelle für die Zustellung von lokalen Nachrichten
#          durch den MDA (Mail Delivery Agent) "local". Nach Änderungen an der
#          Tabelle /etc/aliases ist "newaliases" zum Neubau des Datenbankfiles
#          notwendig!
# default: alias_maps = hash:/etc/aliases, nis:mail.aliase
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
 
# Django : 2019-01-27 - Optionale Lookup Tabelle mit allen gültigen Empfängern
#          der in $relay_domains aufgeführten Domains
# default: relay_recipient_maps =
relay_recipient_maps =
#                         btree:/etc/mailman/virtual-mailman
#                         btree:/etc/mailman/roleaccounts 
 
# Django : 2019-01-27 - virtuelle Mail-Domains und Mailboxen mit Anbindung an
#          das mySQL-Datenbankbackend (Verwaltung mit Hilfe von postfixadmin)
# default: virtual_mailbox_domains = $virtual_mailbox_maps
#          virtual_alias_maps = $virtual_maps
#          virtual_mailbox_maps =
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
 
virtual_alias_maps =      proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
                          proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf
                          proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf
 
virtual_mailbox_maps =    proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
                          proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf
 
# Django : 2019-01-27 - BCC-Adress Lookup Tabelle mit deren Hilfe Nachrichten 
#          einzelner oder mehrerer Empfänger automatisch an einen weiteren 
#          Empfänger geschickt werden.
# default: recipient_bcc_maps = 
recipient_bcc_maps = btree:/etc/postfix/recipient_bcc_maps
 
# Django : 2019-01-27 - BCC-Adress Lookup Tabelle mit deren Hilfe Nachrichten 
#          einzelner oder mehrerer Absender automatisch an einen weiteren 
#          Empfänger geschickt werden.
sender_bcc_maps = btree:/etc/postfix/sender_bcc_maps
 
# Django : 2019-01-27 - SMTP Lookup Tabelle mit deren Hilfe eMail-Adressen der
#          Empfänger im SMTP-Envelope und im Header der eMail beim Verlassen
#          des MTA via SMTP umgeschrieben werden können.
# default: smtp_generic_maps =   
smtp_generic_maps = btree:/etc/postfix/smtp_generic_maps
 
# Django : 2019-01-27 - LMTP Lookup Tabelle mit deren Hilfe eMail-Adressen der
#          Empfänger im SMTP-Envelope und im Header der eMail beim Verlassen
#          des MTA zum MDA via LMTP umgeschrieben werden können.
# default: smtp_generic_maps =   
lmtp_generic_maps = btree:/etc/postfix/lmtp_generic_maps
 
# Django : 2019-01-27 - Lookup-Tabelle zum Umschreibungen von Absender-eMail-
#          -Adressen im SMTP-Envelop und/oder im Header der eMail. 
# default: sender_canonical_maps = 
sender_canonical_maps = btree:/etc/postfix/sender_canonical_maps
#                       SRS - Sender Rewriting Scheme mit postsrsd 
#                       tcp:127.0.0.1:10001
#          Definition welche Adressen umgeschrieben werden sollen
# default: sender_canonical_classes = envelope_sender, header_sender 
sender_canonical_classes = envelope_sender
 
# Django : 2019-01-27 - Lookup-Tabelle zum Umschreibungen von Empfänger-eMail-
#          -Adressen im SMTP-Envelop und/oder im Header der eMail.
# default: recipient_canonical_maps =
recipient_canonical_maps = btree:/etc/postfix/recipient_canonical_maps
#                       SRS - Sender Rewriting Scheme mit postsrsd
#                       tcp:127.0.0.1:10002
#          Definition welche Adressen umgeschrieben werden sollen
# default: recipient_canonical_classes = envelope_recipient, header_recipient 
recipient_canonical_classes = envelope_recipient
 
# Django : 2019-01-27 - Lookup-Tabelle zum Aktivieren von "Bounce-Nachrichten"
#          an den Absender einer eMail über nicht existierende eMail-Adressen 
#          mit Angabe der neu zu nutzenden eMailadresse des Empfängers.
# default: relocated_maps = 
relocated_maps = btree:/etc/postfix/relocated_maps
 
# Django : 2019-01-27 - Ergebnisse der Adress-Verification cachen
#          Kapitel 12.2.2 Dynamische Empfänger-Verifizierung
#          Kapitel 9.5.5 envelope sender überprüfen
# default: address_verify_map = btree:$data_directory/verify_cache

Die Installation und Konfiguration des in diesem Codeabschnitt enthaltenen SRS-Daemon findest sich im Kapitel SRS - Sender Rewriting Scheme unter CentOS 7.x.

Absicherung mit Hilfe von Restrictions

Bevor wir uns nun tiefer in die einzelnen Restrictions eintauchen machen wir uns mit den Grundlagen vertraut.

Permit-Regeln

Reject-Regeln

SMTP Recipient Restrictions

Nachfolgende Definitionen fügen wir nun am Ende der /etc/postfix/main.cf ein. Hierzu benutzen wir wie immer den Editor unserer Wahl.

 # vim /etc/postfix/main.cf
################################################################################
## SMTP RECIPIENT RESTRICTIONS
#
# Django : 2019-01-27 - Schutz unserer Empfänger mit Hilfe der Recipient 
#          Restrictions 
# default: smtpd_recipient_restrictions =
smtpd_recipient_restrictions =
#          Postmaster, abuse und andere aufgaben- oder funktionsgebundene 
#          eMail-Adressen (Role-Accounts) whitelisten
           check_recipient_access btree:/etc/postfix/access_recipient-rfc

#          Black- und Whitelisting       (Kapitel 8.2.3 White- und Blacklisting)
           check_client_access cidr:/etc/postfix/access_client
           check_helo_access btree:/etc/postfix/access_helo
           check_sender_access btree:/etc/postfix/access_sender
           check_recipient_access btree:/etc/postfix/access_recipient

#          Unsere eigenen Nutzer zulassen-/erlauben             
#                                (Kapitel 8.2.2 Relaying erlauben und verbieten)
           permit_sasl_authenticated
           permit_mynetworks

#          RBL überprüfen               (Kapitel 10.11 Realtime Blackhole Lists)
           reject_rbl_client zen.spamhaus.org
           reject_rbl_client ix.dnsbl.manitu.net
           reject_rbl_client bl.spamcop.net
           reject_rhsbl_client multi.uribl.com

#          Greylisting via postgrey checken via Unix-Socket
#                                          (Kapitel 9.2.5 postgrey installieren)
#          check_policy_service unix:postgrey/socket,

#          Policyd-Weight check over TCP-Connection 
#                                      (Kapitel 9.3 policyd-weight installieren)
#          check_client_access btree:/etc/postfix/policyd_weight_client_whitelist,
#          check_policy_service inet:127.0.0.1:12525,

#          Dynamische Prüfung auf existente Relay-Empfänger
#                            (Kapitel 12.2.2 Dynamische Empfänger-Verifizierung)
           reject_unverified_recipient

#          Backupserver (MX) erlauben
#          permit_mx_backup

#          alles andere an relaying verbieten   
#                                (Kapitel 8.2.2 Relaying erlauben und verbieten)
           reject_unauth_destination

#          Quota-Status-Policy-Daemon am Dovecot-Backend-System
#          Dovecotbuch (ISBN 978-3-95539-74-7) Seite 219 ff.  
#                          (Kapitel 11.11 "Der Quota-Policy-Server für Postfix")
           check_policy_service inet:10.0.0.77:10000

#          Zu guter Letzt alles durchlassen, was bis jetzt noch nicht 
#          beanstandet wurde
           permit

SMTP Relay Restrictions

Nachfolgende Definitionen fügen wir nun am Ende der /etc/postfix/main.cf ein.

 # vim /etc/postfix/main.cf
################################################################################
## SMTP RELAY RESTRICTIONS
#
# Django : 2019-01-27 - Definition, wer über unseren MX relayen darf oder nicht. 
#          http://www.postfix.org/postconf.5.html#smtpd_relay_restrictions
# default: smtpd_relay_restrictions = permit_mynetworks, 
#          permit_sasl_authenticated, defer_unauth_destination
#
smtpd_relay_restrictions =
# Unsere eigenen Nutzer zulassen-/erlauben
           permit_sasl_authenticated
           permit_mynetworks
# Backupserver (MX) erlauben
#           permit_mx_backup
# alles andere an relaying verbieten, d.h. mit einem finalen error 550 abweisen
           reject_unauth_destination

main.cf

Somit ergibt sich vorerst folgende Hauptkonfigurationsdatei /etc/postfix/main.cf.

 # less /etc/postfix/main.cf
/etc/postfix/main.cf
################################################################################
#                                                                              #
#    Django : 2019-01-27 - Musterkonfiguration Postfix 3.x unter CentOS 7      #
#                                                                              #
################################################################################
 
################################################################################
## INSTALLATIONS-KONFIGURATIONS INFORMATIONEN 
#
# Der Kopatibilitäts Level definiert, welche Standardeinstellungen Postfix für 
# die Einstellungen main.cf und master.cf verwendet. Diese Standardeinstellungen 
# werden sich im Laufe der Zeit voraussichtlich ändern!
#
# Damit die Lauffähigkeit des Postfix-Daemon nicht gefährdet wird der Daemon
# rückwärtskompatible Standardeinstellungen verwenden und dies auch entsprechend
# protokollieren. So kann bei einer Migration definiert werden,  ob rückwärts-
# kompatible Standardeinstellungen in main.cf oder master.cf dauerhaft 
# vorgenommen werden müssen.
#
# Nach erfolgter Überprüfung ist der compatibility_level, wie in der Datei 
# /usr/share/doc/postfix-3.*/README_FILES/RELEASE_NOTES 
# empfohlen, entsprechend anzupassen.
#
# Django : 2019-01-27 - Kompatibilitäts-Level der Postfix 3 Installation
#          Standardwert 2 definiert eine Neuinstalltion und kein (!) Upgrade.
# default: compatibility_level = 2
compatibility_level = 2
 
# Folgende Default-Parameter werden benutzt, sobald eine neue Postfix-Version 
# installiert wird.
#
# Django : 2019-01-27 - Vollständiger Pfad zum Postfix sendmail Programm, dem
#          zu senmail kompatiblen sendmail Befehl.
# default: sendmail_path = /usr/sbin/sendmail
sendmail_path = /usr/sbin/sendmail.postfix
 
# Django : 2019-01-27 - Vollständiger Pfad zum Postfix newaliases Programm, dem
#          zu sendmail kompatiblen Programm zum Anlegen der Alias Datenbanken.
# default: newaliases_path = /usr/bin/newaliases
newaliases_path = /usr/bin/newaliases.postfix
 
# Django : 2019-01-27 - Vollständiger Pfad zum Postfix qmail-Programm, dem zu
#          sendmail kompatiblen Programm zum Anzeigen der Maile-Queues
# default: mailq_path = /usr/bin/mailq
mailq_path = /usr/bin/mailq.postfix
 
# Django : 2019-01-27 - Gruppe für die Befehle mail submission und queue
#          management. Die Gruppe muss eine numerische eigene ID haben
#          und darf nicht mit anderen Benutzeraccounts geteilt werden,
#          auch nicht mit dem Postfix User! 
# default: setgid_group = postdrop 
setgid_group = postdrop
 
# Django : 2019-01-27 - Pfad für die Postfix Postfix HTML Dokumentation.
# default: html_directory
html_directory = no
 
# Django : 2019-01-27 - Pfad für die Postfix online man-pages.
# default: manpage_directory = /usr/local/man
manpage_directory = /usr/share/man
 
# Django : 2019-01-27 - Pfadangabe für die Postfix Beispielkonfigurationsdateien.
#          Dieser Parameter ist obsolete seit Postfix 2.1.
# default: sample_directory = /etc/postfix
sample_directory = /usr/share/doc/postfix-3.3.2/samples
 
# Django : 2019-01-27 - Pfadangabe für die Postfix README Dateien.
# default: readme_directory = no
readme_directory = /usr/share/doc/postfix-3.3.2/README_FILES
 
# Django : 2019-01-27 - Pfadangabe für das Postfix Metadirectory
# default: meta_directory = /etc/postfix
meta_directory = /etc/postfix
 
# Django : 2019-01-27 - Pfadangabe für das SHLIB-Verzeichnis
# default: shlib_directory = /usr/lib/postfix
shlib_directory = /usr/lib/postfix
 
 
################################################################################
## PFADANGABEN DER LOKALEN INSTALLATION
#
# Django : 2019-01-27 - Definition des Speicherortes für die Queue-Dateien von
#          Postfix. Dies ist auch der root-Pfad, falls Postfix in einer
#          chroot-Umgebung laufen sollte. In der Datei examples/chroot-setup
#          findet man bei Bedarf nützliche Hinweise und Beispiele, die 
#          beschreiben, wie man Postfix in einer chroot-Umgebung aufsetzen und 
#          betreiben kann. 
# default: queue_directory = /var/spool/postfix
queue_directory = /var/spool/postfix
 
# Django : 2019-01-27 - Vollständiger Pfad zu allen postXXX-Programmen.
# default: command_directory = /usr/sbin
command_directory = /usr/sbin
 
# Django : 2019-01-27 Vollständiger Pfad zum Verzeichnis, in dem sich alle
#          postfix Daemon Programme (die z.B. auch in der master.cf
#          aufgeführt sind) befinden. Das Verzeichnis muss root gehören!
# default: daemon_directory = /usr/libexec/postfix
daemon_directory = /usr/libexec/postfix
 
# Django : 2019-01-27 - Datenverzeichnis, in dem Postfix alle variablen Daten
#          ablegt, wie z.B. Caches, Zufallszahlen ect. pp. Das Verzeichnis 
#          muss dem nachfolgendem "mail_owner" gehören!
# default: data_directory = /var/lib/postfix
data_directory = /var/lib/postfix
 
 
################################################################################
## RECHTE BEI QUEUES UND PROZESSEN
#
# Django : 2019-01-27 - Definition des Nutzers, unter dem die meisten Postfix
#          Daemons laufen und mit dem die Queue-Dateien geschrieben werden.
#          Die User muss unique sein, d.h. er darf weder einer anderen Gruppe 
#          noch einem Anderen User angehören, sowie fremde Dateirechte und 
#          Prozesse auf dem System besitzen! Also unbedingt einen separaten 
#          Nutzer verwenden! 
# default: mail_owner = postfix
mail_owner = postfix
 
# Django : 2019-01-27 - Festlegung der Defaultrechte, die vom LDA (Local 
#          Delivery Agent) verwendet werden, wenn dieser Nachrichten in eine 
#          externe Datei schreibt, oder einem anderen Befehl übergibt.
#          Der Parameter wird auch verwendet, sollten keine userbezogenen
#          Vorgaben vorhanden sein. 
#          Auf keinen Fall einen privilegierten Nutzer oder gar den Benutzer
#          postfix verwenden!
# default: default_privs = nobody
default_privs = nobody
 
 
################################################################################
## DEBUGGING 
#
# Django : 2019-01-27 - Mit dem Parameter "debug_peer_level" wird festgelegt
#          um welchen Faktor der Logging-Level erhöht wird, wenn ein SMTP 
#          Client, ein Hostname oder eine IP-Adresse zu den Definitionen des
#          nachfolgenden "debug_peer_list"-Parameters passt.
# default: debug_peer_level = 2
debug_peer_level = 2
 
# Django : 2019-01-27 : Definition einer Liste aus Netzwerk-Adressen,
#          Namen, IP-Adressen oder entsprechender Postfix-Listen 
#          "type:name", für die der Loglevel gemäß dem obigen Loglevelwert
#          erhöht werden soll.
#          Bsp: debug_peer_list = 127.0.0.1
#               debug_peer_list = some.domain
#               cidr:/etc/postfix/debug_peer_list
# default: debug_peer_list =
 
# Django : 2019-01-27 - Debugger-Befehlszeile
#          Die Option "debugger_command" definiert den kompletten Debug-Aufruf,
#          das ausgeführt werden soll, sofern der Postfix Daemon mit der 
#          Option -D gestartet wurde.
#          Am Ende der Befehlskette sollte man ein "... & sleep 5" anfügen, 
#          damit damit der Debugger genügend Zeit hat loszulegen, bevor das 
#          Programm aufgerufen wird.
#
#          Da wir kein X-System auf unserem Mailserver installiert haben (wozu 
#          auch?), verwenden wir nachfolgendes Beispiel. Als Ergebnis erhalten 
#          wir damit eine Datei mit dem Namen des Prozesses und der zugehörigen 
#          ID, die im Konfigurationsverzeichnis abgespeichert wird.
#
debugger_command =
           PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont;
           echo where) | gdb $daemon_directory/$process_name $process_id 2>&1
           >$config_directory/$process_name.$process_id.log & sleep 5
 
 
################################################################################
## ZUSTÄNDIGKEITEN, VERTRAUENSWÜRDIGE NETZE UND NETZWERKK-DEFINITIONEN
#
# Django : 2019-01-27 - Hostname auf "offiziellen" DNS-MX-Record Namen gesetzt
# default: myhostname = FQDN
myhostname = mx1.nausch.org
 
# Django : 2019-01-27 - Domainpart der lokal generierten Nachrichten gesetzt
# default: myorigin = $myhostname
myorigin = $mydomain
 
# Django : 2019-01-27 - Für welche Domains ist unser Mailserver zuständig,
#          also final destination? Zusätzlich zu den Defaultwerten soll der MTA 
#          auch noch Nachrichten für die beiden Sub-Domains lists.nausch.org 
#          (Mailman) und dmarc.nausch.org (DMARC-Reportmails) annehmen.
# default: mydestination = $myhostname, localhost.$mydomain, localhost
mydestination =
                $myhostname
                localhost.$mydomain
                localhost
                lists.nausch.org
                dmarc.nausch.org
 
# Django : 2019-01-27 - Ablehnung unbekannter Empfänger sollen abgewiesen und
#          nicht mit einem temporären Fehler 450 abgewiesen werden.
# default: unknown_local_recipient_reject_code = 550
#          unverified_recipient_reject_code = 450
unverified_recipient_reject_code = 577
 
# Django : 2019-01-27 - Soll bei einem unbekanntem Ziel der genaue Tabellenname
#          bei der Ablehnung genannt werden?
# default: show_user_unknown_table_name = yes 
show_user_unknown_table_name = no
 
# Django : 2019-01-27 - auf allen Interfaces und Protokollen (IPv4 und IPv6) 
#          soll gelauscht werden 
# default: inet_interfaces = all
# default: inet_protocols = all
 
# Django : 2019-01-27 - Grundsätzlich soll erst einmal unser Mailserver nur dem
#          eigenen Host trauen, sonst niemanden! 
# default: mynetworks_style = subnet
mynetworks_style = host
 
mynetworks =
                127.0.0.0/8
                [::1]/128
                10.0.0.0/24
                10.0.10.0/25
 
# Django : 2019-01-27 - Backup-Mailserver explizit erlauben
# default: permit_mx_backup_networks =
permit_mx_backup_networks = 88.217.171.167/32
 
 
###############################################################################
## ROUTING - WEITERLEITEN VON NACHRICHTEN AN DAS EIGENTLICHE ZIEL
#
# Django : 2019-01-27 - Relayhost: Alle Nachrichten werden an den Relayhost
#          smtp-out.dmz.nausch.org gesendet.
# default: relayhost =
# relayhost = [smtp-out.dmz.nausch.org]
 
# Django : 2019-01-27 - Backup-Relayhost: Sollte der $relayhost nicht erreichbar
#          sein, soll sich unser MTA an den backup-relayhost 
#          smtp-backup.dmz.nausch.org senden
# default: smtp_fallback_relay = $fallback_relay 
# smtp_fallback_relay = [smtp-backup.dmz.nausch.org]
 
# Django : 2019-01-27 - Relay Domains: Postfix als eingehendes Mailrelay vor 
#          einem anderen Server
# default: relay_domains = $mydestination 
relay_domains = btree:/etc/postfix/relay_domains
 
# Django : 2019-01-27 - Nachrichten für eine bestimmte Richtung sollen
#          abweichend von den MX-Definitionen im DNS an dedizierte Ziele
#          geroutet/weitergeleitet werden.
# default: transport_maps =
transport_maps = btree:/etc/postfix/transport_maps
 
# Django : 2019-01-27 - Definition zur Erreichbarkeit unseres MDA-Servers 
#          Dovecot-IMAP
# default: virtual_transport = virtual
virtual_transport = lmtp:[imap.dmz.nausch.org]:24
 
 
################################################################################
## QUEUEING-VERHALTEN
#
# Django : 2019-01-27 - Queue-Lifetime auf 3 Tage heruntersetzen, defininiert
#          die maximale Zeit, die der MX versuchen darf, eine Nachricht zuzu-
#          stellen
# default: maximal_queue_lifetime = 5d
maximal_queue_lifetime = 3d
 
# Django : 2019-01-27- Bounce-Queue-Lifetime auf 3 Tage heruntersetzen, die
#          der MTA versuchen soll eine Bouncenachricht zuzustellen.
# default: bounce_queue_lifetime = 5d
bounce_queue_lifetime = 3d
 
 
################################################################################
## NACHRICHTENGROESSE UND ZUSTELLVERSUCHE/-MENGEN 
#
# Django : 2019-01-27 Maximale Nachrichtengröße festlegen. Maximale Nachrichten-
#          größe einer Nachricht incl. der Headerinformationen darf maximal 
#          50 MB ( 52428800 = 50*1024*1024 ) betragen, darüber verweigert 
#          Postfix die Annahme. 
# default: message_size_limit = 10240000
message_size_limit = 52428800
 
# Django : 2019-01-27 Maximale Mailboxgröße einer einzelnen Mailbox bzw. 
#          Maildir-Files. Der Wert darf nicht kleiner als die maximale 
#          Nachrichtengröße (message_size_limit) sein.
# default: mailbox_size_limit = 10240000
mailbox_size_limit = 52428800
 
# Django : 2019-01-27 - Rate Limiting (DOS-Attacken verhindern) maximale
#          Zustellung limitieren (Kapitel 24 des Buches Postfix)
#          (Kapitel 13.14 Rate-Limiting gegenüber Clients durchsetzen)
#          Basiszeiteinheit für die Kalkulation der rate-limits
# default: anvil_rate_time_unit = 60s
#
#          Maximale Anzahl gleichzeitiger Verbindungen pro einliefernenden Host
# default : smtpd_client_connection_count_limit = 50 
smtpd_client_connection_count_limit = 20
#
#          Maximale Anzahl von Verbindungsversuchen je definierter Zeiteinheit 
#          (anvil_rate_time_unit) pro einliefernden Host
# default: smtpd_client_connection_rate_limit = 0
smtpd_client_connection_rate_limit = 20
#
#          Maximale Anzahl von erlaubten Empfänger Adressen je definierter 
#          Zeiteinheit (anvil_rate_time_unit) pro einliefernden Host
# default: smtpd_client_recipient_rate_limit = 0
smtpd_client_recipient_rate_limit = 50
#
#          Maximale Anzahl von erlaubten Anzahl von eMails je definierter Zeit-
#          einheit (anvil_rate_time_unit) pro einliefernden Host
# default: smtpd_client_message_rate_limit = 0
smtpd_client_message_rate_limit = 50
#
#          Welche Clients sollen vom Rate-Limeting ausgenommen werden? Per
#          Default sind dies alle Clients aus dem eigenen Netzwerk $mynetworks
# default: smtpd_client_event_limit_exceptions = 
#          ${smtpd_client_connection_limit_exceptions:$mynetworks}
#
#          Wie oft soll der anvil-Daemon Statistikdaten ins Maillog schreiben?
# default: anvil_status_update_time = 600s         
#
#          Ausgehende Verbindungen der Delivery-Clients limitieren. Für jeden
#          einzelnen Transport kann bei Bedarf eine eigene Rate definiert 
#          werden.
# default: default_destination_rate_delay = 0s
#          error_destination_rate_delay = $default_destination_rate_delay
#          lmtp_destination_rate_delay = $default_destination_rate_delay
#          local_destination_rate_delay = $default_destination_rate_delay
#          relay_destination_rate_delay = $default_destination_rate_delay
#          retry_destination_rate_delay = $default_destination_rate_delay
#          smtp_destination_rate_delay = $default_destination_rate_delay
#          virtual_destination_rate_delay = $default_destination_rate_delay
#          Ausgehende Nachrichten des MAilinglistenservers auf 2,5 Minuten
#          setzen
#smtp_destination_rate_delay = 150s
 
 
################################################################################
## RÜCKMELDUNGEN BEEINFLUSSEN UND INDIVIDUALISIEREN
#
# Django : 2019-01-27 - Greeting Banner bei der 220er Begrüßung des MTA
smtpd_banner = $myhostname ESMTP $mail_name
 
# Django : 2019-01-27 - Extra-Footer als zweite Zeiler jeder Fehlermeldungen 
#          anfügen
smtpd_reject_footer = \c. Contact your postmaster/admin for technical assistance. He can achieve our postmaster via email: postmaster@nausch.org or via fax: +49 8121 883179. In any case, please provide the following information in your problem report: This error message, time ($localtime), client ($client_address) and server ($server_name).
 
# Django : 2019-01-27 - Anzeige des Tabellen-Namens, in der der Empfänger
#          nicht gefunden wurde. Das unterdrücken macht unter Umständen die
#          Fehlersuche etwas aufwändiger, aber Externen geht diese Detailinfo
#          im Grunde nichts an. 
# default: show_user_unknown_table_name = yes
show_user_unknown_table_name = no
 
# Django : 2019-01-27 - Adressverifikationsdetails unterdrücken
#          Weder den numerischen SMTP-reply-Code, noch den enhanced status code
#          zurückgeben. Lediglich "Recipient address lookup failed" zurückmelden.
# default: unverified_recipient_reject_reason =
unverified_recipient_reject_reason = Recipient address lookup failed
 
# Django : 2019-01-27 - Adressverifikationsdetails unterdrücken
#          Weder den numerischen SMTP-reply-Code, noch den enhanced status code
#          zurückgeben. Lediglich "Recipient address lookup failed" zurückmelden.
# default: unverified_sender_reject_reason =
unverified_sender_reject_reason = Sender address lookup failed
 
# Django : 2019-01-27 Definition der benutzerspezifischen und individualisierten 
#          Bounce-Nachrichten mit deutsch- und englischsprachigen Texten aktiviert
# default: bounce_template_file =
bounce_template_file = /etc/postfix/bounce.de-DE.cf
 
# Django : 2019-01-27 - Delivery Status Notification (DSN) selectiv sperren
#          oder freigeben
# default: smtpd_discard_ehlo_keyword_address_maps =
smtpd_discard_ehlo_keyword_address_maps = cidr:/etc/postfix/esmtp_access
 
# Django : 2019-01-27 - SMTP-Kommando VRFY sperren, mit dem eine einfache und
#          schnelle Addressverifizierung möglich ist.
# default: disable_vrfy_command = no
disable_vrfy_command = yes
 
# Django : 2019-01-27 - Fehlercode bei Verwendung der Option 
#          reject_plaintext_session beim Einsatz von verpflichtender
#          TLS-Transportverschlüsselung.  
#          https://tools.ietf.org/html/rfc3463#section-3.8
# default: plaintext_reject_code = 450
plaintext_reject_code = 571
 
 
################################################################################
## LOOKUP-TABELLEN
#
# Django : 2019-01-27 - default Datenbank Typ für die Befehle newaliases, 
#          postalias und postmap auf das performantere btree umgestellt.
# default default_database_type = hash
default_database_type =   btree
 
# Django : 2019-01-27 - Trennzeichen zwischen Usernamen und Adresserweiterung 
# default: recipient_delimiter =
recipient_delimiter = +
 
# Django : 2019-01-27 - Alias-Tabelle für die Zustellung von lokalen Nachrichten
#          durch den MDA (Mail Delivery Agent) "local". Nach Änderungen an der
#          Tabelle /etc/aliases ist "newaliases" zum Neubau des Datenbankfiles
#          notwendig!
# default: alias_maps = hash:/etc/aliases, nis:mail.aliase
alias_maps =              hash:/etc/aliases
                          #btree:/etc/mailman/aliases
alias_database =          hash:/etc/aliases
 
# Django : 2019-01-27 - Optionale Lookup Tabelle mit allen gültigen Empfängern
#          der in $relay_domains aufgeführten Domains
# default: relay_recipient_maps =
relay_recipient_maps =
                          #btree:/etc/mailman/virtual-mailman
                          #btree:/etc/mailman/roleaccounts 
 
# Django : 2019-01-27 - virtuelle Mail-Domains und Mailboxen mit Anbindung an
#          das mySQL-Datenbankbackend (Verwaltung mit Hilfe von postfixadmin)
# default: virtual_mailbox_domains = $virtual_mailbox_maps
#          virtual_alias_maps = $virtual_maps
#          virtual_mailbox_maps =
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
 
virtual_alias_maps =      proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
                          proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf
                          proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf
#
virtual_mailbox_maps =    proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
                          proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf
 
# Django : 2019-01-27 - BCC-Adress Lookup Tabelle mit deren Hilfe Nachrichten 
#          einzelner oder mehrerer Empfänger automatisch an einen weiteren 
#          Empfänger geschickt werden.
# default: recipient_bcc_maps = 
recipient_bcc_maps = btree:/etc/postfix/recipient_bcc_maps
 
# Django : 2019-01-27 - BCC-Adress Lookup Tabelle mit deren Hilfe Nachrichten 
#          einzelner oder mehrerer Absender automatisch an einen weiteren 
#          Empfänger geschickt werden.
sender_bcc_maps = btree:/etc/postfix/sender_bcc_maps
 
# Django : 2019-01-27 - SMTP Lookup Tabelle mit deren Hilfe eMail-Adressen der
#          Empfänger im SMTP-Envelope und im Header der eMail beim Verlassen
#          des MTA via SMTP umgeschrieben werden können.
# default: smtp_generic_maps =   
smtp_generic_maps = btree:/etc/postfix/smtp_generic_maps
 
# Django : 2019-01-27 - LMTP Lookup Tabelle mit deren Hilfe eMail-Adressen der
#          Empfänger im SMTP-Envelope und im Header der eMail beim Verlassen
#          des MTA zum MDA via LMTP umgeschrieben werden können.
# default: smtp_generic_maps =   
lmtp_generic_maps = btree:/etc/postfix/lmtp_generic_maps
 
# Django : 2019-01-27 - Lookup-Tabelle zum Umschreibungen von Absender-eMail-
#          -Adressen im SMTP-Envelop und/oder im Header der eMail. 
# default: sender_canonical_maps = 
sender_canonical_maps = btree:/etc/postfix/sender_canonical_maps
#                       SRS - Sender Rewriting Scheme mit postsrsd 
                        tcp:127.0.0.1:10001
#          Definition welche Adressen umgeschrieben werden sollen
# default: sender_canonical_classes = envelope_sender, header_sender 
sender_canonical_classes = envelope_sender
			   #header_sender
 
# Django : 2019-01-27 - Lookup-Tabelle zum Umschreibungen von Empfänger-eMail-
#          -Adressen im SMTP-Envelop und/oder im Header der eMail.
# default: recipient_canonical_maps =
recipient_canonical_maps = btree:/etc/postfix/recipient_canonical_maps
#                          SRS - Sender Rewriting Scheme mit postsrsd
                           tcp:127.0.0.1:10002
#          Definition welche Adressen umgeschrieben werden sollen
# default: recipient_canonical_classes = envelope_recipient, header_recipient 
recipient_canonical_classes = envelope_recipient
			      #header_recipient
 
# Django : 2019-01-27 - Lookup-Tabelle zum Aktivieren von "Bounce-Nachrichten"
#          an den Absender einer eMail über nicht existierende eMail-Adressen 
#          mit Angabe der neu zu nutzenden eMailadresse des Empfängers.
# default: relocated_maps = 
relocated_maps = btree:/etc/postfix/relocated_maps
 
# Django : 2019-01-27 - Ergebnisse der Adress-Verification cachen
#          Kapitel 12.2.2 Dynamische Empfänger-Verifizierung
#          Kapitel 9.5.5 envelope sender überprüfen
# default: address_verify_map = btree:$data_directory/verify_cache
#address_verify_map = btree:/var/spool/postfix/data/verify
 
################################################################################
## SMTP RECIPIENT RESTRICTIONS
#
# Django : 2019-01-27 - Schutz unserer Empfänger mit Hilfe der Recipient 
#          Restrictions 
# default: smtpd_recipient_restrictions =
smtpd_recipient_restrictions =
#          Postmaster, abuse und andere aufgaben- oder funktionsgebundene 
#          eMail-Adressen (Role-Accounts) whitelisten
           check_recipient_access btree:/etc/postfix/access_recipient-rfc
 
#          Black- und Whitelisting       (Kapitel 8.2.3 White- und Blacklisting)
           check_client_access cidr:/etc/postfix/access_client
           check_helo_access btree:/etc/postfix/access_helo
           check_sender_access btree:/etc/postfix/access_sender
           check_recipient_access btree:/etc/postfix/access_recipient
 
#          Unsere eigenen Nutzer zulassen-/erlauben             
#                                (Kapitel 8.2.2 Relaying erlauben und verbieten)
           permit_sasl_authenticated
           permit_mynetworks
 
#          RBL überprüfen               (Kapitel 10.11 Realtime Blackhole Lists)
           reject_rbl_client zen.spamhaus.org
           reject_rbl_client ix.dnsbl.manitu.net
           reject_rbl_client bl.spamcop.net
           reject_rhsbl_client multi.uribl.com
 
#          Greylisting via postgrey checken via Unix-Socket
#                                          (Kapitel 9.2.5 postgrey installieren)
          #check_policy_service unix:postgrey/socket,
 
#          Policyd-Weight check over TCP-Connection 
#                                      (Kapitel 9.3 policyd-weight installieren)
#          check_client_access btree:/etc/postfix/policyd_weight_client_whitelist,
#          check_policy_service inet:127.0.0.1:12525,
 
#          Dynamische Prüfung auf existente Relay-Empfänger
#                            (Kapitel 12.2.2 Dynamische Empfänger-Verifizierung)
           reject_unverified_recipient
 
#          Backupserver (MX) erlauben
           permit_mx_backup
 
#          alles andere an relaying verbieten   
#                                (Kapitel 8.2.2 Relaying erlauben und verbieten)
           reject_unauth_destination
 
#          Quota-Status-Policy-Daemon am Dovecot-Backend-System
#          Dovecotbuch (ISBN 978-3-95539-74-7) Seite 219 ff.  
#                          (Kapitel 11.11 "Der Quota-Policy-Server für Postfix")
           check_policy_service inet:10.0.0.77:10000
 
#          Zu guter Letzt alles durchlassen, was bis jetzt noch nicht 
#          beanstandet wurde
           permit
 
 
################################################################################
## SMTP RELAY RESTRICTIONS
#
# Django : 2019-01-27 - Definition, wer über unseren MX relayen darf oder nicht. 
#          http://www.postfix.org/postconf.5.html#smtpd_relay_restrictions
# default: smtpd_relay_restrictions = permit_mynetworks, 
#          permit_sasl_authenticated, defer_unauth_destination
#
smtpd_relay_restrictions =
# Unsere eigenen Nutzer zulassen-/erlauben
           permit_sasl_authenticated,
           permit_mynetworks,
# Backupserver (MX) erlauben
           permit_mx_backup,
# alles andere an relaying verbieten, d.h. mit einem finalen error 550 abweisen
           reject_unauth_destination

Konfiguration aktivieren

Zur Aktivierung unserer Konfiguration benutzen wir systemctl.

 # systemctl restart postfix

Da keine Rückmeldung erfolgte können wir davon ausgehen, dass alle unsere Konfigurationsoptionen unseren Wünschen entsprechend gesetzt wurden.

Wir können aber auch den Status unseres Mailservers abfragen.

 # systemctl status postfix

postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2019-01-27 22:53:52 CET; 2min 20s ago
  Process: 5671 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 5687 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 5684 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 5681 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
 Main PID: 5761 (master)
   CGroup: /system.slice/postfix.service
           ├─5761 /usr/libexec/postfix/master -w
           ├─5762 pickup -l -t unix -u
           └─5763 qmgr -l -t unix -u

Jan 27 22:53:51 vml000080.dmz.nausch.org systemd[1]: Stopped Postfix Mail Transport Agent.
Jan 27 22:53:51 vml000080.dmz.nausch.org systemd[1]: Starting Postfix Mail Transport Agent...
Jan 27 22:53:52 vml000080.dmz.nausch.org postfix/postfix-script[5759]: starting the Postfix mail system
Jan 27 22:53:52 vml000080.dmz.nausch.org postfix/master[5761]: daemon started -- version 3.3.2, configuration /etc/postfix
Jan 27 22:53:52 vml000080.dmz.nausch.org systemd[1]: Started Postfix Mail Transport Agent.




FIXME FIXME FIXME

  • do geds weida!

FIXME FIXME FIXME




Links

1) , 2)
Full Qualified Domain Name
3)
Realtime Blackhole List
4)
Right-Hand Sided Blacklist