Назад | Перейти на главную страницу

Postfix - ретрансляция в зависимости от отправителя для нескольких доменов

Я провел последние пару дней, просматривая SO-вопросы и документацию Postfix, но не смог понять, что я делаю не так. Моя ситуация такова:

Информация о версии: Postfix 2.11.2 на Debian 7 (Wheezy)

Вывод postconf -n:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_at_myorigin = no
append_dot_mydomain = no
biff = no
canonical_maps = regexp:/etc/postfix/canonical
canonical_classes = envelope_sender, header_sender
config_directory = /etc/postfix
inet_interfaces = localhost
inet_protocols = ipv4
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
mydestination = localhost.com, localhost
myhostname = DomainA.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = /etc/mailname
readme_directory = no
recipient_delimiter = +
sender_dependent_relayhost_maps = hash:/etc/postfix/relayhost_map
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sender_dependent_authentication = yes
smtp_tls_note_starttls_offer = yes
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes

Содержимое файла relayhost_map:

@DomainA.com      [smtp.mailgun.org]:587
@DomainB.name     [smtp.mailgun.org]:587

Попробуйте №1 из canonical_maps- все адреса электронной почты переписаны на sender@DomainB.name

/./ post@domainB.name

Вывод mail.log при отправке электронного письма из командной строки:

    Aug 18 01:55:12 DomainA postfix/pickup[3572]: C72492A00B8: uid=0 from=<root>
    Aug 18 01:55:12 DomainA postfix/cleanup[3591]: C72492A00B8: message-id=<20150818055512.GA3580@DomainA.com>
    Aug 18 01:55:12 DomainA postfix/qmgr[3573]: C72492A00B8: from=<post@DomainB.name>, size=437, nrcpt=1 (queue active)
    Aug 18 01:55:13 DomainA postfix/smtp[3593]: C72492A00B8: to=<me@DomainB.name>, relay=smtp.mailgun.org[50.56.21.178]:587, delay=0.28, delays=0.02/0.02/0.16/0.08, dsn=2.0.0, status=sent (250 Great success)

Заголовки писем при получении почтовым клиентом:

Delivered-To: me@DomainB.name
Return-Path: <bounce+0a2943.d031c-me=DomainB.name@DomainA.com>
[snip]
Sender: post=DomainB.name@DomainA.com
[snip]
From: Primary Root <post@DomainB.name>
To: me@DomainB.name
Subject: test mail #5

Мне кажутся совершенно неправильными две вещи:

  1. Почему для адреса отправителя установлено значение post=DomainB.name@DomainA.com, хотя Postfix был установлен как:

    append_at_myorigin = нет append_dot_mydomain = нет

  2. Из-за того, что к адресу отправителя добавлен домен DomainA.com, похоже, что Postfix решил ретранслировать почту с использованием данных SASL для DomainA, что подтверждается просмотром журналов на панели инструментов MailGun. Это приводит к тому, что адрес возврата также устанавливается на DomainA.

Попробуйте № 2 из canoncial_maps- только адреса электронной почты, заканчивающиеся на DomainB.com, перезаписываются на email@DomainB.com

/@DomainB.name/ email@DomainB.name

Настройка файла .muttrc для принудительного использования адреса электронной почты с адреса DomainB.com

set from="mutt@DomainB.name"
set use_from=yes
set use_envelope_from = yes

Вывод mail.log:

Aug 18 03:40:49 DomainA postfix/qmgr[8809]: 2BEB92A00D3: from=<mutt@DomainB.name>, size=441, nrcpt=1 (queue active)
Aug 18 03:40:49 DomainA postfix/smtp[8824]: 2BEB92A00D3: to=<me@DomainB.name>, relay=smtp.mailgun.org[104.130.177.23]:587, delay=0.58, delays=0.01/0.02/0.37/0.17, dsn=2.0.0, status=sent (250 Great success)

Заголовки писем при получении почтовым клиентом:

Delivered-To: me@DomainB.name
[snip]
Return-Path: <bounce+0a2943.d031c-me=DomainB.name@DomainA.com>
[snip]
Sender: email=DomainB.name@DomainA.com
[snip]
From: Primary Root <email@DomainB.name>
To: me@DomainB.name
Subject: test mail hdr #7
  1. Из этого теста я вижу, что проблема не в каноническом сопоставлении. Перезапись происходит правильно. Однако Postfix, похоже, не распознает вывод как действующий адрес электронной почты и добавляет полное доменное имя, что вызывает прерывание ретрансляции.

Любые предложения / идеи о том, как это исправить, приветствуются!

Чтобы по-новому взглянуть на эту проблему, я начал настраивать аналогичную установку ретранслятора на другом сервере, и именно во время этого процесса я наконец отследил источник проблемы. Оказалось, что в моем файле sasl_passwd мне не хватало важного символа.

sasl_passwd перед исправлением:

DomainB.name        relay@DomainB.name:somepassword
#Fallback
[smtp.mailgun.org]:587  relay@DomainA.com:anotherpasswd

sasl_passwd после исправления:

@DomainB.name        relay@DomainB.name:somepassword
#Fallback
[smtp.mailgun.org]:587  relay@DomainA.com:anotherpasswd

Проблема заключалась в отсутствии единственного символа «@» перед виртуальным DomainB. Резервная запись была причиной того, почему оказалось так сложно отладить эту проблему, поскольку вся почта доставлялась по этому маршруту, когда Postfix не мог сопоставить любую другую запись.

Поскольку это может оказаться полезным, я также включаю настройку моего файла канонических карт после того, как моя конфигурация ретранслятора начала работать правильно:

/(.*@)DomainB.name/ ${1}DomainB.name
/(.*@)DomainA.com/ ${1}DomainA.com

Вышеупомянутое регулярное выражение гарантирует, что отправитель конверта обновляется в соответствии с отправителем From, избегая любого «via DomainA» в моем почтовом клиенте.

В качестве постскриптума выясняется, что в Ubuntu 14.04 недостаточно иметь только следующие строки в main.cf:

canonical_maps = regexp:/etc/postfix/canonical
canonical_classes = envelope_sender, header_sender

Также должна быть включена следующая строка:

sender_canonical_maps = regexp:/etc/postfix/canonical_sender

Содержимое второго файла может быть идентично первому, но оно должно присутствовать, чтобы избежать заголовков «через домен» при ретрансляции электронной почты в Ubuntu.