Postfix stellt keine Verbindung zum Postgres-Pool mit lokaler IP-Adresse her

742
Lucas

Ich habe einen postfixE-Mail-Server, der eine Datenbank zum Abfragen und Überprüfen von E-Mail-Adressen usw. kontaktiert. Er stellt eine pgbouncerVerbindung her, um die Verbindungen zu durchlaufen. Mein Problem war jedoch, dass sich der 'Bouncer' auf der Datenbank befindet, also Verbindungen von und zu Die Datenbank ist unverschlüsselt und könnte ein Sicherheitsrisiko darstellen.

Ich habe pgbouncerauf dem Mail-Server eine lokale Instanz von installiert, stunnelum den beiden zumindest die Chance zu geben, eine SSL-Verbindung zwischen den beiden aufzubauen, jedoch aus irgendeinem trügerischen Grund postfix, durch Sentimentalität, Schädlichkeit oder einfach nur weil sie sich hartnäckig weigern will mit der Umschaltung. Hier ist ein Beispiel für eine der Nachsuchdateien für virtuelle Aliasnamen, die sich im Postfix-Verzeichnis befinden:

# ------- # p-alias # ------- hosts=10.0.0.123 port=6432 dbname=mail user=user1 password=password query=SELECT destination FROM v_alias WHERE source = '%s' 

Zum Testen können Sie eine Test-E-Mail-Adresse wie folgt abfragen

console:~$ postmap -q test@testy.net pgsql:/etc/postfix/p-alias 

und das Ergebnis:

tester.mc_testy_tester@test_email_address.com 

Alles in Ordnung und gut, jetzt eine nahezu identische Konfiguration zu erstellen, die auf den lokalen Pooler verweist

console:~$ cp /etc/postfix/p-alias /etc/postfix/p-alias2 console:~$ vi /etc/postfix/p-alias2 

Ändern Sie die IP-Adresse in localhost:

# ------- # p-alias2 # ------- hosts=localhost port=6432 dbname=mail user=user1 password=password query=SELECT destination FROM v_alias WHERE source = '%s' 

Stellen Sie den gleichen Befehl auf:

console:~$ postmap -q test@testy.net pgsql:/etc/postfix/p-alias2 

und es spuckt den folgenden Fehler aus

postmap: warning: connect to pgsql server localhost: could not connect to server: Connection refused?? Is the server running on host "localhost" (::1) and accepting?? TCP/IP connections on port 5432?? could not connect to server: Connection refused?? Is the server running on host "localhost" (127.0.0.1) and accepting?? TCP/IP connections on port 5432?? postmap: fatal: table pgsql:/etc/postfix/p-alias2: query error: Operation now in progress 

Die beiden Bouncer sind alle identisch, die Dateien pgbouncer.ini und die userlist.txt sind die gleichen. Der einzige erkennbare Unterschied ist der physische Standort und die Verbindung. Da ich keinen psqlClient auf dem E-Mail-Server installiert habe (der Versuch, über Linux Distros zu installieren, viel zu viele Abhängigkeiten für meinen Geschmack hinzufügt), habe ich stattdessen die Abfragen mit Python nachgeahmt, um zu überprüfen, ob ich nichts übersehen habe dumm:

import psycopg2  conn = psycopg2.connect( "host='10.0.0.123' port='6432' dbname=mail user='user1' password='password'" ) dbh = conn.cursor() dbh.execute( "SELECT destination FROM v_alias WHERE source = 'test@testy.net'" ) dbh.fetchone()  # Result: # ('tester.mc_testy_tester@test_email_address.com',)  conn.commit() conn.close()  # ----------------------------------- # All is tickety boo, as it should be # now let's repeat with the local ip # -----------------------------------  conn = psycopg2.connect( "host='localhost' port='6432' dbname=mail user='user1' password='password'" ) dbh = conn.cursor() dbh.execute( "SELECT destination FROM v_alias WHERE source = 'test@testy.net'" ) dbh.fetchone()  # Result: # ('tester.mc_testy_tester@test_email_address.com',)  conn.commit() conn.close() 

beide funktionierten problemlos, so weit ich weiß, funktioniert das und es sollte keine Probleme geben. Postfix denkt eindeutig anders.

Also nahm ich an, dass es vielleicht der Stunnel war, der das Problem war, hier ist die Konfiguration:

client = yes pid = /var/run/stunnel.pid [pgbouncer] protocol = pgsql accept = 6433 connect = 10.0.0.123:5432 

Ich umgehe den pgbouncer und frage den lokalen Stunnel ab

# ------- # p-alias3 # ------- hosts=127.0.0.1 port=6433 dbname=mail user=user1 password=password query=SELECT destination FROM v_alias WHERE source = '%s' 

Postmap verweigert die Einhaltung

console:~$ postmap -q test@testy.net pgsql:/etc/postfix/p-alias3 postmap: warning: connect to pgsql server 127.0.0.1: could not connect to server: Connection refused?? Is the server running on host "127.0.0.1" and accepting?? TCP/IP connections on port 5432?? postmap: fatal: table pgsql:/etc/postfix/p-alias3: query error: Operation now in progress 

kein Glück.

Der Vollständigkeit halber handelt es sich hier um einen guten Teil der pgbouncer.ini

[databases]  ; ... ;mail = host=localhost port=6433 dbname=mail mail = host=10.0.0.123 port=5432 dbname=mail  [pgbouncer]  listen_addr = * listen_port = 6432  ; ...  auth_type = md5  auth_file = /etc/pgbouncer/userlist.txt   pool_mode = transaction  server_reset_query = DISCARD ALL  server_check_query = SELECT 1  server_check_delay = 30  ; ... 

Ich versuche pgbouncer mit stunnel oder ohne und direkt in die Datenbank und Postfix weigert sich zu akzeptieren, dass es einen localhost gibt, der mit Python funktioniert und mit Postmap fehlschlägt.

Ganz offensichtlich mag es localhost nicht.

Also, Postfix, was willst du von mir? !!!

(Postfix ist Version 2.11.0)

0

2 Antworten auf die Frage

0
Lucas

Nach einigen Diskussionen in irc wurde darauf hingewiesen, dass Postfix die port=Einstellung für lokale Verbindungen offenbar nicht zu würdigen scheint. Die Fehlermeldung versuchte eindeutig, mit Port 5432 zu sprechen. Daher wurde das Problem durch Ändern des pgbouncer-Listenports auf 5432 behoben.

Danke, Myon!

(Es ist immer so einfach, wenn Sie die Antwort kennen ...)

0
Daniel Vérité

Basierend auf der Manpage hier:

http://www.postfix.org/pgsql_table.5.html

Der optionale Port muss in den Hostfeldern mit der hostname:portSyntax angegeben werden:

 hosts The hosts that Postfix will try to connect to and query from. Specify unix: for UNIX-domain sockets, inet: for TCP connections (default). Example: hosts = host1.some.domain host2.some.domain:port hosts = unix:/file/name 

Ein unabhängiges Portfeld scheint nicht vorhanden zu sein.