Postfix - retransmissão dependente do remetente para vários domínios

4

Eu passei os últimos dias passando por perguntas do SO e pela documentação do Postfix, mas não consegui descobrir o que estou fazendo de errado. Minha situação é a seguinte:

  • Eu tenho um servidor executando o Postfix que possui seu próprio FQDN (DomainA). Mail para DomainA é retransmitido através do MailGun.
  • O servidor hospeda vários domínios de website e o plano é garantir que o email desses domínios seja retransmitido por meio do MailGun, mas como um domínio separado. Isso criará endereços de devolução separados, etc. Chame esse domínioB
  • Dependendo de qual domínio está presente no Cabeçalho, configure o Postfix para escolher a autenticação SASL apropriada, garantindo que os cabeçalhos apropriados sejam adicionados.

Informação da versão: Postfix 2.11.2 no Debian 7 (Wheezy)

Saída do 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

Conteúdo do arquivo relayhost_map:

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

Tente # 1 de canonical_maps- todos endereços de e-mail reescritos para [email protected]

/./ [email protected]

Saída de mail.log ao enviar um email a partir da linha de comando:

    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=<[email protected]>
    Aug 18 01:55:12 DomainA postfix/qmgr[3573]: C72492A00B8: from=<[email protected]>, size=437, nrcpt=1 (queue active)
    Aug 18 01:55:13 DomainA postfix/smtp[3593]: C72492A00B8: to=<[email protected]>, 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)

Cabeçalhos de e-mail quando recebidos pelo cliente de e-mail:

Delivered-To: [email protected]
Return-Path: <[email protected]>
[snip]
Sender: [email protected]
[snip]
From: Primary Root <[email protected]>
To: [email protected]
Subject: test mail #5

Duas coisas me parecem muito erradas:

  1. Por que o endereço do remetente está definido como [email protected], embora o Postfix tenha sido definido como:

    append_at_myorigin = não append_dot_mydomain = no

  2. Devido ao endereço do remetente com DomainA.com anexado a ele, parece que o Postfix optou por retransmitir email usando detalhes do SASL para DomainA - confirmado pela análise de logs no painel do MailGun. Isso está fazendo com que o endereço de retorno seja definido como DomainA também.

Tente # 2 de endereços de e-mail canonciais_maps- somente que terminam em DomainB.com e sejam reescritos para [email protected]

/@DomainB.name/ [email protected]

configuração do arquivo .muttrc para forçar De endereço de e-mail como DomainB.com

set from="[email protected]"
set use_from=yes
set use_envelope_from = yes

Saída de mail.log:

Aug 18 03:40:49 DomainA postfix/qmgr[8809]: 2BEB92A00D3: from=<[email protected]>, size=441, nrcpt=1 (queue active)
Aug 18 03:40:49 DomainA postfix/smtp[8824]: 2BEB92A00D3: to=<[email protected]>, 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)

Cabeçalhos de e-mail quando recebidos pelo cliente de e-mail:

Delivered-To: [email protected]
[snip]
Return-Path: <[email protected]>
[snip]
Sender: [email protected]
[snip]
From: Primary Root <[email protected]>
To: [email protected]
Subject: test mail hdr #7
  1. A partir desse teste, posso ver que o mapeamento canônico não é o problema. A reescrita está acontecendo corretamente. No entanto, o Postfix parece não reconhecer a saída como um endereço de email válido e anexa o FQDN que faz com que a retransmissão seja interrompida.

Todas as sugestões / ideias sobre como corrigir isso são muito bem-vindas!

    
por avggeek 18.08.2015 / 11:35

1 resposta

3

Em um esforço para obter uma nova perspectiva sobre esse problema, comecei a configurar uma configuração similar de relayhost em outro servidor e foi durante esse processo que finalmente rastreei qual era a origem do problema. Acontece que no meu arquivo sasl_passwd eu estava faltando um personagem crucial.

arquivo sasl_passwd antes da correção:

DomainB.name        [email protected]:somepassword
#Fallback
[smtp.mailgun.org]:587  [email protected]:anotherpasswd

arquivo sasl_passwd após a correção:

@DomainB.name        [email protected]:somepassword
#Fallback
[smtp.mailgun.org]:587  [email protected]:anotherpasswd

O problema era o único caractere "@" ausente antes do DomainB virtual. A entrada de fallback foi o motivo pelo qual foi tão difícil depurar esse problema, já que todos os e-mails estavam sendo entregues por essa rota quando o Postfix não conseguiu corresponder a nenhuma outra entrada.

Como pode ser útil, também estou incluindo a configuração do meu arquivo de mapas canônicos assim que minha configuração de relayhost começar a funcionar corretamente:

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

O regex acima assegura que o remetente Envelope seja atualizado para corresponder ao remetente De, evitando qualquer "via DomainA" no meu cliente de e-mail.

Como um postscript, verifica-se que no Ubuntu 14.04 não é suficiente ter apenas as seguintes linhas em main.cf:

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

A seguinte linha também deve ser incluída:

sender_canonical_maps = regexp:/etc/postfix/canonical_sender

O conteúdo do segundo arquivo pode ser idêntico ao primeiro, mas deve estar presente para evitar cabeçalhos "via domínio" ao retransmitir emails no Ubuntu.

    
por 20.08.2015 / 15:05