[Postfixbuch-users] Outgoing IP bzw Service basierend auf der MX Destination ändern
Axel Jurak
ajurak at graz4u.at
Mo Jan 12 20:00:24 CET 2015
Hallo liebe Postfixbuch Liste!
Wir haben hin & wieder Troubles mit großen Providern wie zBsp gmail,
Office365, Yahoo & Co weil eine unserer Outgoing SMTP IPs geblockt ist.
Unsere Kunden verschicken in unregelmäßigen Abständen Newsletter.
Vermutlich erzeugen diese dann eine Sperre. Der echte Grund wird ja
leider nicht bekannt gegeben.
Habe die IP-Sperre bisher immer recht "leicht" mittels transport map gelöst.
Wenn eine SMTP-Out-IP gesperrt war, einfach eine andere für die
entsprechende Domain gesetzt.
Wobei ganz gezielt immer pro gesperrter-IP <-> Ziel-Domain, nicht
einfach für "alles" eine neue outgoing-IP...
--------------
also zBsp so in der transport
gmail.com smtp_out_1:[gmail.com]
outlook.com smtp_out_2:[outlook.com]
--------------
in der master.cf
########
#
smtp_out_1 unix - - n - - smtp
-o smtp_bind_address=1.2.3.1
-o syslog_name=postfix/smtp-out-1
-o myhostname=smtp-out-1.unsere-domain
smtp_out_2 unix - - n - - smtp
-o smtp_bind_address=1.2.3.2
-o syslog_name=postfix/smtp-out-2
-o myhostname=smtp-out-2.unsere-domain
-----------------------------------
Das funktioniert natürlich gut für Ziel-Domains die man kennt.
Jetzt ist es aber immer öfter der Fall, dass Domains zu Google oder
Microsoft umziehen.
Somit zieht aber die Auswahl vom Service smtp_out_* nicht.
Und man hat klarerweise keine Ahnung welche Domains wohin umgezogen sind.
Im Log sieht das dann ca aus:
Jan 12 17:32:44 mail postfix/smtp-out-2/smtp[13416]: C235529975F:
to=<FREMD-KUNDEN-EMAIL-BEI-OFFICE365>,
relay=kunden-domain.mail.protection.outlook.com[213.199.154.23]:25,
delay=5.3, delays=0.1/0/0.11/5.1, dsn=5.7.1, status=bounced (host
kunden-domain.mail.protection.outlook.com[213.199.154.23] said: 550
5.7.1 Service unavailable; Client host [unsere-out-ip-2] blocked using
FBLW15; To request removal from this list please forward this message to
delist at messaging.microsoft.com (in reply to RCPT TO command))
der Teil: kunden-domain in kunden-domain.mail.protection.outlook.com ist
natürlich immer anders.
Aber: .mail.protection.outlook.com ist immer gleich.
Das ist also der echte Ziel-Server der via MX gefunden wurde.
Und genau da möchte ich ansetzen!
Wie schafft man es nun, auf Basis des "Namens des SMTP End-Punkts" ein
Transport-Service zu setzen.
Wobei der Ziel-Server nicht statisch sein darf! (Also immer outlook.com)
Also quasi so smtp-destination-map (gibt es so was?):
kunden-domain1.mail.protection.outlook.com
smtp_out_1:[kunden-domain1.mail.protection.outlook.com]
kunden-domain2.mail.protection.outlook.com
smtp_out_2:[kunden-domain2.mail.protection.outlook.com]
Genau die Liste händisch zu warten ist quasi unmöglich.
Und es müsste eben ein Name sein, keine IP Liste.
Also zBSP die IPs vom Microsoft, das kann natürlich auch nicht gewartet
werden ;)
In der transport kann man so was leider nicht in der art eintragen, hier
wird ja nur die eMail-Adresse verglichen.
-----------------------------------
ev sollte es aber ein generelles ziel-domain basiertes service auch geben:
smtp_out_office365 unix - - n - - smtp
-o smtp_bind_address=1.2.3.6
-o syslog_name=postfix/smtp-out-o365
-o myhostname=smtp-out-6.unsere-domain
(in dem Beispiel müsste man dann bei einer IP-Sperre hier die IP ändern)
Welcher Ansatz nun besser ist weiß ich nicht, es müsste aber bei beiden
Varianten auf Grund des Namens vom MX Host entschieden werden welcher
Service gesetzt werden soll. Ohne den MX Namen selbst zu verändern, wie
zBsp immer auf outlook.com zu setzen ....
---------
Achja, eine Lösung die ich bereits gegoogelt habe wäre grob erklärt so:
transport_maps = tcp:127.0.0.1:23000
(ob TCP oder UNIX-Domain-Socket ist mir egal ;)
dort horcht ein Perl Programm das sich zu der eMail Adr den MX holt,
bzw das so oft macht bis keine weitere Auflösung mehr geht.
Dann den gefundenen DNS MX Namen nehmen und gegen die konfigurierten
Werte checkt.
Als "Ergebnis" gibt das Programm dann so etwas zurück:
smtp_out_1:
oder auch:
smtp_out_1:[gefundener-mx-name]
(bei keinem Match wird der gewünschte "Default", zBsp:
smtp_out_default: zurückgegeben)
und schliesst die Connection.
Postfix macht dann mit dem "neuen" Transport-Service weiter....
Wobei "die konfigurierten Werte" aus einem config file (wäre ok), direkt
im Perl Programm (eher unbrauchbar) oder via MySQL (wäre extrem toll)
bezogen werden.
Das unangenehme dabei:
Postfix macht ja genau das alles.
Es liegen dann ja die Werte vor.
Man müsste also "nur" kurz VOR dem Connect zum Ziel Server noch
eingreifen können!
---------
Ein blindes durchwechseln via Round-Robin oder so kommt eher nicht in Frage.
Ein automatisches erkennen der Sperre und umschalten auf eine andere IP
wird auch extrem schwierig sein.
Ein Admin müsste schon aktiv auf eine andere IP umschalten. Wäre aber
voll OK. Passiert nicht so oft.
check_recipient_mx_access ist auch nicht das Richtige, da IP-Basis. Oder?
Ich hoffe ihr versteht was ich meine :)
Bin für Ideen sehr dankbar.
Danke & LG
Axel
Mehr Informationen über die Mailingliste Postfixbuch-users