[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