Direkt zum Inhalt
30.08.2013 - Fachbeitrag

Mit Postfix transport_maps an zwei Server gleichzeitig routen

postfixNormalerweise werden Mails nach den MX-Records im DNS geroutet -- und hier können unter anderem mehrere MX-Records mit gleichen oder unterschiedlichen Prioritäten parallel angegeben werden, um Ausfallsicherheit und Lastverteilung zu realisieren. Wenn jedoch manuelle Routing-Einträge in der transport_maps von Postfix vorgenommen werden, ist die Angabe mehrere Ziel-Hosts nicht möglich -- es sei denn, man wendet einen DNS-Trick an.

Ein Eintrag in der transport_map hat folgenden Syntax:

 

example.com        smtp:[mailserver1.example.com]


Die eckigen Klammern weisen Postfix an, daß nach dem A-Record (=der IP-Adresse) von mailserver1.example.com gesucht werden soll. Würden die eckigen Klammern fehlen, so sucht Postfix nach dem MX-Record und (falls dieser nicht vorhanden ist) erst dann nach den A-Record.

Ein redundantes Routing läßt sich jetzt leicht aufsetzen, indem unter einer beliebigen (aber eben erreichbaren) DNS-Zone entsprechende MX-Records eingetragen werden, auf die dann in der transport_maps verwiesen wird. Ich nenne das oft eine "Meta-Domain", weil dieser Eintrag in der Praxis ausschließlich benutzt wird, um Postfix passende MX-Records zu präsentieren.

Ein Beispiel macht es deutlich: Ein Provider mit hosted Spamfilterung empfängt die Mails eines Kunden "example.com", die MX-Records zeigen also auf den ISP. Gleichzeitig will der Provider nach der Filterung die Mails an die beiden Mail-Relays des Kunden redundant weiterleiten.

Der Provider setzt sich darum für jeden Kunden eigene MX-Records in seinem eigenen DNS-Zonenfile auf:

 

example.com.heinlein-support.de.    MX 10  mx1.example.com.

example.com.heinlein-support.de.    MX 10  mx2.example.com.


für den Fall, daß mx1.example.com bereits in den DNS-Daten des Kunden richtig mit A-Records definiert ist. Für den Fall, daß die Ziel-Hostnamen noch nicht feststehen, kann der Provider sich diese ebenfalls selbst definieren:

 

example.com.heinlein-support.de.    MX 10  mx1.example.com.heinlein-support.de.

example.com.heinlein-support.de.    MX 10  mx2.example.com.heinlein-support.de.



mx1.example.com.heinlein-support.de.     A  xxx.xxx.xxx.xxx

mx2.example.com.heinlein-support.de.     A  xxx.xxx.xxx.xxx


und ist so vom DNS des Kunden unabhängig (was Vor- und Nachteile hat).

Anschließend kann der Provider in seinen transport_maps von Postfix die Mail des Kunden bequem nach diesen MX-Records routen, natürlich ohne eckige Klammern:

 

example.com        smtp:example.com.heinlein-support.de


Fertig!

Auf diese Art und Weise lassen sich auch komplexe interne Mailroutings zwischen MX-Gateways und Spam-/Virenfiltern hervorragend und leicht absichern, ohne Loadbalancer oder andere Sachen in Anspruch nehmen zu müssen. Auch gewichtetes Standortübergreifendes Routing ist so über unterschiedlich gewichtete MX-Records möglich.

Kommentare

7 Antworten zu Mit Postfix transport_maps an zwei Server gleichzeitig routen

s-Icon
Steffen
15. May 2014 um 18:30

Nach Stundenlangem suchen war das hier wohl der Artikel im Netz der so nahe an mein Problem ran kam wie es wohl nur geht.

Es ist auch eher speziell.

Ich soll eine Mail verschicken als "mail@intern.de" and mehrere "bla@intern.de" ... der Server steht aber extern. Also sagt der gegenüber mail server das "mail@intern.de" hier nicht rein darf weil der ja schon "drin" ist.

Macht Sinn. Somit weniger SPAM.

Also bekome ich die Anweisung die Mail nicht an den offiziellen im MX eingetragenen Mail Server zu schicken sondern an michkenntniemandmailserver.intern.de ... welche dieMail dan intern korrekt verschicken würde.

