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

Обновлено Обновлено: Опубликовано Опубликовано:

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

  • 1.2.3.4
  • 5.6.7.8

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

  1. Домен dmosk.ru отправлял письма с адреса 1.2.3.4.
  2. Домен test.dmosk.ru отправлял письма с адреса 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

@dmosk.ru         dmosk_smtp:
@test.dmosk.ru    test_smtp:

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

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

postmap /etc/postfix/sender_transport

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

vi /etc/postfix/master.cf

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

dmosk_smtp     unix  -       -       n       -       -       smtp
  -o smtp_helo_name=mail.dmosk.ru
  -o smtp_bind_address=1.2.3.4

test_smtp      unix  -       -       n       -       -       smtp
  -o smtp_helo_name=mail.test.dmosk.ru
  -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.dmosk.ru и mail.test.dmosk.ru.

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

vi /etc/postfix/master.cf

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

smtp      inet  n       -       y       -       -       smtpd
...

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

1.2.3.4:smtp      inet  n       -       y       -       -       smtpd
  -o myhostname=mail.dmosk.ru
  ...
5.6.7.8:smtp      inet  n       -       y       -       -       smtpd
  -o myhostname=mail.test.dmosk.ru
  ...

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

Перезапускаем 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.dmosk.ru /etc/postfix/ssl/mail.dmosk.ru/cert.key /etc/postfix/ssl/mail.dmosk.ru/cert.crt
mail.test.dmosk.ru /etc/postfix/ssl/mail.test.dmosk.ru/cert.key /etc/postfix/ssl/mail.test.dmosk.ru/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.dmosk.ru:25

openssl s_client -starttls smtp -connect mail.test.dmosk.ru:25

Настройка Dovecot

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

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

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

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

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

systemctl restart dovecot

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

openssl s_client -connect mail.dmosk.ru:993

openssl s_client -connect mail.test.dmosk.ru:993

# Linux # Почта # Серверы # Сети
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет