Настройка Postfix и Dovecot для работы с разными доменами на разных IP-адресах

Предположим, что у нас есть два домена remontka.com и test.remontka.com и почтовый сервер, с которого идет отправка писем для этих доменов. Также на сервере есть два IP-адреса:

  • 1.2.3.4
  • 5.6.7.8

Нам нужно сделать так, чтобы:

  1. Домен remontka.com отправлял письма с адреса 1.2.3.4.
  2. Домен test.remontka.com отправлял письма с адреса 5.6.7.8.
  3. При создании SMTP-сессии на разных IP, почтовый сервер отдавал разные HELLO.
  4. Postfix и Dovecot умели отдавать разные SSL-сертификаты при запросах на разные IP.

Это делается в несколько этапов.

Теория

Наши задачи решаются с помощью настроек:

  1. В конфигурационном файле master.cf предусмотрена опция smtp_bind_address , с помощью которой можно указать, к какому адресу будет привязана очередь обработки письма. Таким образом нам нужно просто настроить правило для исходящих писем, которое в зависимости от отправителя будет посылать письма через определенную очередь в master.cf.
  2. В том же файле master.cf настраиваем опцию myhostname для различных соединений. На свой адрес мы повесим свой прослушиватель, который будет указывать на определенное имя сервера.
  3. В файле main.cf для postfix используем директиву tls_server_sni_maps для указания разные SSL-сертификатов.

Рассмотрим процесс по шагам.

Отправка с разных IP

Отредактируем основной конфигурационный файл postfix:

vi /etc/postfix/main.cf

Нам нужно добавить или отредактировать опцию sender_dependent_default_transport_maps :

sender_dependent_default_transport_maps = hash:/etc/postfix/sender_transport

* в данном примере мы указываем, что правила для отправки находится в карте /etc/postfix/sender_transport .

Создадим файл с самой картой:

vi /etc/postfix/sender_transport

@remontka.com remontka_smtp:
@test.remontka.com test_smtp:

* в данном примере мы будем отправлять письма от разных доменов, каждый через свою очередь. Сами очереди мы создадим в файле master.cf.

И создадим саму карту:

postmap /etc/postfix/sender_transport

Теперь отредактируем файл master.cf:

vi /etc/postfix/master.cf

В самый низ добавим:

remontka_smtp unix — — n — — smtp
-o smtp_helo_name=mail.remontka.com
-o smtp_bind_address=1.2.3.4

test_smtp unix — — n — — smtp
-o smtp_helo_name=mail.test.remontka.com
-o smtp_bind_address=5.6.7.8

* мы создали две очереди в соответствии с правилами отправки. Для каждой очереди используются следующие правила:

  • smtp_bind_address — обязывает делать отправку через определенный IP-адрес.
  • smtp_helo_name — указывает, какое имя сервера использовать в HELLO при отправке.

Применяем настройки:

systemctl restart postfix

Разные HELLO для входящих SMTP-сессий

Очень важно, чтобы при smtp-запросах к нашему серверу (как правило, по порту 25), Postfix умел отдавать разные имена. В нашем примере это будут mail.remontka.com и mail.test.remontka.com .

Открываем файл:

vi /etc/postfix/master.cf

Находим настройку:

smtp inet n — y — — smtpd

И делаем из нее несколько:

1.2.3.4:smtp inet n — y — — smtpd
-o myhostname=mail.remontka.com

5.6.7.8:smtp inet n — y — — smtpd
-o myhostname=mail.test.remontka.com

* в нашем примере будет создано два слушателя — первый на IP 1.2.3.4 , который будет отдавать имя сервера mail.remontka.com , второй — 5.6.7.8 с именем mail.test.remontka.com .

Перезапускаем postfix:

systemctl restart postfix

Мы можем проверить настройку, используя Telnet .

Настройка отдачи сертификатов

Отдельно покажем, как настроить Postfix и Dovecot.

Настройка Postfix

Открываем файл:

vi /etc/postfix/main.cf

Приводим настройки к следующему виду:

#smtpd_tls_cert_file = …
#smtpd_tls_key_file = …

smtpd_tls_chain_files =
/etc/postfix/cert.key,
/etc/postfix/cert.crt

tls_server_sni_maps = hash:/etc/postfix/vmail_ssl_map

* где:

  • Мы закомментировали строки smtpd_tls_cert_file и smtpd_tls_key_file .
  • Добавили настройку smtpd_tls_chain_files , которая указывает, какие сертификаты нужно использовать для исходящих. Тут можно обойтись самоподписанным сертификатом.
  • Добавили tls_server_sni_maps , которая говорит нашему релею, какой файл нужно использовать для определения, какому домену какой сертификат подставлять.

Создаем файл:

vi /etc/postfix/vmail_ssl_map

mail.remontka.com /etc/postfix/ssl/mail.remontka.com/cert.key /etc/postfix/ssl/mail.remontka.com/cert.crt
mail.test.remontka.com /etc/postfix/ssl/mail.test.remontka.com/cert.key /etc/postfix/ssl/mail.test.remontka.com/cert.crt

* для каждого из hostname мы указали свой путь до пары сертификатов.

Создаем карту из vmail_ssl_map:

postmap -F /etc/postfix/vmail_ssl_map

Перезапускаем postfix:

systemctl restart postfix

Для проверки можно использовать команду openssl:

openssl s_client -starttls smtp -connect mail.remontka.com:25

openssl s_client -starttls smtp -connect mail.test.remontka.com:25

Настройка Dovecot

Открываем настройки SSL, как правила:

vi /etc/dovecot/conf.d/10-ssl.conf

Добавляем директивы local_name для каждого из домена:

local_name mail.remontka.com {
ssl_cert = </etc/postfix/ssl/mail.remontka.com/cert.crt
ssl_key = </etc/postfix/ssl/mail.remontka.com/cert.key
}
local_name mail.test.remontka.com {
ssl_cert = </etc/postfix/ssl/mail.test.remontka.com/cert.crt
ssl_key = </etc/postfix/ssl/mail.test.remontka.com/cert.key
}

Перезапускаем dovecot:

systemctl restart dovecot

Для проверки также используем openssl:

openssl s_client -connect mail.remontka.com:993

openssl s_client -connect mail.test.remontka.com:993

EnglishRussianUkrainian