Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:sysadmin:tools:postfix

Postfix Spickzettel

Eine kleine Sammlung (kein HOWTO) von Erfahrungen zu Postfix: Befehle, wichtige Konfigurationsdateien, Smart-Host einstellen, Absenderadresse ohne Hostanteil, Aliase und andere Nachschlageverzeichnisse, Operationen an der Mailqueue

Überblick

Anders als bei Sendmail gibt es bei Postfix einige für die jeweilige Aufgabe spezialisierte Programme. Dabei wird auch auf "Privilege Separation" 1) geachtet: Der Prozess "master" läuft noch als root, alles andere üblicherweise unter dem speziellen Benutzer "postfix".

Was welcher Prozess macht und wie das grundsätzlich mit dem Mail-Empfangen und Ausliefern funktioniert, findet man am besten im Postfix Overview(englisch)

So sieht das aus, wenn man pstree auf einem meiner Mailserver ausführt:

master─┬─2*[bounce(postfix)]
       ├─2*[cleanup(postfix)]
       ├─local(postfix)
       ├─pickup(postfix)
       ├─qmgr(postfix)
       ├─5*[smtp(postfix)]
       ├─5*[smtpd(postfix)]
       └─trivial-rewrite(postfix)

Befehle

Queue ansehen:

  • mailq

Mail-Inhalt ansehen

  • postcat -q mailid

Postfix postsuper Befehl:

  • postsuper -d mailid - DELETE - löschen
  • postsuper -h mailid - hold - auf Eis legen
  • postsuper -H mailid - unhold ;-) - wieder in die Mail-Queue bringen
  • postusper -r mailid - requeue - neu in die Mail-Queue stellen (evtl. Änderungen an Aliases, Zustellregeln usw. werden berücksichtigt)
    • Beispiel: Alle Mails die vom Dienstag in der Mail-Queue rumhängen jetzt gleich mal neu verschicken:
      postsuper `mailq | awk '/Tue/ {print "-r " $1}'`
    • postsuper -r ALL - alle Mails neu in die Queue stellen
  • postsuper -p - "purge" - alte tmp-Dateien wegwerfen
  • postsuper -s - structure check - bevor man Postfix startet, tut ein kleiner Systemcheck nicht weh ..

geänderte Listen ("Lookup Table") und Aliase-Dateien

  • postalias /etc/aliases - erzeugt eine neue alias.db
  • postmap /etc/postfix/datei

Wichtige Dateien

liegen in meistens in /etc/postfix.

  • /etc/aliases oder /etc/postfix/aliases - Mailzustell-Liste
  • main.cf - die wichtigsten Einstellungen des eigentlichen Mailservers sind hier - oder hier gesourced ….
  • master.cf - Parameter für den Start der einzelnen Prozesse und "Aussenkommunikation"
  • und viele mehr … je nach Konfiguration des Servers

main.cf und Konsorten beinhalten normalerweise sehr viele hilfreiche Kommentare → LESEN!

lokale Anpassungen und Änderungen passieren hauptsächlich in main.cf.

Achtung SUSE: Yast hängt die Änderungen hinten an die main.cf an (solange man nichts von Hand geändert hat, danach lässt der Yast zum Glück die Datei so stehen).

SMTP-Relay (Smarthost)

Wenn die Mail nicht direkt über das Internet versendet werden soll, sondern über ein Relay namens "RechnernameoderIPAdresse"

in der main.cf:

relayhost = [RechnernameoderIPAdresse]

(In eckigen Klammern, wenn das nicht mit den passenden DNS-Einstellungen zum MX passt)

g'scheide Absenderadressen

wenn die Mail nicht von root@rechnername.example.com versendet werden soll, sondern von root@example.com …

in der main.cf:

mydomain = example.com
myorigin = $mydomain

"Datenbanken" / Nachschlage-Tabellen

Die "üblichen" Verzeichnisstypen / "Datenbanken" werden bei Postfix als Textdatei geschrieben und für's schnelle Lesen typischerweise in das Berkley-DB Format umgewandelt. Ausserdem kann Postfix auch Dateien mit Regulären Ausdrücken verarbeiten 2) Relationale Datenbanken (MySQL, Postgres), Verzeichnisdiensten wie LDAP oder NIS+ sind auch möglich (LDAP und NIS habe ich aber noch nicht verwendet).

:!: Erfahrungswert: Im Gegensatz zu sendmail mag Postfix die Einträge in seinen Nachschlage-Tabellen kleingeschrieben - wenn da Anna.Beispiel steht, wird evtl. die Mail an anna.beispiel nicht angenommen … Andersherum schon (wenn in der Tabelle anna.beispiel steht, wird Anna.Beispiel auch angenommen).

Typ Alias

genau wie bei Sendmail ….

Format:
key: wert

Beispiel: /etc/aliases aliases - Trennzeichen ":"

root:           me@example.com
anna.beispiel:  anna
beispiels:      anna,bertram,cecilie
trash:          /dev/null

Was tut das? Hier wird der Empfänger umgeschrieben.

  • Mail an root wird an die Adresse me@example.com geschickt.
  • Mail an anna.beispiel wird an anna geschickt.
  • Mail an beispiels wird an anna, bertram und cecilie geschickt - kleine Mailinglisten sind also auch möglich.
  • Mail an trash wird in die Datei /dev/null gelegt - also weggeworfen

