O postfix trivial-rewrite expande o destinatário incorretamente depois que o aliasing virtual é feito

1

Eu hospedo um punhado de domínios em uma única caixa (Linux, Ubuntu 13.x) e estou tentando usar o Postfix 2.10.2-1 para encaminhar mensagens para eles. (Eu usei o sendmail nos últimos 10 anos, então isso é novidade para mim.) Todos os meus MX registros estão configurados de acordo, então o correio externo está chegando à caixa bem.

Eu segui os vários tutoriais on-line e tenho as seguintes linhas relevantes em minhas configurações:

main.cf
-------
myhostname            = foo.a.com
myorigin              = /etc/mailname     # this just has 'a.com' inside it
mydestination         = a.com localhost.localdomain localhost
virtual_alias_domains = b.com c.org
virtual_alias_maps    = hash:/etc/postfix/virtual

No momento, só quero que todas as mensagens endereçadas ao postmaster em qualquer um dos domínios acessem a conta do postmaster e todas as mensagens endereçadas a qualquer outra pessoa em qualquer um dos domínios acessem a conta associada.

virtual
-------
[email protected]  postmaster
@a.com            userA
[email protected]  postmaster
@b.com            userB
[email protected]  postmaster
@c.org            userC

Infelizmente, todas as mensagens endereçadas a qualquer pessoa em qualquer um desses domínios estão sendo encaminhadas para usuárioA . Até que eu ativasse o log detalhado, pensei que os domínios virtuais não estavam sendo respeitados. Depois de ativar o registro detalhado, no entanto, vejo isso acontecendo para todos os e-mails recebidos:

mail.log
--------
...
postfix/cleanup: maps_find: virtual_alias_maps: hash:/etc/postfix/virtual(0.lock|fold_fix): @b.com = userB
postfix/cleanup: mail_addr_find: [email protected] -> userB
postfix/cleanup: send attr request = rewrite
postfix/cleanup: send attr rule = local
postfix/cleanup: send attr address = userB

Mas, em seguida, a reescrita trivial é executada novamente (pela oitava vez que processa essa parte específica do email) e decide que o userB não é o verdadeiro destinatário final da conta Unix, mas representa um email endereço em myorigin (ou talvez esteja escolhendo o primeiro elemento em mydestination ... que faria mais sentido).

postfix/trivial-rewrite: master_notify: status 0
postfix/trivial-rewrite: rewrite socket: wanted attribute: request
postfix/trivial-rewrite: input attribute name: request
...
postfix/trivial-rewrite: 'local' 'userB' -> '[email protected]'  # <-- d'oh!
postfix/trivial-rewrite: send attr flags = 0
postfix/trivial-rewrite: send attr address = [email protected]
postfix/trivial-rewrite: master_notify: status 1

Então postfix/cleanup assume

postfix/cleanup: maps_find: virtual_alias_maps: hash:/etc/postfix/virtual(0.lock|fold_fix): @a.com = userA
postfix/cleanup: mail_addr_find: [email protected] -> userA
postfix/cleanup: send attr request = rewrite
postfix/cleanup: send attr rule = local
postfix/cleanup: send attr address = userA

e conclui que userA é o destinatário verdadeiro da conta Unix.

Eu não sei quase nada sobre o Postfix, mas parece que a partir dos logs ele decide apenas sobre o endereço do destinatário final depois de executá-lo, reescrever duas vezes e obter o mesmo resultado duas vezes seguidas. Como evito que ele interprete a conta local userB como um endereço de e-mail userB @ mydestination [0] ? Eu quero que ele pare assim que encontrar o userB local e apenas entregue-o a ele.

Não posso listar @mydestination [0] dentro de / etc / postfix / virtual? Embora isso possa resolver o meu problema atual (porque esses usuários são usuários reais do Unix na caixa, então o email chegaria ao lugar certo), o Postfix ainda pensaria que [email protected] é o destinatário final. Isso parece errado para mim. Deve apenas saber que userB é uma conta Unix e parar por aí.

    
por dg99 04.11.2014 / 19:51

2 respostas

0

Então, consegui resolver meu problema como sugeri no final da minha pergunta, mas também concluí que evitar domínios virtuais pode ser o caminho certo a ser seguido.

Primeiro, a solução proposta inicial: remova as referências a a.com do arquivo virtual .

virtual
-------
#[email protected]  postmaster
#@a.com            userA
[email protected]  postmaster
@b.com            userB
[email protected]  postmaster
@c.org            userC

Depois disso, as traduções virtuais para b.com e c.org geraram [email protected] e [email protected] como esperado, e desde a.com é uma das entradas de mydestination , postfix / local obedientemente entregou o correio de userB para /var/mail/userB e userC mail para /var/mail/userC .

É claro que, como temi na minha pergunta inicial, ainda está concluindo que a.com é o domínio final de todos esses usuários, o que me parece estranho. A solução óbvia, então, é não usar domínios virtuais - o ponto inteiro dos domínios virtuais é aceitar mensagens para endereços que não são usuários Unix reais no sistema. Mas como todos os meus usuários catch-all são usuários reais do Unix no sistema, eu deveria estar usando aliases locais :

/etc/aliases
------------
admin: postmaster
www: postmaster
@a.com: userA
@b.com: userB
@c.com: userC

Ainda posso ter todos os endereços sem usar virtual domínios.

    
por 07.11.2014 / 21:07
0

Isso não é tecnicamente uma resposta, mas pode ser o melhor que você recebe. Eu trabalhei com muitos mapas do sendmail por alguns anos. Sua melhor aposta é quebrá-lo, torná-lo mais simples. Faça o mapa incluir apenas um dos seus domínios, faça o curinga funcionar para esse domínio e construa a partir daí.

Use os sinalizadores de diagnóstico do sendmail para facilitar o seu uso, como o sinalizador sendmail -bv.

    
por 04.11.2014 / 20:32

Tags