Postfix relay для нескольких доменов: маршрутизация почты

Архитектура почтового relay для нескольких доменов

В корпоративной среде часто возникает задача: один почтовый шлюз принимает письма для нескольких доменов и маршрутизирует их на разные бэкенд-серверы. Типичные сценарии:

  • Компания с несколькими доменами (company.ru, brand.ru, support.ru) — каждый обслуживается своим почтовым сервером
  • Гибридная инфраструктура: часть ящиков на Exchange, часть на Dovecot, часть в облаке
  • Relay для исходящей почты через единый IP с DKIM-подписью всех доменов

Postfix идеально подходит для этой роли благодаря transport maps — таблицам маршрутизации, определяющим, куда направить письмо в зависимости от домена получателя. В этой статье настроим полноценный relay-шлюз с аутентификацией, TLS и DKIM.

Установка и базовая конфигурация Postfix

Устанавливаем Postfix на Ubuntu 22.04:

sudo apt update
sudo apt install -y postfix postfix-pcre libsasl2-modules

# При установке выбираем "Internet Site"
# System mail name: mail.company.ru

Базовая конфигурация /etc/postfix/main.cf:

# Основные параметры
myhostname = mail.company.ru
mydomain = company.ru
myorigin = $mydomain
mydestination = $myhostname, localhost

# Relay для указанных доменов
relay_domains = company.ru, brand.ru, support.ru

# TLS для входящих
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.company.ru/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.company.ru/privkey.pem
smtpd_tls_security_level = may
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# TLS для исходящих
smtp_tls_security_level = may
smtp_tls_loglevel = 1

# Ограничения
smtpd_relay_restrictions = permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination

# Transport map
transport_maps = hash:/etc/postfix/transport

Transport maps: маршрутизация по доменам

Файл /etc/postfix/transport определяет, куда направлять письма для каждого домена:

# /etc/postfix/transport
# Домен           Транспорт:Назначение
company.ru        smtp:[10.0.1.10]:25
brand.ru          smtp:[10.0.1.20]:25
support.ru        smtp:[exchange.company.ru]:25
marketing.ru      smtp:[smtp.yandex.ru]:465

Квадратные скобки вокруг адреса отключают MX-lookup — Postfix подключается напрямую к указанному хосту. После редактирования пересоздаём хеш-таблицу:

sudo postmap /etc/postfix/transport
sudo systemctl reload postfix

Для более сложной маршрутизации можно использовать регулярные выражения (pcre):

# /etc/postfix/transport_pcre
# Все субдомены company.ru → один сервер
/^.+\.company\.ru$/    smtp:[10.0.1.10]:25

# Конкретный адрес → специальный сервер
/^ceo@company\.ru$/    smtp:[secure.company.ru]:25

В main.cf подключите pcre-таблицу:

transport_maps = pcre:/etc/postfix/transport_pcre, hash:/etc/postfix/transport

Relay для исходящей почты

Если relay-сервер также отправляет исходящую почту от имени всех доменов, настройте sender_dependent_default_transport_maps:

# /etc/postfix/sender_transport
@company.ru     smtp:[smtp-out-1.company.ru]:587
@brand.ru       smtp:[smtp-out-2.company.ru]:587

Это позволяет маршрутизировать исходящую почту через разные серверы в зависимости от домена отправителя.

SASL-аутентификация для relay-клиентов

Если бэкенд-серверы должны аутентифицироваться при отправке через relay, настроим SASL:

# /etc/postfix/main.cf
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname

Для подключения к Dovecot SASL добавьте в /etc/dovecot/conf.d/10-master.conf:

service auth {
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
    }
}

Если relay подключается к внешнему серверу, требующему аутентификации:

# /etc/postfix/sasl_passwd
[smtp.yandex.ru]:465    user@company.ru:SecretPassword
[smtp.gmail.com]:587    relay@company.ru:AppPassword

# Создаём хеш и устанавливаем права
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

# В main.cf
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

DKIM-подпись для всех доменов

Устанавливаем OpenDKIM для подписи исходящей почты:

sudo apt install -y opendkim opendkim-tools

Создаём ключи для каждого домена:

sudo mkdir -p /etc/opendkim/keys/{company.ru,brand.ru,support.ru}

for domain in company.ru brand.ru support.ru; do
    sudo opendkim-genkey -b 2048 -d $domain -D /etc/opendkim/keys/$domain -s mail
    sudo chown -R opendkim:opendkim /etc/opendkim/keys/$domain
done

Настраиваем /etc/opendkim.conf:

Syslog          yes
Mode            sv
Canonicalization relaxed/simple
Domain          company.ru,brand.ru,support.ru
KeyTable        /etc/opendkim/key.table
SigningTable    refile:/etc/opendkim/signing.table
Socket          local:/var/spool/postfix/opendkim/opendkim.sock
PidFile         /run/opendkim/opendkim.pid
TrustAnchorFile /usr/share/dns/root.key
UserID          opendkim

