Постановка задачи: имеем настроенный почтовый сервер на основе Postfix с пользователями в MySQL и Dovecot как MDA, необходимо настроить наш почтовый сервер как резервный Backup MX для отдельно взятых клиентов. Ситуацию усложняет необходимость иметь несколько действующих ящиков на нашем почтовом сервере, вне зависимости от того, есть они или нету на основном почтовом сервере. В чем эта сложность и для чего это нужно — мы сейчас и рассмотрим…
Долгое и обстоятельное введение в суть дела
Зачем же это было нужно? В принципе, достаточно задействовать опицию PostfixAdmin бэк-энда «Mail server is backup MX» и вся почта будет как часики релеиться для выбранного домена, так как домен будет перечислен в опции relay_domains в опциях Postfix.
Надеюсь все в курсе, зачем нужен резервный почтовый сервер и какую роль он выполняет в цепочке почтовых серверов, которые обслуживают клиентский домен? Классическое его применение — обслуживать домен, если основной (резервный) почтовые сервера по каким-то причинам недоступны. На то он и резервный.
Однако жизнь была бы скучна, если бы не появлялись задачки, требующие особого решения. Например, в некоторых случаях клиенту необходимо, чтобы именно наш почтовый сервер отсылал письма с рассылкой от имени основного домена клиента (например, от имени hello@client.com), для которого наш почтовый сервер ни резервным ни основным почтовым сервером не является. По (не)понятным причинам, клиент такой ящик у себя создавать не пожелал.
В таких случаях возможны следующие проблемы:
- почта, рассылаемая нашим сервером, не будет доставлена на локальные адреса домена заказчика (наш сервер будет в «святой уверенности», что он единолично обслуживает домен client.com, и при отсылке на адреса вида vasya@client.com вы получите ошибку 500 "Recipient address rejected: User unknown in virtual mailbox table");
- почта клиента будет часто попадать в папку спам, так как наш сервер не авторизован выполнять рассылку от имени домена клиента client.com (сервер не указан как MX запись у клиента в DNS; сервер отсутствует в перечислении авторизованных почтовых серверов в записи SPF домена client.com);
Чтобы исключить эти проблемы нужно выполнить следующие настройки.
1. Авторизовать почтовый сервер в SPF клиента
Что такое SPF вы можете узнать более детально в статье Sender Policy Framework на Википедии.
Достаточно добавить наш почтовый сервер по IP (например, 99.111.222.88/32) и/или по его доменному имени (ourmail.server.com) в SPF запись домена клиента, как показано ниже:
v=spf1 ip4:99.111.222.88/32 … a mx … include:ourmail.server.com … ~all
2. Назначить почтовый сервер как Backup MX для клиентского домена client.com
Учтите, что нагрузка на наш почтовый сервер может многократно возрасти, так как резервный почтовый сервер вынужден обслуживать весь домен клиента, если первичный почтовый сервер заказчика по каким-то причинам не доступен. Также, к нам могут попадать запросы, отклонённые основным почтовым сервером и конечно же спам. Куда уж без него.
Чтобы указать наш сервер как резервный для домена client.com, необходимо в записях DNS домена client.com указать запись MX с весом, который выше (больше) чем вес основного почтового сервера клиента:
client.com. MX 10 mail.client.com ; почтовый сервер клиента client.com. MX 50 ourmail.server.com ; наш, резервный, почтовый сервер
3. Отметить домен клиента в PostfixAdmin как резервный
Для этого авторизуемся в PostfixAdmin и выбираем необходимый домен для редактирования, как показано на рисунке 1, ниже:

В настройках домена, отмечаем чекбокс «Mail server is backup MX». С этого момента наш сервер будет принимать и пересылать (релеить) всю почту домена client.com.
4. Настроить транспорт для пересылки почты на основной сервер клиента с исключениями
Как уже упоминалось выше, наш почтовый сервер сам по себе также обслуживает домен client.com и имеет несколько локально созданных ящиков, что приводит к проблемам работы траспорта и почта, инициатором которой является непосредственно наш почтовый сервер (например, отправленная с ящика hello@client.com) и предназначенная для домена client.com (например, для vasya@client.com) не будет отправляться. Дабы этого избежать, нужно настроить транспорт postfix следующим образом…
Создать файл /etc/postfix/transport и внести в него необходимые правила для прохождения почты для доменов, для которых наш почтовый сервер является резервным. В частности, для тех ящиков, что непосредственно созданы на нашем почтовом сервер — указать наш виртуальный транспорт virtual:[ourmail.server.com], для всех остальных — указать основной почтовый сервер клиента в прямоугольных скобках или его домен, но уже без скобок:
root@mailserver:/# vim /etc/postfix/transport hello@client.com virtual:[ourmail.server.com] no-reply@client.com virtual:[ourmail.server.com] notification@example.com virtual:[ourmail.server.com] validation@example.com virtual:[ourmail.server.com] client.com smtp:[mail2.client.com] example.com smtp:example.com
Примечание: обратите внимание на прямоугольные скобки [] — это запрет для почтового сервера искать MX запись для этого домена, или другими словами — явное указание почтового сервера, которому мы хотим отдавать почту. Подробнее информацию, конечно, можно найти в официальной документации — man 5 transport
Осталось указанный файл отхэшировать и «скормить» postfix-у:
root@mailserver:/# postmap /etc/postfix/transport root@mailserver:/# vim /etc/postfix/main.cf … transport_maps = hash:/etc/postfix/transport …
После внесений изменений нужно перезапустить postfix.
root@mailserver:/# service postfix reload
В результате, вся почта адресованная этим доменам будет пересылаться на основной почтовый сервер, кроме тех ящиков, которые созданы и обслуживаются непосредственно на нашем сервере. Теперь наш сервер прекрасно справляется как и с рассылкой подписки для клиентов, так и соберет почту в очередь и перешлёт ее на основной почтовый сервер, если он вдруг «упадёт» на время, а потом «подымется».