Voraussetzung: in der main.cf gibt es den Eintrag alias_maps = hash:/etc/aliases (Eine Alias-Datei gehört zur üblichen Default-Konfiguration)

Die passende Berkley-DB (aliases.db) erzeugt man mit dem Befehl postalias /etc/aliases - dieser Befehl muss nach jeder Änderung an der jeweiligen Textdatei ausgeführt werden.

Typ Map / Lookup Table

Format:
key wert

Beispiel: sender_canonical

anna     anna.beispiel@unixwitch.de

Was tut das? Hier wird der Absender umgeschrieben. Wenn der Benutzer "anna" Mails versendet, werden sie mit der Adresse anna.beispiel@unixwitch.de3) rausgeschickt.

Voraussetzung: in der main.cf gibt es die Zeile sender_canonical_maps = hash:/etc/postfix/sender_canonical

Die passende Berkley-DB (sender_canonical.db) erzeugt man mit dem Befehl postmap /etc/postfix/sender_canonical - dieser Befehl muss nach jeder Änderung an der jeweiligen Textdatei ausgeführt werden.

Typ regexp - Reguläre Ausdrücke

Einfaches Beispiel: Mails an viele Domains wird angenommen, aber normalerweise bekommt Anna Beispiel und alle anderen Benutzer immer die Mails unabhängig von der Domain (Mails an anna.beispiel@firma1.example.com oder anna.beispiel@company2.example werden ins selbe Postfach geleitet).

Aber: je nach Domain gibt es verschiedene Ansprechpartner, und die Mails an info@firma1.example.com soll an eine andere Adresse geleitet werden, als an info@company2.example.

Voraussetzung: in der main.cf gibt es folgenden Eintrag:

recipient_canonical_maps = regexp:/etc/postfix/recipient_canonical-regexp

(Man kann sich natürlich auch einen weniger komplizierten Namen ausdenken …)

#/etc/postfix/recipient_canonical-regexp
/^info@firma1.example.com/      ticketsystem@ticketserver.firma1.example.com
/^info@company2.example/        company2-info@example.net

Mails aus der Queue reparieren

Dateien in den Postfix-Mail-Queues sind in einem Binary-Format, deswegen kann man sie bei Problemen nicht direkt ändern (anders als bei Sendmail) - wenn man es trotzdem versucht, werden sie von Postfix als "korrupt" markiert.

  • Mail auf Eis legen

# postsuper -h MAILID

  • Mail in eine temporäre Datei speichern

# postcat -q MAILID > /tmp/mail.txt

  • Datei wie nötigt ändern

# vim /tmp/mail.txt geplante Änderungen und
→ Zeilen am Anfang löschen: von (einschliesslich)
*** ENVELOPE RECORDS hold/MAILID *** bis
*** MESSAGE CONTENTS hold/MAILID ***
→ Zeilen am Ende löschen: von (einschliesslich)
*** HEADER EXTRACTED hold/MAILID *** bis
*** MESSAGE FILE END hold/MAILID ***

  • Datei wieder als Mail senden, SENDER und EMPFÄNGER angegeben!

# sendmail -f sender@fromdomain.example empfaenger1@example.com empfaenger2@woanders.example.org < /tmp/mail.txt

  • original-Mail löschen

postsuper -d MAILID

Beispiel: Operationen an der Mailqueue

Alle Mails vom MAILER-DAEMON erst aus der Mailqueue rausholen und als Datei ablegen:

x=`mailq | awk '/MAILER-DAEMON/ {print $1}' |sed s/\!// `
for m in $x;do echo "== $m ==" ;echo; postcat -q $m > $m ; postsuper -d $m; echo ;done

$Kunde hat eine nicht sonderlich aktuelle Adressdatenbank, damit das Maillog über das Wochenende nicht volläuft, mal alle fehlerhaften Domains rausfinden 4) und diese Mails auf Hold legen:

for x in $nichtzustellbaredomains; do mailq |grep -B2 $x | awk '!/\(/ && $1 !~ /@/  && !/--/ &&!/!/ {print $1}' | xargs -n1 -i postsuper -h {} ; done

siehe auch:


2)
IIRC: die Dateien mit regulären Ausdrücken werden beim Start von Postfix in den Speicher gelesen (Nachteil: bei Änderungen muss Postfix neu gestartet werden), Berkley-DB Dateien können live geändert werden und sind kurz darauf wirksam. (FIXME: Quelle)
3)
Auf meinem Mailserver ist die arme Anna inzwischen diejenige, die am meisten Spam erhält :-) … was gut zeigt, dass man Mailadressen nicht auf Webseiten schreiben soll, wenn man keinen Spam erhalten will.
4)
mailgrep "Host or domain name not found" maillog | awk '/to=/ {print $8} ' | awk -F '@' '{print $2}' | sort | uniq -c | sort -n
de/sysadmin/tools/postfix.txt · Zuletzt geändert: 2019-10-10 15:41 von hella

Seiten-Werkzeuge

Mastodon Twitter