Таблица ключей /etc/opendkim/key.table:

mail._domainkey.company.ru company.ru:mail:/etc/opendkim/keys/company.ru/mail.private
mail._domainkey.brand.ru brand.ru:mail:/etc/opendkim/keys/brand.ru/mail.private
mail._domainkey.support.ru support.ru:mail:/etc/opendkim/keys/support.ru/mail.private

Таблица подписей /etc/opendkim/signing.table:

*@company.ru    mail._domainkey.company.ru
*@brand.ru      mail._domainkey.brand.ru
*@support.ru    mail._domainkey.support.ru

Подключение OpenDKIM к Postfix

В /etc/postfix/main.cf добавляем milter:

milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

Создаём директорию для сокета и перезапускаем:

sudo mkdir -p /var/spool/postfix/opendkim
sudo chown opendkim:postfix /var/spool/postfix/opendkim
sudo systemctl restart opendkim postfix

Не забудьте добавить DNS-записи DKIM для каждого домена. Содержимое записи берётся из файла /etc/opendkim/keys/company.ru/mail.txt.

Защита от спама и ограничение потока

На relay-шлюзе важно защититься от злоупотреблений. Добавляем ограничения в main.cf:

# Проверки при подключении
smtpd_client_restrictions =
    permit_mynetworks,
    reject_rbl_client zen.spamhaus.org,
    reject_rbl_client bl.spamcop.net

# Проверки отправителя
smtpd_sender_restrictions =
    reject_non_fqdn_sender,
    reject_unknown_sender_domain

# Проверки получателя
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain

# Rate limiting
smtpd_client_message_rate_limit = 100
smtpd_client_recipient_rate_limit = 500
anvil_rate_time_unit = 3600s

Для проверки заголовков используйте header_checks:

# /etc/postfix/header_checks
/^Subject:.*\bviagra\b/i    REJECT Spam detected
/^X-Mailer:.*PHPMailer/     WARN Possible spam from PHPMailer

Мониторинг и отладка relay-сервера

Основные инструменты диагностики:

# Очередь писем
postqueue -p

# Подробная информация о письме
postcat -q <queue_id>

# Логи
journalctl -u postfix -f
tail -f /var/log/mail.log

# Статистика
qshape deferred
qshape active

Для мониторинга здоровья relay настройте скрипт, проверяющий размер очереди:

#!/bin/bash
# /usr/local/bin/check_postfix_queue.sh
QUEUE_SIZE=$(postqueue -p | tail -1 | grep -oP '\d+(?= Request)')
THRESHOLD=500

if [ "${QUEUE_SIZE:-0}" -gt "$THRESHOLD" ]; then
    echo "CRITICAL: Postfix queue has $QUEUE_SIZE messages" | \
    mail -s "Postfix Queue Alert" admin@company.ru
fi

Для тестирования маршрутизации используйте:

# Проверяем, куда будет отправлено письмо
postmap -q "user@brand.ru" hash:/etc/postfix/transport
# Ожидаемый вывод: smtp:[10.0.1.20]:25

# Тестовая отправка
echo "Test" | mail -s "Relay test" user@brand.ru

Часто задаваемые вопросы

Добавьте домен в relay_domains и запись в /etc/postfix/transport, выполните postmap /etc/postfix/transport и postfix reload. Команда reload применяет изменения без прерывания работы.

Проверьте очередь командой qshape deferred — она покажет, к какому домену накопились недоставленные письма. Убедитесь в доступности целевого сервера: telnet 10.0.1.20 25. Если сервер недоступен, письма останутся в deferred-очереди и будут повторяться автоматически.

Да, с Postfix 3.4+ поддерживается SNI. Создайте файл /etc/postfix/sni_map с записями вида mail.brand.ru /etc/letsencrypt/live/mail.brand.ru/privkey.pem /etc/letsencrypt/live/mail.brand.ru/fullchain.pem и укажите tls_server_sni_maps = hash:/etc/postfix/sni_map в main.cf.

В DNS создайте две MX-записи с разным приоритетом: company.ru MX 10 mail1.company.ru и company.ru MX 20 mail2.company.ru. Настройте оба сервера одинаково. При недоступности mail1 отправители будут автоматически использовать mail2.

Обязательно. Для каждого домена добавьте IP relay-сервера в SPF-запись: v=spf1 ip4:1.2.3.4 include:_spf.company.ru -all. Если relay отправляет почту от имени нескольких доменов, IP должен быть в SPF-записях всех этих доменов.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#postfix relay#маршрутизация почты#postfix несколько доменов#transport maps postfix#relay host postfix#postfix dkim#почтовый сервер linux#postfix sasl
Комментарии 0

Оставить комментарий

загрузка...