Inhaltsverzeichnis
Postfix CentOS 7 - Multiple Instanzen
Postfix und dessen Fähigkeit zur Verwaltung mehrerer Postfix-Instanzen auf einem einzigen Host mit dem
postmulti
-Instanzmanager soll in nachfolgender Dokumentation beschrieben werden. Weitere Informationen zum postfix-wrapper
für Hintergrundinformationen über das Instanzmanagement-Framework und über die Bereitstellung eines benutzerdefinierten Instanzmanagers folgen ebenfalls in der nachfolgenden Dokumentation.
HINWEIS - Multi-Instanz-Unterstützung ist ab Postfix Version 2.6 verfügbar!
Eine einzelne Postfix-Konfiguration kann viele verschiedene Dienste bereitstellen, aber es kann ein komplexes Zusammenspiel von Einstellungen erforderlich sein, z.B. mit master.cf
-Optionen, die die main.cf
-Einstellungen überschreiben. Eine Ansicht, dass mehrere Postfix-Instanzen ein einfacherer Weg zur Konfiguration eines multifunktionalen Postfix-Systems sein können, soll nachfolgend beschrieben werden.
WICHTIG - Bei mehreren Postfix-Instanzen hat jede Instanz ihre eigenen Verzeichnisse für Konfigurations-, Warteschlangen- und Datendateien, aber sie teilt alle Postfix-Programm- und Dokumentationsdateien mit anderen Instanzen.
Da es nicht die einzige richtige Möglichkeit gibt, ein System zu konfigurieren, wäre eine möglicher Ansatz, das zu wählen, was eine mögliche Konfiguration am bequemsten macht. Wenn verschiedene Postfix-Dienste keine inkompatiblen main.cf
oder master.cf
-Einstellungen beinhalten und ohne komplexe Tricks miteinander kombiniert werden können, dann kann eine einzige monolithische Konfiguration der einfachste Ansatz sein.
Der Zweck der Multi-Instanz-Unterstützung in Postfix ist nicht, zwingend, mehrere Postfix-Instanzen zu erstellen, sondern Wahlmöglichkeiten anzubieten. Mehrere Instanzen ergeben die Freiheit, jede Postfix-Instanz auf eine einzelne Aufgabe abzustimmen, die diese dann gut kann, und Instanzen zu kompletten Systemen zu kombinieren.
Mit der Einführung des Dienstprogramms postmulti
und der Reduzierung des Platzbedarfs einer sekundären Postfix-Instanz auf nur eine main.cf
- und master.cf
-Datei (andere Dateien befinden sich nun an gemeinsamen Standorten) hoffen die Entwickler, dass die Verwendung mehrerer Instanzen einfacher ist als dies zuvor war.
Postfix wird von Wietse Venema entwickelt.
Beschreibung | Externer Link |
---|---|
Homepage | http://www.postfix.org |
Dokumentation | http://www.postfix.org/documentation.html |
Ankündigungen | http://www.postfix.org/announcements.html |
postmulti | http://www.postfix.org/MULTI_INSTANCE_README.html |
Ab hier werden zur Ausführung nachfolgender Befehle root
-Rechte benötigt. Um der Benutzer root
zu werden, melden Sie sich bitte als root
-Benutzer am System an, oder wechseln mit nachfolgendem Befehl zum Benutzer root
:
$ su - Password:
Vorbereitungen
HINWEIS - Als Ausgangssituation wird die Standard-Konfiguration von Postfix verwendet, so wie diese unter CentOS-7 ausgeliefert wird, damit nicht durch weitere Konfigurationen von der wesentliche Postfix-Instanzkonfiguration abgelegt wird!
Postfix Version 2.x
Nachfolgende die Verzeichnisstruktur der Standard-Postfix-Konfiguration VOR dem Einsatz von Muliplen-Postfix-Instanzen:
# ls -l /etc/postfix/ total 148 -rw-r--r-- 1 root root 21006 Oct 22 2018 access -rw-r--r-- 1 root root 11683 Oct 22 2018 canonical -rw-r--r-- 1 root root 9904 Oct 22 2018 generic -rw-r--r-- 1 root root 21548 Oct 22 2018 header_checks -rw-r--r-- 1 root root 27221 May 18 06:23 main.cf -rw-r--r-- 1 root root 6258 May 18 06:22 master.cf -rw-r--r-- 1 root root 6816 Oct 22 2018 relocated -rw-r--r-- 1 root root 12549 Oct 22 2018 transport -rw-r--r-- 1 root root 12510 Oct 22 2018 virtual
Nachfolgende die Standard-Postfix-Konfiguration VOR dem Einsatz von Muliplen-Postfix-Instanzen:
# postconf -n postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases command_directory = /usr/sbin config_directory = /etc/postfix daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 html_directory = no inet_interfaces = localhost inet_protocols = all mail_owner = postfix mailq_path = /usr/bin/mailq.postfix manpage_directory = /usr/share/man mydestination = $myhostname, localhost.$mydomain, localhost newaliases_path = /usr/bin/newaliases.postfix queue_directory = /var/spool/postfix readme_directory = /usr/share/doc/postfix-2.11.11/README_FILES sample_directory = /usr/share/doc/postfix-2.11.11/samples sendmail_path = /usr/sbin/sendmail.postfix setgid_group = postdrop unknown_local_recipient_reject_code = 550
HINWEIS - IPv6 ist auf diesem Server deaktiviert, daher die Fehlermeldung in der ersten Zeile!
HINWEIS - Um die oben gezeigte Fehlermeldung auf einem Server ohne IPv6-Unterstützung - vorab schnell zu beseitigen, kann nachfolgender Befehl ausgeführt werden:
# postconf -e inet_protocols=ipv4
Nachfolgende die Bestätigung das Postfix gestartet ist und auf der IP-Adresse localhost (127.0.0.1)
und auf Port 25
lauscht, was bei einer Standard-Postfix-Konfiguration VOR dem Einsatz von Muliplen-Postfix-Instanzen der Fall ist:
( p.s. Da manche lieber Poni's als tulpen mögen, hier beide Befehle zur Überprüfung)
# lsof -Poni | grep master master 6150 root 13u IPv4 138555 0t0 TCP 127.0.0.1:25 (LISTEN)
# netstat -tulpen | grep master tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 0 138555 6150/master
Postfix Version 3.x
Nachfolgende die Verzeichnisstruktur der Standard-Postfix-Konfiguration VOR dem Einsatz von Muliplen-Postfix-Instanzen:
# ls -l /etc/postfix/ total 252 -rw-r--r-- 1 root root 21535 Apr 3 16:14 access -rw-r--r-- 1 root root 13194 Apr 3 16:14 canonical -rw-r--r-- 1 root root 164 Apr 3 16:14 dynamicmaps.cf drwxr-xr-x 2 root root 6 Apr 3 16:14 dynamicmaps.cf.d -rw-r--r-- 1 root root 10221 Apr 3 16:14 generic -rw-r--r-- 1 root root 23802 Apr 3 16:14 header_checks -rw-r--r-- 1 root root 28035 May 20 10:45 main.cf -rw-r--r-- 1 root root 27742 Apr 3 16:14 main.cf.proto -rw-r--r-- 1 root root 6360 Apr 3 16:14 master.cf -rw-r--r-- 1 root root 6360 Apr 3 16:14 master.cf.proto -rw-r--r-- 1 root root 21106 Apr 3 16:14 postfix-files -rw-r--r-- 1 root root 6929 Apr 3 16:14 relocated -rw-r--r-- 1 root root 12666 Apr 3 16:14 transport -rw-r--r-- 1 root root 13963 Apr 3 16:14 virtual
Nachfolgende die Standard-Postfix-Konfiguration VOR dem Einsatz von Muliplen-Postfix-Instanzen:
# postconf -n postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases command_directory = /usr/sbin compatibility_level = 2 daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 html_directory = no inet_interfaces = localhost mail_owner = postfix mailq_path = /usr/bin/mailq.postfix manpage_directory = /usr/share/man meta_directory = /etc/postfix mydestination = $myhostname, localhost.$mydomain, localhost newaliases_path = /usr/bin/newaliases.postfix queue_directory = /var/spool/postfix readme_directory = /usr/share/doc/postfix-3.4.5/README_FILES sample_directory = /usr/share/doc/postfix-3.4.5/samples sendmail_path = /usr/sbin/sendmail.postfix setgid_group = postdrop shlib_directory = /usr/lib/postfix unknown_local_recipient_reject_code = 550
HINWEIS - IPv6 ist auf diesem Server deaktiviert, daher die Fehlermeldung in der ersten Zeile!
HINWEIS - Um die oben gezeigte Fehlermeldung auf einem Server ohne IPv6-Unterstützung - vorab schnell zu beseitigen, kann nachfolgender Befehl ausgeführt werden:
# postconf -e inet_protocols=ipv4
Um Warnungen wie diese bei der Erstellung von weiteren Postfix-Instanzen vorab schon vermeiden zu können, kann die Konfigurationsdatei
/tec/postfix/main.cf.proto
angepasst werden, da diese bei der Erstellung von neuen Postfix-Instanzen als „Blaupause“ dient. Nachfolgende Anpassungen sind dazu erforderlich:
(Nur relevanter Ausschnitt)
# Enable IPv4, and IPv6 if supported # Tachtler # default: #inet_protocols = ipv4 inet_protocols = ipv4
Nachfolgende die Bestätigung das Postfix gestartet ist und auf der IP-Adresse localhost (127.0.0.1)
und auf Port 25
lauscht, was bei einer Standard-Postfix-Konfiguration VOR dem Einsatz von Muliplen-Postfix-Instanzen der Fall ist:
( p.s. Da manche lieber Poni's als tulpen mögen, hier beide Befehle zur Überprüfung)
# lsof -Poni | grep master master 6150 root 13u IPv4 138555 0t0 TCP 127.0.0.1:25 (LISTEN)
# netstat -tulpen | grep master tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 0 138555 6150/master
* Quelle: Patrick Ben Koetter von der [*]sys4.
Konfiguration
Nachfolgendes Beispiel, soll zwei Instanzen von Postfix mit Hilfe des Konfigurationsprogramms postmulti
von Postfix erstellt werden, wobei die Instanzen nachfolgende Aufgaben haben sollen:
/etc/postfix/main.cf.proto
HINWEIS - Ab Postfix Version 3.x
Um bei der Erstellung von neuen Postfix-Instanzen bereits vor deren Erstellung auf die Konfigurationsdatei
/etc/[Name]/main.cf
Einfluss nehmen zu können, kann ab Postfix Version 3.x die Konfigurationsdatei
/etc/postfix/main.cf.proto
entsprechend angepasst werden, da diese Konfigurationsdatei als sozusagen „Blaupause“ für die Erstellung der Konfigurationsdatei /etc/[Name]/main.cf
dient.
HINWEIS - Alle Anpassungen in
/etc/postfix/main.cf.proto
sind nach der Erstellung einer Postfix-Instanzen in deren /etc/[Name]/main.cf
enthalten!
* Quelle: Patrick Ben Koetter von der [*]sys4.
/etc/postfix/master.cf.proto
HINWEIS - Ab Postfix Version 3.x
Um bei der Erstellung von neuen Postfix-Instanzen bereits vor deren Erstellung auf die Konfigurationsdatei
/etc/[Name]/master.cf
Einfluss nehmen zu können, kann ab Postfix Version 3.x die Konfigurationsdatei
/etc/postfix/master.cf.proto
entsprechend angepasst werden, da diese Konfigurationsdatei als sozusagen „Blaupause“ für die Erstellung der Konfigurationsdatei /etc/[Name]/master.cf
dient.
HINWEIS - Alle Anpassungen in
/etc/postfix/master.cf.proto
sind nach der Erstellung einer Postfix-Instanzen in deren /etc/[Name]/master.cf
enthalten!
* Quelle: Patrick Ben Koetter von der [*]sys4.
Multi-Instanz-Unterstützung aktivieren
Zur Multi-Instanz-Unterstützung muss nur einmal, beim Hinzufügen der ersten sekundären Instanz, die Multi-Instanz-Unterstützung in der Standardinstanz aktiviert werden, was durch nachfolgenden Befehl durchgeführt wird:
# postmulti -e init
HINWEIS - Es erfolgt keine Ausgabe bei erfolgreicher Ausführung des Befehls!
Nachfolgende Ergänzungen wurden durch Ausführung des oben gezeigten Befehls an der Konfigurationsdatei
/etc/postfix/main.cf
hinzugefügt:
(Nur relevanter Ausschnitt)
multi_instance_wrapper = ${command_directory}/postmulti -p -- multi_instance_enable = yes
Parameter | Erklärung |
---|---|
multi_instance_wrapper = ${command_directory}/postmulti -p – | Der Pfadname eines Multi-Instanz-Managerbefehls, den der Befehl postfix aufruft, wenn der Parameterwert multi_instance_directories nicht leer ist. Auf den Pfadnamen können erste Befehlsargumente folgen, die durch Leerzeichen getrennt sind; Shell-Metazeichen wie Anführungszeichen werden in diesem Zusammenhang nicht unterstützt. Der Befehl postfix ruft den Managerbefehl mit den nicht optionalen Befehlsargumenten postfix auf der Manager-Befehlszeile und mit allen Installationskonfigurationsparametern, die in die Manager-Befehlsprozessumgebung exportiert werden auf. Der Befehl manager wiederum ruft den Befehl postfix für einzelne Postfix-Instanzen als postfix -c config_directory command auf. Siehe auch: http://www.postfix.org/postconf.5.html#multi_instance_wrapper |
multi_instance_enable = yes | Erlaubt, dass diese Postfix-Instanz von einem Multi-Instanz-Manager gestartet, gestoppt usw. wird. Standardmäßig werden neue Instanzen in einem sicheren Zustand erstellt, der verhindert, dass sie versehentlich gestartet werden. Dieser Parameter ist für den Multi-Instanz-Manager reserviert. Siehe auch: http://www.postfix.org/postconf.5.html#multi_instance_enable |
HINWEIS - Da für den Späteren Einsatz der _nur auf
localhost
gebunden werden soll und auf Port 25 lauschen soll, wäre nachfolgende Konfiguration korrekterweise in der Konfigurationsdatei
/etc/postfix/master.cf
der Postfix-Basis-Instanz -
noch abgeändert werden, was mit nachfolgendem Befehl durchgeführt werden kann:
# postmulti -i - -x postconf -M smtp/inet="127.0.0.1:smtp inet n - n - - smtpd"
Instanz hinzufügen
Nachfolgender Befehl erstellt eine weitere Instanz, mit
- dem Namen:
postfix-eth0
- in der Gruppe:
mta
(dies ist nur optional)
# postmulti -I postfix-eth0 -G mta -e create postfix: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol
HINWEIS - IPv6 ist auf diesem Server deaktiviert, daher die Fehlermeldungen (für jede im Hintergrund durchgeführte Änderung bzw. Befehlsausführung, jeweils eine Zeile)!
HINWEIS - Um die oben gezeigten Fehlermeldungen auf einem Server ohne IPv6-Unterstützung - vorab schnell zu beseitigen, kann nachfolgender Befehl ausgeführt werden:
# postmulti -i postfix-eth0 -x postconf -e "inet_protocols = ipv4" /usr/sbin/postconf: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol
HINWEIS - IPv6 ist auf diesem Server deaktiviert, daher ein letztes mal die Fehlermeldung!
Nachfolgende Ergänzungen wurden durch Ausführung des oben gezeigten Befehls an der Konfigurationsdatei
/etc/postfix-eth0/main.cf
hinzugefügt:
(Nur relevanter Ausschnitt)
master_service_disable = inet authorized_submit_users = multi_instance_group = mta multi_instance_name = postfix-eth0
Parameter | Erklärung |
---|---|
master_service_disable = inet | Selektives Deaktivieren von master -Listener-Ports nach Diensttyp oder nach Dienstname und -typ. Geben Sie eine Liste von Diensttypen (inet , unix , fifo oder pass ) oder name/type Paare an, wobei name das erste Feld eines master.cf -Eintrags und type ein Diensttyp ist. Wie bei anderen Postfix-Matchlists stoppt die Suche beim ersten Treffer. Geben Sie !pattern an, um einen Dienst aus der Liste auszuschließen. Standardmäßig sind alle master(8)-Listener-Ports aktiviert. /file/name oder type:table Muster noch Wildcards wie \* oder all . Das ist beabsichtigt. Siehe auch: http://www.postfix.org/postconf.5.html#master_service_disable |
authorized_submit_users = | Liste der Benutzer, die berechtigt sind, E-Mails mit dem Befehl sendmail (und mit dem privilegierten Befehl postdrop Hilfsprogramm) zu senden. Siehe auch: http://www.postfix.org/postconf.5.html#authorized_submit_users |
multi_instance_group = mta | Der optionale Gruppenname der Instanz dieser Postfix-Instanz. Eine Gruppe identifiziert verwandte Postfix-Instanzen, die der Multi-Instanz-Manager starten, stoppen usw. kann, als Einheit. Dieser Parameter ist für den Multi-Instanz-Manager reserviert. Siehe auch: http://www.postfix.org/postconf.5.html#multi_instance_group |
multi_instance_name = postfix-eth0 | Der optionale Instanzname dieser Postfix-Instanz. Dieser Name wird auch zum Standardwert für den Parameter syslog_name . Siehe auch: http://www.postfix.org/postconf.5.html#multi_instance_name |
Das Konfigurationsverzeichnis der so neu erstellten Instanz ist in diesem Fall wie bei der Erstellung angegeben:
/etc/postfix-eth0
genauer gesagt, das Unterverzeichnis postfix-eth0
des übergeordneten Verzeichnisses des Konfigurationsverzeichnisses der Standard-Instanz.
HINWEIS - Die neue Instanz wird standardmäßig in einem deaktivierten Zustand erstellt!
Nachfolgende die Verzeichnisstruktur der Instanz postfix-eth0
-Postfix-Konfiguration:
# ls -l /etc/postfix-eth0/ total 36 -rw-r--r-- 1 root root 27343 May 18 07:48 main.cf -rw-r--r-- 1 root root 6220 Oct 22 2018 master.cf
Nachfolgende die Instanz postfix-eth0
-Postfix-Konfiguration:
# postmulti -i postfix-eth0 -x postconf -n alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases authorized_submit_users = command_directory = /usr/sbin config_directory = /etc/postfix-eth0 daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix-eth0 debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 html_directory = no inet_interfaces = localhost inet_protocols = ipv4 mail_owner = postfix mailq_path = /usr/bin/mailq.postfix manpage_directory = /usr/share/man master_service_disable = inet multi_instance_group = mta multi_instance_name = postfix-eth0 mydestination = $myhostname, localhost.$mydomain, localhost newaliases_path = /usr/bin/newaliases.postfix queue_directory = /var/spool/postfix-eth0 readme_directory = /usr/share/doc/postfix-2.11.11/README_FILES sample_directory = /usr/share/doc/postfix-2.11.11/samples sendmail_path = /usr/sbin/sendmail.postfix setgid_group = postdrop unknown_local_recipient_reject_code = 550
Nachfolgende Ergänzungen wurden durch Ausführung des oben gezeigten Befehls an der Konfigurationsdatei
/etc/postfix/main.cf
hinzugefügt:
(Nur relevanter Ausschnitt)
multi_instance_wrapper = ${command_directory}/postmulti -p -- multi_instance_enable = yes multi_instance_directories = /etc/postfix-eth0
Parameter | Erklärung |
---|---|
multi_instance_wrapper = ${command_directory}/postmulti -p – | Der Pfadname eines Multi-Instanz-Managerbefehls, den der Befehl postfix aufruft, wenn der Parameterwert multi_instance_directories nicht leer ist. Auf den Pfadnamen können erste Befehlsargumente folgen, die durch Leerzeichen getrennt sind; Shell-Metazeichen wie Anführungszeichen werden in diesem Zusammenhang nicht unterstützt. Der Befehl postfix ruft den Managerbefehl mit den nicht optionalen Befehlsargumenten postfix auf der Manager-Befehlszeile und mit allen Installationskonfigurationsparametern, die in die Manager-Befehlsprozessumgebung exportiert werden auf. Der Befehl manager wiederum ruft den Befehl postfix für einzelne Postfix-Instanzen als postfix -c config_directory command auf. Siehe auch: http://www.postfix.org/postconf.5.html#multi_instance_wrapper |
multi_instance_enable = yes | Erlaubt, dass diese Postfix-Instanz von einem Multi-Instanz-Manager gestartet, gestoppt usw. wird. Standardmäßig werden neue Instanzen in einem sicheren Zustand erstellt, der verhindert, dass sie versehentlich gestartet werden. Dieser Parameter ist für den Multi-Instanz-Manager reserviert. Siehe auch: http://www.postfix.org/postconf.5.html#multi_instance_enable |
multi_instance_directories = /etc/postfix-eth0 | Eine optionale Liste von nicht standardmäßigen Postfix-Konfigurationsverzeichnissen; diese Verzeichnisse gehören zu zusätzlichen Postfix-Instanzen, die die ausführbaren Postfix-Dateien und -Dokumentation mit der Standard-Postfix-Instanz teilen und die zusammen mit der Standard-Postfix-Instanz gestartet, gestoppt usw. werden. Dies ist eine Liste von Pfadnamen, die durch Komma oder Leerzeichen getrennt sind. Wenn multi_instance_directories leer ist, läuft der Befehl postfix im Single-Instance-Modus und arbeitet nur mit einer einzigen Postfix-Instanz. Andernfalls läuft der Befehl postfix im Multi-Instanz-Modus und ruft den mit dem Parameter multi_instance_wrapper angegebenen Multi-Instanz-Manager auf. Der Multi-Instanz-Manager wiederum führt postfix -Befehle für die Standardinstanz und für alle Postfix-Instanzen in multi_instance_directories aus. Derzeit wird diese Parametereinstellung ignoriert, mit Ausnahme der standardmäßigen main.cf -Datei. Siehe auch: http://www.postfix.org/postconf.5.html#multi_instance_directories |
Instanzen auflisten
Nachfolgender Befehl listet alle vorhanden Instanzen in einer Umgebung mit Multi-Instanz-Unterstützung auf:
# postmulti -l - - y /etc/postfix postfix-eth0 mta n /etc/postfix-eth0
Der Aufbau der Auflistung ist recht Übersichtlich:
[Name] | [Gruppe] | aktiv | Konfigurationsverzeichnis config_directory |
---|---|---|---|
- | - | y | /etc/postfix |
postfix-eth0 | mta | n | /etc/postfix-eth0 |
HINWEIS - Neue Instanzen werden standardmäßig in einem deaktivierten Zustand erstellt!
Instanzen aktivieren
Nachfolgender Befehl aktiviert eine Instanz:
# postmulti -i postfix-eth0 -e enable
Eine Überprüfung, ob die Instanz nun aktiv ist, kann mit nachfolgendem Befehl durchgeführt werden:
# postmulti -l - - y /etc/postfix postfix-eth0 mta y /etc/postfix-eth0
HINWEIS - Nun ist auch die Postfix-Instanz
postfix-eth0
aktiviert!
Instanz starten
WICHTIG - Bevor eine Postfix-Instanz gestartet werden sollte, MUSS der Parameter:
master_service_disable
entsprechend angepasst werden!
Der Parameter master_service_disable
ist direkt nach dem Erstellen einer Postfix-Instanz auf den Wert inet
gesetzt. Das verhindert, das die Postfix-Instanz auf einer IP-Adresse lauscht und an einen Port gebunden werden kann!
Parameter | Erklärung |
---|---|
master_service_disable = inet | Selektives Deaktivieren von master -Listener-Ports nach Diensttyp oder nach Dienstname und -typ. Geben Sie eine Liste von Diensttypen (inet , unix , fifo oder pass ) oder name/type Paare an, wobei name das erste Feld eines master.cf -Eintrags und type ein Diensttyp ist. Wie bei anderen Postfix-Matchlists stoppt die Suche beim ersten Treffer. Geben Sie !pattern an, um einen Dienst aus der Liste auszuschließen. Standardmäßig sind alle master(8)-Listener-Ports aktiviert. /file/name oder type:table Muster noch Wildcards wie \* oder all . Das ist beabsichtigt. Siehe auch: http://www.postfix.org/postconf.5.html#master_service_disable |
Damit eine Postfix-Instanz auf eine IP-Adresse gebunden werden kann und auf einen Port lauscht, muss vor dem Start der Postfix-Instanz der Parameter master_service_disable
mit nachfolgenden Befehl verändert werden, so das kein master
-Listener-Port blockiert wird. Effektiv muss der Parameter master_service_disable
LEER sein.
# postmulti -i postfix-eth0 -x postconf -e "master_service_disable ="
HINWEIS - Damit beide Postfix-Instanzen nicht versuchen sich auf die IP-Adresse
127.0.0.1
und Port 25
zu binden, muss dies entsprechend bei einer der beiden Postfix-Instanzen, hier die Postfix-Instanz postfix-eth0
noch abgeändert werden, was mit nachfolgendem Befehl durchgeführt wird.
# postmulti -i postfix-eth0 -x postconf -e "inet_interfaces = 192.168.0.20"
und dies auch zusätzlich in der Konfigurationsdatei
/etc/postfix-eth0/master.cf
der Postfix-Instanz postfix-eth0
noch abgeändert werden, was mit nachfolgendem Befehl durchgeführt werden kann:
# postmulti -i postfix-eth0 -x postconf -M smtp/inet="192.168.0.20:smtp inet n - n - - smtpd"
Abschließend kann nun der eigentliche Start der Postfix-Instanz mit anchfolgendem Befehl durchgeführt werden:
# postmulti -i postfix-eth0 -p start postfix-eth0/postfix-script: starting the Postfix mail system
Nachfolgende Ergänzungen wurden durch Ausführung der oben gezeigten Befehle an der Konfigurationsdatei
/etc/postfix-eth0/main.cf
hinzugefügt:
(Nur relevanter Ausschnitt)
master_service_disable =
authorized_submit_users =
multi_instance_group = mta
multi_instance_name = postfix-eth0
multi_instance_enable = yes
Parameter | Erklärung |
---|---|
master_service_disable = inet | Selektives Deaktivieren von master -Listener-Ports nach Diensttyp oder nach Dienstname und -typ. Geben Sie eine Liste von Diensttypen (inet , unix , fifo oder pass ) oder name/type Paare an, wobei name das erste Feld eines master.cf -Eintrags und type ein Diensttyp ist. Wie bei anderen Postfix-Matchlists stoppt die Suche beim ersten Treffer. Geben Sie !pattern an, um einen Dienst aus der Liste auszuschließen. Standardmäßig sind alle master(8)-Listener-Ports aktiviert. /file/name oder type:table Muster noch Wildcards wie \* oder all . Das ist beabsichtigt. Siehe auch: http://www.postfix.org/postconf.5.html#master_service_disable |
authorized_submit_users = | Liste der Benutzer, die berechtigt sind, E-Mails mit dem Befehl sendmail (und mit dem privilegierten Befehl postdrop Hilfsprogramm) zu senden. Siehe auch: http://www.postfix.org/postconf.5.html#authorized_submit_users |
multi_instance_group = mta | Der optionale Gruppenname der Instanz dieser Postfix-Instanz. Eine Gruppe identifiziert verwandte Postfix-Instanzen, die der Multi-Instanz-Manager starten, stoppen usw. kann, als Einheit. Dieser Parameter ist für den Multi-Instanz-Manager reserviert. Siehe auch: http://www.postfix.org/postconf.5.html#multi_instance_group |
multi_instance_name = postfix-eth0 | Der optionale Instanzname dieser Postfix-Instanz. Dieser Name wird auch zum Standardwert für den Parameter syslog_name . Siehe auch: http://www.postfix.org/postconf.5.html#multi_instance_name |
multi_instance_enable = yes | Erlaubt, dass diese Postfix-Instanz von einem Multi-Instanz-Manager gestartet, gestoppt usw. wird. Standardmäßig werden neue Instanzen in einem sicheren Zustand erstellt, der verhindert, dass sie versehentlich gestartet werden. Dieser Parameter ist für den Multi-Instanz-Manager reserviert. Siehe auch: http://www.postfix.org/postconf.5.html#multi_instance_enable |
Instanz Status
Nachfolgender Befehl zeigt den Status aller Postfix-Instanzen an:
# postmulti -a -p status postfix/postfix-script: the Postfix mail system is running: PID: 6511 postfix-eth0/postfix-script: the Postfix mail system is running: PID: 6666
HINWEIS - Die Option
-a
kann weggelassen werden, da dies der Standard ist, wenn kein -i [Name]
angegeben wird!
Der Status für das Postfix-Basis-Programm, kann mit nachfolgendem Befehl angezeigt werden:
# postmulti -i - -p status postfix/postfix-script: the Postfix mail system is running: PID: 6511
Der Status für die Postfix-Instanz postfix-eth0
, kann mit nachfolgendem Befehl angezeigt werden:
# postmulti -i postfix-eth0 -p status postfix-eth0/postfix-script: the Postfix mail system is running: PID: 6666
Nachfolgende die Bestätigung das Postfix gestartet ist und auf der IP-Adresse localhost (127.0.0.1)
und auf Port 25
lauscht, was bei einer Standard-Postfix-Konfiguration der Fall wäre und eine Postfix-Instanzen welche auf der IP-Adresse 192.168.0.20
und ebenfalls auf Port 25
lauscht:
( p.s. Da manche lieber Poni's als tulpen mögen, hier beide Befehle zur Überprüfung)
# lsof -Poni | grep master master 6511 root 13u IPv4 135951 0t0 TCP 127.0.0.1:25 (LISTEN) master 6666 root 13u IPv4 143387 0t0 TCP 192.168.0.20:25 (LISTEN)
# netstat -tulpen | grep master tcp 0 0 192.168.0.20:25 0.0.0.0:* LISTEN 0 143387 6666/master tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 0 135951 6511/master
Instanz stoppen
Um eine Postfix-Instanz mit nachfolgendem Befehl durchgeführt werden:
# postmulti -i postfix-eth0 -p stop postfix-eth0/postfix-script: stopping the Postfix mail system
Der Status für die Postfix-Instanz postfix-eth0
, kann mit nachfolgendem Befehl angezeigt werden:
# postmulti -i postfix-eth0 -p status postfix-eth0/postfix-script: the Postfix mail system is not running
Nachfolgende die Bestätigung das nur Postfix gestartet ist und auf der IP-Adresse localhost (127.0.0.1)
und auf Port 25
lauscht, was bei einer Standard-Postfix-Konfiguration der Fall ist und keine Postfix-Instanzen welche auf der IP-Adresse 192.168.0.20
und ebenfalls auf Port 25
lauscht mehr läuft:
( p.s. Da manche lieber Poni's als tulpen mögen, hier beide Befehle zur Überprüfung)
# lsof -Poni | grep master master 6511 root 13u IPv4 135951 0t0 TCP 127.0.0.1:25 (LISTEN)
# netstat -tulpen | grep master tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 0 135951 6511/master
Instanzen deaktivieren
Nachfolgender Befehl deaktiviert eine Instanz:
# postmulti -i postfix-eth0 -e disable
Eine Überprüfung, ob die Instanz nun deaktiviert ist, kann mit nachfolgendem Befehl durchgeführt werden:
# postmulti -l - - y /etc/postfix postfix-eth0 - n /etc/postfix-eth0
Instanz löschen
Soll eine sekundäre Postfix-Instanz gelöscht werden, muss eine Instanz deaktiviert, gestoppt sein und ihre Warteschlange darf keine Nachrichten enthalten.
HINWEIS - Der Versuch, die primäre Postfix-Basis-Instanz zu löschen, löst einen fatalen Fehler aus, ohne die Postfix-Basis-Instanz zu löschen.
Die Instanz wird aus dem alternate_config_directories
-Parameter der Postfix-Basis-Instanz in der Konfigurationsdatei main.cf
entfernt und ihre Daten-, Warteschlangen- und Konfigurationsverzeichnisse werden von Dateien und Verzeichnissen gereinigt, die vom Postfix-System selbst erstellt wurden. Die Konfigurationsdateien main.cf
und master.cf
sind aus dem Konfigurationsverzeichnis entfernt, auch wenn sie seit der ersten Erstellung geändert wurden. Schließlich wird die Postfix-Instanz aus der Liste der verwalteten Postfix-Instanzen „deportiert“.
Wenn andere Dateien in Postfix-Instanz Verzeichnissen vorhanden sind, werden die Verzeichnisse möglicherweise nicht vollständig entfernt, eine Warnung wird protokolliert.
ACHTUNG - Die Aktion
destroy
löst potenziell gefährliche Dateientfernungen aus. Es sollte sichergestellt sein, dass die Daten, die Warteschlange und die Konfiguration der Postfix-Instanz die richtigen sind. Die Verzeichnisse sollten keine Dateien enthalten, die noch aufgehoben bzw. gebraucht werden sollten!
Nachfolgen der Befehl zum löschen einer Postfix-Instanz:
# postmulti -i postfix-eth0 -e destroy rmdir: failed to remove 'pid': Directory not empty postfix/postmulti-script: warning: /var/spool/postfix-eth0/pid: please verify contents and remove by hand rmdir: failed to remove 'private': Directory not empty postfix/postmulti-script: warning: /var/spool/postfix-eth0/private: please verify contents and remove by hand rmdir: failed to remove 'public': Directory not empty postfix/postmulti-script: warning: /var/spool/postfix-eth0/public: please verify contents and remove by hand rmdir: failed to remove '/var/lib/postfix-eth0': Directory not empty postfix/postmulti-script: warning: /var/lib/postfix-eth0: please verify contents and remove by hand rmdir: failed to remove '/var/spool/postfix-eth0': Directory not empty postfix/postmulti-script: warning: /var/spool/postfix-eth0: please verify contents and remove by hand
Entsprechend der Warnungen, können die genannten Dateien und Verzeichnisse mit nachfolgendem Befehl(en) ebenfalls gelöscht werden:
# rm -rf /var/spool/postfix-eth0 /var/lib/postfix-eth0
Eine Überprüfung, ob die Instanz nun gelöscht ist, kann mit nachfolgendem Befehl durchgeführt werden:
# postmulti -l - - y /etc/postfix
Konfiguration: Gesamtübersicht
/etc/postfix/main.cf
# postmulti -i - -x postconf -n alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases command_directory = /usr/sbin config_directory = /etc/postfix daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 html_directory = no inet_interfaces = localhost inet_protocols = ipv4 mail_owner = postfix mailq_path = /usr/bin/mailq.postfix manpage_directory = /usr/share/man multi_instance_directories = /etc/postfix-eth0 multi_instance_enable = yes multi_instance_wrapper = ${command_directory}/postmulti -p -- mydestination = $myhostname, localhost.$mydomain, localhost newaliases_path = /usr/bin/newaliases.postfix queue_directory = /var/spool/postfix readme_directory = /usr/share/doc/postfix-2.11.11/README_FILES sample_directory = /usr/share/doc/postfix-2.11.11/samples sendmail_path = /usr/sbin/sendmail.postfix setgid_group = postdrop unknown_local_recipient_reject_code = 550
/etc/postfix/master.cf
# egrep -v "^$|^.*#" /etc/postfix/master.cf 127.0.0.1:smtp inet n - n - - smtpd pickup unix n - n 60 1 pickup cleanup unix n - n - 0 cleanup qmgr unix n - n 300 1 qmgr tlsmgr unix - - n 1000? 1 tlsmgr rewrite unix - - n - - trivial-rewrite bounce unix - - n - 0 bounce defer unix - - n - 0 bounce trace unix - - n - 0 bounce verify unix - - n - 1 verify flush unix n - n 1000? 0 flush proxymap unix - - n - - proxymap proxywrite unix - - n - 1 proxymap smtp unix - - n - - smtp relay unix - - n - - smtp showq unix n - n - - showq error unix - - n - - error retry unix - - n - - error discard unix - - n - - discard local unix - n n - - local virtual unix - n n - - virtual lmtp unix - - n - - lmtp anvil unix - - n - 1 anvil scache unix - - n - 1 scache
/etc/postfix-eth0/main.cf
# postmulti -i postfix-eth0 -x postconf -n alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases authorized_submit_users = command_directory = /usr/sbin config_directory = /etc/postfix-eth0 daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix-eth0 debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 html_directory = no inet_interfaces = 192.168.0.20 inet_protocols = ipv4 mail_owner = postfix mailq_path = /usr/bin/mailq.postfix manpage_directory = /usr/share/man master_service_disable = multi_instance_enable = yes multi_instance_group = mta multi_instance_name = postfix-eth0 mydestination = $myhostname, localhost.$mydomain, localhost newaliases_path = /usr/bin/newaliases.postfix queue_directory = /var/spool/postfix-eth0 readme_directory = /usr/share/doc/postfix-2.11.11/README_FILES sample_directory = /usr/share/doc/postfix-2.11.11/samples sendmail_path = /usr/sbin/sendmail.postfix setgid_group = postdrop unknown_local_recipient_reject_code = 550
/etc/postfix-eth0/master.cf
# egrep -v "^$|^.*#" /etc/postfix-eth0/master.cf 192.168.0.20:smtp inet n - n - - smtpd pickup unix n - n 60 1 pickup cleanup unix n - n - 0 cleanup qmgr unix n - n 300 1 qmgr tlsmgr unix - - n 1000? 1 tlsmgr rewrite unix - - n - - trivial-rewrite bounce unix - - n - 0 bounce defer unix - - n - 0 bounce trace unix - - n - 0 bounce verify unix - - n - 1 verify flush unix n - n 1000? 0 flush proxymap unix - - n - - proxymap proxywrite unix - - n - 1 proxymap smtp unix - - n - - smtp relay unix - - n - - smtp showq unix n - n - - showq error unix - - n - - error retry unix - - n - - error discard unix - - n - - discard local unix - n n - - local virtual unix - n n - - virtual lmtp unix - - n - - lmtp anvil unix - - n - 1 anvil scache unix - - n - 1 scache
Konfiguration: Beispiel
Einschränkung: mydestination
Eine mögliche Erweiterung der Postfix-Instanz - postfix-eth0
könnte z.B. sein, dass diese nur E-Mail's entgegen nimmt, die auf [User]@buero.home.tachtler.net
lauten und nicht mehr auf z.B. [User]@localhost
.
Dies kann z.B. durch Änderungen des Parameters
mydestination
erfolgen, wie nachfolgende Befehle zeigen.
Setzen des FQDN buero.home.tachtler.net
beim Parameter mydestination
, damit sich die die Postfix-Instanz - postfix-eth0
, nur noch für E-Mail's mit der E-Mail-Adressausgestaltung [User]@buero.home.tachtler.net
als final (destination)
zuständig fühlt:
# postmulti -i postfix-eth0 -x postconf -e "mydestination = buero.home.tachtler.net"
Zur Überprüfung, ob der vorhergehenden Befehl korrekt umgesetzt wurde, kann die Anzeige des Inhalts des Parameters mit nachfolgendem Befehl zum Vorschein gebracht werden:
# postmulti -i postfix-eth0 -x postconf mydestination mydestination = buero.home.tachtler.net
Damit auch alle, außer die Domains und Top-Level-Domains welche in mydestination
eingetragen sind auch abgelehnt (REJECT
) werden, ist nachfolgende Konfiguration zusätzlich noch erforderlich:
# postmulti -i postfix-eth0 -x postconf -e "smtpd_recipient_restrictions = reject_unauth_destination"
Zur Überprüfung, ob der vorhergehenden Befehl korrekt umgesetzt wurde, kann die Anzeige des Inhalts des Parameters mit nachfolgendem Befehl zum Vorschein gebracht werden:
# postmulti -i postfix-eth0 -x postconf smtpd_recipient_restrictions smtpd_recipient_restrictions = reject_unauth_destination
Abschließen müssen die Änderungen durch das erneute einlesen der Konfiguration für die Postfix-Instanz - postfix-eth0
mit nachfolgendem Befehl noch aktiviert werden:
# postmulti -i postfix-eth0 -p reload postfix-eth0/postfix-script: refreshing the Postfix mail system
Nachfolgende abschließende Test zeigen, ob die Konfiguration zur Erreichung des Ziels erfolgreich war.
E-Mail zur Postfix-Instanz - postfix-eth0
mit Empfänger: klaus@localhost
:
# swaks --server 192.168.0.20 --to klaus@localhost === Trying 192.168.0.20:25... === Connected to 192.168.0.20. <- 220 buero.home.tachtler.net ESMTP Postfix -> EHLO buero.home.tachtler.net <- 250-buero.home.tachtler.net <- 250-PIPELINING <- 250-SIZE 10240000 <- 250-VRFY <- 250-ETRN <- 250-ENHANCEDSTATUSCODES <- 250-8BITMIME <- 250 DSN -> MAIL FROM:<root@buero.home.tachtler.net> <- 250 2.1.0 Ok -> RCPT TO:<klaus@localhost> <** 554 5.7.1 <klaus@localhost>: Relay access denied -> QUIT <- 221 2.0.0 Bye === Connection closed with remote host.
E-Mail zur Postfix-Instanz - postfix-eth0
mit Empfänger: klaus@buero.home.tachtler.net
:
# swaks --server 192.168.0.20 --to klaus@buero.home.tachtler.net === Trying 192.168.0.20:25... === Connected to 192.168.0.20. <- 220 buero.home.tachtler.net ESMTP Postfix -> EHLO buero.home.tachtler.net <- 250-buero.home.tachtler.net <- 250-PIPELINING <- 250-SIZE 10240000 <- 250-VRFY <- 250-ETRN <- 250-ENHANCEDSTATUSCODES <- 250-8BITMIME <- 250 DSN -> MAIL FROM:<root@buero.home.tachtler.net> <- 250 2.1.0 Ok -> RCPT TO:<klaus@buero.home.tachtler.net> <- 250 2.1.5 Ok -> DATA <- 354 End data with <CR><LF>.<CR><LF> -> Date: Sat, 18 May 2019 23:08:47 +0200 -> To: klaus@buero.home.tachtler.net -> From: root@buero.home.tachtler.net -> Subject: test Sat, 18 May 2019 23:08:47 +0200 -> Message-Id: <20190518230847.006877@buero.home.tachtler.net> -> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/ -> -> This is a test mailing -> -> . <- 250 2.0.0 Ok: queued as BFA022C69A -> QUIT <- 221 2.0.0 Bye === Connection closed with remote host.
Die E-Mail an die Postfix-Instanz - postfix-eth0
mit dem Empfänger klaus@buero.home.tachtler.net
sieht dann wie folgt aus:
# cat /var/spool/mail/klaus From root@buero.home.tachtler.net Sat May 18 23:08:47 2019 Return-Path: <root@buero.home.tachtler.net> X-Original-To: klaus@buero.home.tachtler.net Delivered-To: klaus@buero.home.tachtler.net Received: from buero.home.tachtler.net (buero.home.tachtler.net [192.168.0.20]) by buero.home.tachtler.net (Postfix) with ESMTP id BFA022C69A for <klaus@buero.home.tachtler.net>; Sat, 18 May 2019 23:08:47 +0200 (CEST) Date: Sat, 18 May 2019 23:08:47 +0200 To: klaus@buero.home.tachtler.net From: root@buero.home.tachtler.net Subject: test Sat, 18 May 2019 23:08:47 +0200 Message-Id: <20190518230847.006877@buero.home.tachtler.net> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/ This is a test mailing
Nützliche Befehle
Für die primäre Postfix-Instanz kann für [Name]
das einzelne Zeichen -
verwendet werden, z.B. zur Anzeige des Status:
# postmulti -i - -p status
Befehl | Beschreibung |
---|---|
postmulti -e init | Multi-Instanz-Unterstützung aktivieren |
postmulti -I [Name] -G [Gruppe] -e create | Erstellen einer Instanz (Parameter -G [Gruppe] ist optional) |
postmulti -l | Liste aller Instanzen in einer Multi-Instanz-Umgebung |
postmulti -i [Name] -e enable | Aktivieren einer Instanz |
postmulti -i [Name] -e disable | Deaktivieren einer Instanz |
postmulti -i [Name] -x postconf -e „master_service_disable =“ | Keine master -Listener blockieren. |
postmulti -i [Name] -x postconf [Parameter] | Ausgabe des aktuell gesetzten Wertes eines Parameters |
postmulti -i [Name] -p start | Starten einer Instanz |
postmulti -i [Name] -p status | Status einer Instanz anzeigen |
postmulti -i [Name] -p reload | Konfiguration einer Instanz neu einlesen |
postmulti -i [Name] -p stop | Stoppen einer Instanz |
postmulti -i [Name] -e destroy | |