Postfix не подключается к пулу postgres с локальным IP-адресом

736
Lucas

У меня есть postfixпочтовый сервер, который связывается с базой данных, чтобы запрашивать и проверять адреса электронной почты и т. Д. Он соединяется с помощью pgbouncerциклического соединения, однако моя проблема заключалась в том, что «вышибала» находится на конце базы данных, поэтому соединения с и из база данных не зашифрована и потенциально может быть проблемой безопасности.

Я установил локальный экземпляр pgbouncerна почтовом сервере вместе, stunnelчтобы, по крайней мере, дать им возможность инициировать SSL-соединение между ними, однако по какой-то изумительной причине postfix, из-за сентиментальности, пагубности или просто потому, что он просто упрямый, отказывается соблюдать с переключением. Вот пример одного из файлов поиска виртуальных псевдонимов, расположенных в каталоге postfix:

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

чтобы проверить это, вы можете запросить тестовый адрес электронной почты, например, так

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

и результат:

tester.mc_testy_tester@test_email_address.com 

все хорошо, теперь, чтобы создать почти идентичный конфиг, который указывает на локальный пулер

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

измените ip на localhost:

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

поставьте ту же команду:

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

и выплевывает следующую ошибку

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 

Два вышибала практически идентичны, файлы pgbouncer.ini такие же, как и userlist.txt, единственное заметное отличие заключается в их физическом расположении и соединении. Поскольку у меня не установлен psqlклиент на почтовом сервере (пытаясь установить через дистрибутивы Linux, я попытался добавить слишком много зависимостей на мой вкус), я вместо этого прибегнул к имитации запросов с помощью Python, чтобы убедиться, что я ничего не пропустил глупо:

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() 

оба работали безотказно, так что, насколько я могу судить, это работает, и не должно быть никаких проблем. Postfix явно думает иначе.

Итак, я предположил, что, возможно, проблема была в stunnel, вот конфиг:

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

Я обхожу pgbouncer и запрашиваю локальный stunnel

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

почтовая карта отказывается соблюдать

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 

неудачно.

Для полноты картины приведу примерный фрагмент файла 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  ; ... 

Я пробую pgbouncer с stunnel или без него и прямо в базу данных, а postfix отказывается признать наличие локального хоста, работает с python и не работает с postmap.

Очевидно, что это просто не нравится localhost.

Итак, Postfix, что ты хочешь от меня? !!!

(Postfix - версия 2.11.0)

0

2 ответа на вопрос

0
Lucas

После некоторого обсуждения irc было отмечено, что Postfix, похоже, не выполняет port=настройку для локальных подключений - сообщение об ошибке явно пыталось установить связь с портом 5432, поэтому изменение порта прослушивания pgbouncer на 5432 устранило проблему.

Спасибо -Майон!

(это всегда так просто, когда знаешь ответ ...)

0
Daniel Vérité

Based on the manpage here:

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

The optional port needs to be specified in the hosts fields with the hostname:port syntax:

 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 

An independant port field does not seem to exist.

Похожие вопросы