Das PROXY Protokoll als Alternative zum transparenten Proxy am Beispiel von Postfix und HAProxy

HAProxy (c) by www.haproxy.org

Vorwort

In der Welt der SMTP-Server ist es wichtig, die IP-Adresse des Clients zu kennen.
Prüfroutinen wie DNSBL/RBL oder FcrDNS (Forward-confirmed reverse DNS) sind (leider) obligatorische Bestandteile einer Mailserver-Infrastruktur. Beide sind ohne die korrekte Client IP-Adresse nur sehr schwer oder gar nicht umzusetzen.

In einer gewöhnlichen Proxy-Umgebung erscheint der Proxy-Server als Client oder Server:

Client 1 (1.2.3.4)
     |
     |
mx.domain.tld (5.6.7.8)
proxy.domain.local (192.168.1.5)
     |
     |
mailserver.domain.local (192.168.1.11)

In dem Fall sieht Postfix Folgendes:

[...] connect from proxy.domain.local[192.168.1.5] [...]

Der Proxy nimmt als Server die Anfrage des Clients entgegen und sendet sie als Pseudo-Client an den Mailserver weiter.
FcrDNS- und ähnliche Checks auf die vermeitliche Client-IP 192.168.1.5 sind zwecklos.

Zwar bietet sich an dieser Stelle die Möglichkeit des Einsatzes eines transparent betriebenen Proxy-Servers.
Ein großer Nachteil ist jedoch die Tatsache, dass ein solcher Server gleichermaßen Gateway UND Proxy für das Handling der Mailserver-Verbindungen sein muss.
Einrichtungsdauer, Schwierigkeitsgrad und Wartung der Konfiguration stehen zudem oft in keinem guten Verhältns.

Hier kommt das von HAProxy im Jahr 2010 eingeführte PROXY Protokoll zum Tragen.
Etwa im Juni 2012 entschied sich die Postfix-Community ebenso für die Implementierung wie mittlerweile einige Weitere…

Das Protokoll fügt den TCP-Daten einen PROXY-Tag hinzu, etwa „PROXY TCP4 1.2.3.4 15.6.7.8 QUELL_PORT 25“.
Die Anweisung dafür erhält HAProxy durch „send-proxy“.
Postfix muss als sein Gegenüber einen Listener bereitstellen, der den PROXY-Tag erwartet.
Das Proxy-Protokoll sollte nur für einen eigens dafür eingerichteten Listener eingeschaltet werden, da ansonsten immer zuerst der PROXY-Tag erwartet werden würde!

Frisch aus den Logs geangeltes Beispiel:

postfix/smtpd[59322]: connect from unknown[211.255.1.142]
postfix/smtpd[59322]: NOQUEUE: reject: RCPT from unknown[211.255.1.142]: 554 5.7.1 Service unavailable; Client host [211.255.1.142] blocked using zen.spamhaus.org; http://www.spamhaus.org/query/bl?ip=211.255.1.142;

Für Postfix ändert sich nichts weiter. Es scheint, als würden die Verbindungen transparent durchgeschaltet.

Voraussetzung für den Einsatz des PROXY Protokolls ist HAProxy >=1.5 sowie Postfix >=2.10.

Das schließt Debian Wheezy ohne Einsatz der Backports leider aus.
Debian Jessie qualifiziert sich vollständig, Ubuntu ab 14.04/trusty beinhaltet zwar bereits Postfix 2.11, muss jedoch für HAProxy >1.4 auf die Backports zurückgreifen.

Konfiguration

Der MTA Postfix wird wie erwähnt um einen Listener erweitert. Als Port wähle ich in diesem Beispiel 8825:

/etc/postfix/master.cf

[...]
8825     inet  n       -       -       -       -       smtpd 
  -o smtpd_upstream_proxy_protocol=haproxy
[...]

Weitere Optionen sind natürlich denkbar, einzig „smtpd_upstream_proxy_protocol“ ist Voraussetzung.
Noch einmal sei gesagt: Bitte nicht allgemein in der Datei „main.cf“ verfügbar machen, da ansonsten alle Listener betroffen sind und diese ohne PROXY-Tag keine Verbindungen mehr entgegennehmen würden.

Zur HAProxy Konfiguration: Beide Ports – 25 und 587 – bilde ich hier mit einem Frontend ab, da in meiner Beispiel-Installation TLS auf allen Postfix Listenern initialisiert werden kann.
„smtpchk“ berücksichtigt nicht, dass der Listener einen PROXY-Tag erwartet. Das umgehe ich dadurch, dass der Check auf Port 25 ausgeführt wird (> „check port 25“). Das muss jeder Administrator selbst entscheiden.
Es folgt nur das rudimentäre Gerüst der Back- und Frontends:
/etc/haproxy/haproxy.cfg

###############
## Frontends ##
###############

frontend ft_smtp
  bind 0.0.0.0:25
  bind 0.0.0.0:587
  mode tcp
  default_backend bk_smtp

###############
## Backends ###
###############

backend bk_smtp
  mode tcp
  option smtpchk
  balance roundrobin
  server postfix_02_10024 192.168.100.20:10024 send-proxy check port 25
  server postfix_02_10024 192.168.100.21:10024 send-proxy check port 25

Hinweise

Die konfigurationsabhängig mehr oder weniger häufigen „alive checks“ des HAProxys, stören unter Umständen im Syslog.
Ich setze „rsyslog“ ein und möchte den Hinweis zum Einsatz eines Filters niemandem vorenthalten:

/etc/rsyslog.d/blocklist.conf

:msg, contains, "lost connection after HELO from hostname[IP]" stop
:msg, contains, "connect from hostname[IP]" stop
:msg, contains, "dusconnect from hostname[IP]" stop

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.