Schlau wie ich war dachte ich mir erst ... Mensch das trägt man mal kurz in die hosts Datei ein und fertig. Pustekuchen. Für pingund sonstige Scherze zieht das natürlich aber nicht für postfix.

Mail empfangen und mit postifx dann je nach Absender zu verteilen, zu leiten, etc. geht auch prima.

Aber eben das "leiten beim verschicken" bekomme ich irgendwie nicht aus der Doku rauskristalisiert.

Irgend eine Idee?

s-Icon
Sven
18. August 2017 um 18:37

Im Zeitalter von TLS Verschlüsselung wird das nicht mehr klappen. Die Mailserver müssen DNS Namen haben, die mit den TLS Zertifikaten übereinstimmen.

p-Icon
Peer Heinlein
19. August 2017 um 06:01

Doch, das klappt problemlos.

Die Server haben ja zwei verschiedene Hostnamen -- mx1 und mx2 -- und Postfix erkennt beide Namen über die MX-Records. Postfix weiß ganz genau mit wem er redet und das TLS-Zertikat muß halt zum jeweiligen Hostnamen passen.

Da ist kein Problem im Weg...

s-Icon
Steve
25. September 2018 um 19:06

Hallo,

Danke für die Hilfestellung !

Leider sendet unser intern gehosteter Mailserver die E-Mails abwechselnd an einen der beiden im A-Record angegebenen IP Adressen bzw. Mail-Backends.

Gibt es eine Konfiguration im Postfix, die man noch setzen muss, dass ankommende Mails an beide Backend-Server geschickt werden?

p-Icon
Peer Heinlein
26. September 2018 um 08:26

Man sollte bei Mailservern nicht auf einen Host zwei A-Records legen.

Das ist auch überflüssig -- denn genau dafür gibt es MX-Records und genau dafür kann man dann zwei mal einen MX10 definieren -- oder eben einmal MX10 und einmal MX20 wenn man das unterschiedlich behandeln möchte.

s-Icon
Steve
26. September 2018 um 10:48

Danke für die schnelle Antwort,

in unserer Infrastruktur verfügen wir über einen öffentlich erreichbaren DNS Server. Dieser Server ist physisch getrennt zu den Mailservern.

Beim oben genannten HowTo habe ich es so verstanden, dass man zwei MX Records einer Sub-Domain erstellt, die gleich priorisiert sind. Die beiden MX-Records verweisen aber auf unterschiedliche DNS-Zonen.

example.com.heinlein-support.de. MX 10 mx1.example.com.heinlein-support.de.
example.com.heinlein-support.de. MX 10 mx2.example.com.heinlein-support.de.

Damit die DNS-Zonen geroutet werden können, muss man dann den A-Record hinterlegen. In meinem Fall ein intern gehosteter Mail Server und eine E-Mail Cloud Plattform. :)
Der Cloud Server wechselt dabei die IP Adressen. Deshalb haben wir den Namen hinterlegt und nicht die IP.

mx1.example.com.heinlein-support.de. A xxx.xxx.xxx.xxx
mx2.example.com.heinlein-support.de. A xxx.xxx.xxx.xxx

Da Postfix nur einen Relay Eintrag pro Domain akzeptiert, muss man nun die vorher erstellte Sub-Domain angeben, da hinter der Sub-Domain zwei Adressen zu finden sind, schickt Postfix durch die identische Priorisierung an beide Mailserver.

example.com smtp:example.com.heinlein-support.de

In meinem Umfeld Sendet Postfix etwa 2/3 an den internen Server und 1/3 an den Cloud Mailserver.

Kann es sein, dass wir Probleme mit der Verteilung haben weil einer der beiden Mail Server eine niedrigere Latenz hat und somit schneller auf die anfragen antwortet?

t-Icon
Thomas
17. January 2020 um 17:39

Hallo,

vielen Dank für die gite Beschreibung!
Ich habe bei mir Postfix und DNS wie beschrieben konfiguriert.
Es gibt nun mehrere MX Einträge mit der gleichen Priorität 10.

Leider stellt Postfix (hier 2.11) jede Mail immer nur an EINEN der MX Einträge zu.
Ich möchte aber gerne, dass jede Mail AN ALLE als MX eingetragene Server gleichzeitig zugestellt wird.
Mache ich noch etwas falsch oder habe ich diesen Beitrag falsch verstanden?

Viele Grüße,
Thomas