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

Я установил локальный экземпляр 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)

2 ответа2

0

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

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

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

0

На основе man-страницы здесь:

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

Необязательный порт должен быть указан в полях хостов с синтаксисом hostname:port :

  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

Кажется, что независимое поле порта не существует.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .