Настройка Postfix и Dovecot для работы с разными доменами на разных IP-адресах
Обновлено:
Опубликовано:
Предположим, что у нас есть два домена dmosk.ru и test.dmosk.ru и почтовый сервер, с которого идет отправка писем для этих доменов. Также на сервере есть два IP-адреса:
- 1.2.3.4
- 5.6.7.8
Нам нужно сделать так, чтобы:
- Домен dmosk.ru отправлял письма с адреса 1.2.3.4.
- Домен test.dmosk.ru отправлял письма с адреса 5.6.7.8.
- При создании SMTP-сессии на разных IP, почтовый сервер отдавал разные HELLO.
- Postfix и Dovecot умели отдавать разные SSL-сертификаты при запросах на разные IP.
Это делается в несколько этапов.
Теория
Наши задачи решаются с помощью настроек:
- В конфигурационном файле master.cf предусмотрена опция smtp_bind_address, с помощью которой можно указать, к какому адресу будет привязана очередь обработки письма. Таким образом нам нужно просто настроить правило для исходящих писем, которое в зависимости от отправителя будет посылать письма через определенную очередь в master.cf.
- В том же файле master.cf настраиваем опцию myhostname для различных соединений. На свой адрес мы повесим свой прослушиватель, который будет указывать на определенное имя сервера.
- В файле 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