Postfix extern per relayhost wenn intern nicht möglich?

mail
german

#1

Postfix möchte ja Mails an die interne Domain immer intern zustellen.

Gibt es eine einfach Möglichkeit es so zu konfigurieren das er das nur versucht wenn es intern mit der Mailzustellung klappt und wenn das fehlschlägt die Mail an den externen relayhost zustellt?

Oder wenn das nicht geht das er dann eben alles extern zustellt auch wenn es sich um “interne” Mailadressen handelt?


#2

Moin,

leider kann man Postfix nicht sagen »probier’s lokal, ansonsten extern«, aber es gibt Umwege.

Der Fall »alle E-Mails über einen externen Server zustellen, auch wenn die Domäne als lokale Domäne angesehen wird« hat den Nachteil, dass keinerlei E-Mails lokal zugestellt werden. Falls das auch nicht benötigt wird, dann sollte eine Domäne gar nicht erst als lokal konfiguriert werden. Trotzdem kann man das Zustellen über einen anderen Server erzwingen, indem für die Domäne ein Eintrag in der transport_maps angelegt werden. Dieser sieht so aus:

domain.int smtp:externer.serv.er

Unter UCS gibt’s dafür UCR-Variablen (»mail/maps/transport/…«), also die Datei nicht direkt editieren.

Geht es weiterhin darum, nur einige wenige Zieladressen an einen externen Server schicken, so kann man evtl. für diese einzelnen E-Mail-Adressen transport_maps-Einträge pflegen. Dann wäre nichts weiter zu tun.

Leider ist die Situation oft genau umkehrt: generell gibt es beliebig viele E-Mails in der Domäne, die an den externen Server geschickt werden müssen, und wir haben keine Kontrolle darüber, welche das sind, sprich manuelle Pflege derjenigen, die nicht bei uns liegen, ist nicht machbar. Was wir aber unter Kontrolle haben, ist die Liste der User, die lokal existieren, das sind schlicht diejenigen im UCS-LDAP.

Solche Fälle sind problematisch. Postfix muss wissen, welche E-Mail-Adressen in einer lokalen Domäne existieren, ansonsten lehnt der die Annahme ab. Das gilt auch für Adressen, die keine lokalen Postfächer haben. Wenn also beispielsweise in einer Umgebung, in der sowohl ein Exchange- als auch ein Zarafa-Server für dieselbe Domäne zum Einsatz kommen (letzterer unter UCS), so muss Postfix so konfiguriert werden, dass

[ul][li]die Lookups »existiert Ziel lokal?« für beide Fälle funktionieren und[/li]
[li]die Entscheidung »wohin schicke ich diese Mail?« anhand der Information, in welchem Verzeichnis der User existiert, getroffen wird.[/li][/ul]

Für das oben genannte Beispiel, bei dem man direkt per LDAP das AD abfragen kann, kann man eine Konstruktion bauen, in der der Check nach lokal existieren Accounts sowohl an das AD als auch an das LDAP geht (Stichpunkt local_recipients_maps). Weiterhin muss man dann die transport_maps mit LDAP-Abfragen aufbohren, die als Ergebnis für alle AD-User ein »smtp:exchange.server.ip« liefern.

Haben wir aber eine andere Situation, z.B. wenn wir keine Möglichkeit haben, die lokal nicht existierenden BenutzerInnen aufzulisten, so wird’s kompliziert. In so einem Fall rate ich eher dazu, die Domäne eben nicht lokal zu halten, sondern auf dem UCS nur eine Dummy-Domäne zu verwenden, beispielsweise: wenn die echte Domäne real.domain lautet, dann wird für die UCS-User dummy.domain genommen. Zusätzlich kann dann durch dynamisch via LDAP-Abfragen erzeugtes Umschreiben (virtual_alias_maps) von Envelope-Empfänger-Adressen die lokal existierenden User auf ihre dummy.domain-Adressen erfolgen, wodurch erreicht wird, dass die E-Mails auf dem lokalen Server verbleiben.

Zusammenfassend: ja, es geht, aber wie hängt der Situation ab, und trivial ist es leider in keinem Fall.


#3

Hi Moritz Danke erstmal für die ausführliche Antwort!

"Trotzdem kann man das Zustellen über einen anderen Server erzwingen, indem für die Domäne ein Eintrag in der transport_maps angelegt werden. Dieser sieht so aus:

Code: Alles auswählen
domain.int smtp:externer.serv.er"

Geht das auch so einfach wenn alle Mails über einen externen Relayserver mit auhentifizierung gehen muss?

Nur kurz zur Erklärung wie die Situation ist:

Eigene Domain mit ca. 15 Emailadressen liegt bei 1und1.
lokal läuft eine WIndows 2012 Domäne
Der UCS mit Postfix und Zarafa ist Domänenmitglied und die User werden gesynced

Nun sollen die meisten (aber eben nicht alle!) E-Mails über den UCS/Zarafa/PostFix genutzt werden. Und zwar Abholung über Fetchmail (kein Problem) und Versand über smtpauth und den 1und1 Server als Relayserver.

Daher habe ich in der Domäne bei den Usern die 1und1 Emailadresse bei jedem User eingetragen.

Effekt: Eine Kommunikation von intern an die User die die Email noch direkt bei 1und1 nutzen ist nicht möglich. Das soll ermöglicht werden.

Die Lösung einen “unechte” Maildomain für die interne Kommunikation zu nutzen finde ich sehr unellegant da dann ja jeder User immer überlegen muß ob er an intern oder extern mailen will, ob der Kollege überhaupt über intern erreichbar ist… Das wollen die nicht und würden dann eh nur an die externe Mailadresse addressieren. Oder habe ich da einen Denkfehler?

Ich vermute das ich mit dieser Situation nicht der erste bin… Gibt es da eine “best practise” Lösung?


#4

Moin,

Ja, Sie haben da einen Denkfehler :slight_smile:

Die unechte Domäne kommt nur bei der Verwaltung zum Tragen, nicht aber bei der Benutzung. Was ich damit meine (für ein Beispiel, bei dem die externe, öffentliche Domäne @external.domain lautet):

[ul][li]Sie legen in UCS einen User mit internal-user@internal.domain als E-Mail-Adresse an.[/li]
[li]Sie lassen Postfix über die virtual internal-user@internal.domain umschreiben (das kann man automatisiert über LDAP regeln, wenn man genau weiß, wie, aber das sprengt dann doch etwas den Rahmen kostenloser Hilfestellung)[/li]
[li]Jetzt gibt es vier Szenarien, hier nur beispielsweise eines davon: ein anderer interner schickt eine E-Mail an internal-user@internal.domain um und stellt an Zarafa zu.[/li][/ul]

Die E-Mails an externe User hingegen werden regulär rausgeschickt.

Für das authetifizierte Relayen nimmt man normalerweise nicht die transport_maps sondern schlicht die Postfix-Option »relayhost« (UCR-Variable »mail/relayhost«) und aktiviert Authentifizierung mittels »smtp_sasl_auth_enable« (UCR-Variable »mail/relayauth«). Benutzername und Passwort werden nach »/etc/postfix/smtp_auth« geschrieben. Siehe die ausführliche UCS-Doku dazu.


#5

Hi Herr Bunkus,

vielen Dank erstmal für Ihre bisherige Mühe!

Wenn ich das richtig verstehe dann mache ich jetzt also folgendes: In den Useraccounts auf meiner Window 2012 Domäne “intern.local” ersetze ich die externen “echten” E-Mailadressen durch die internen wie z. B. “Mustermannxyz@intern.local”. Die wird dann ja in den UCS gesynct.

Dort muss ich nur noch in Postfix eine Übersetzung interne -> externe Mailadresse einrichten. Bei den 15 usern ist das manuell durchaus noch zu schaffen so das ich auf einen Automatismus verzichten kann.

Was ist mit der Einstellung der Mail Domäne? Da hatte ich bisher ja “externedomaene.de” drinstehen. Muss das in “internedomaene.local” geändert werden? Oder müssen da beide Domänen rein? Also die interne wie die externe?

Die Frage ist nur wo und wie genau man das macht?

Ich habe das hier gefunden und werde das mal ausprobieren:

[quote]Generic Mapping

Viele Hosts besitzen keine gültige Internetdomain und verwenden stattdessen eine Bezeichnung wie z.B. localdomain.local. Will man Mails über das Internet verschicken, so werden diese von vielen Mail-Servern abgelehnt. Mittels Generic Mapping umgeht man das Problem indem man lokale Mail-Adressen durch reale ersetzt bevor sie via SMTP verschickt werden.

Die Datei /etc/postfix/main.cf muss zunächst um diese Zeile ergänzt werden.

smtp_generic_maps = hash:/etc/postfix/generic

Außerdem muss man /etc/postfix/generic erstellen und in etwa so mit Einträgen versehen.

mustermann1@1und1.de
mustermann2@1und1.de

Die linken Einträge sind die (ungültigen) Mail-Adressen auf dem lokalen Server, die rechten Einträge entsprechen den (gültigen) realen eMail-Adressen.

Das Mapping muss jetzt noch aktualisiert werden.

postmap /etc/postfix/generic

Zum Schluss wird die Konfiguration neu eingelesen. Fertig.

/etc/init.d/postfix reload [/quote]

Als Ergebnis werden dann alle vier Fälle korrekt ausgeführt? Interne Mails werden nur intern zugestellt wenn der Empfänger auch intern vom UCS verwaltet wird und dort ein Postfach hat. Alle anderen gehen nach extern. Andersrum kommen auch alle Mails beim UCS und den daraus verwalteten Postfächern an.

Für eine homogene Gruppe von Mailadressen (also gleicher Domäöneteil, nur ein externe SMTP Relayserver) habe ich das ja bereits hinbekommen. Woran ich noch gescheitert bin ist das Versenden mit unterschiedlichen Mailadressen die auch noch über verschiedenen externe smtprelayserver versendet werden sollen. Das ist aber das “kleinere” Problem und eher ein “Goodie” wen das klappen würde. Meine Versuche mit dieser Anleitung hatten bisher keinen Erfolg. Sie ist ja leider auch nicht sehr aktuelle so das ich nicht weiss ob man das Problem heute ganz anders und evtl. viel einfacher lösen kann.