У меня есть почтовый сервер 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)