sábado, 9 de agosto de 2008

Postfix com servidor externo e interno + DSPAM

Semana passada tive que alterar um servidor Postfix e tive um trabalhão para achar uma solução para meu caso.

Cenário inicial


Problema
O servidor externo recebia os e-mails e passava para o Amavis (porta 10024). O Amavis devolvia a mensagem verificada na porta 10025 e então o e-mail era encaminhado para o DSPAM (se o usuário usasse antispam e isso fica configurado no LDAP). Se a mensagem não fosse spam, o DSPAM jogava o e-mail direto para o SMTP do servidor interno via VPN. Caso a VPN estivesse fora do ar, os e-mails eram então devolvidos aos remetentes (bounce), pois o DSPAM não trabalha com filas e não sabe como gerenciar tal situação. Já os usuários que não usavam o DSPAM recebiam a mensagem quando a VPN voltasse, pois o Postfix gerenciava a fila de entrega.

Soluções tentadas
  • A primeira solução abordada foi fazer o DSPAM entregar o e-mail de volta para o Postfix, em outra porta (10026, por exemplo). O problema dessa abordagem é que o e-mail entrava em loop, pois era enviado para o DSPAM, que voltava para o Postfix, que enviava para o DSPAM e por aí vai... Mas qual a causa disso ? A causa era o transport_maps (responsável pelo envio ao DSPAM) que não pode ser alterado pelo smtpd.
  • A segunda solução abordada, por sugestão do Reinaldo de Carvalho (desenvolvedor do Korreio), foi trabalhar com o trivial-rewrite. Ele me sugeriu uma configuração do Postfix com esse recurso mas da mesma forma não foi possível sobrescrever o transport_maps, assim com no caso do smtpd (apesar de no caso do trivial_rewrite, a opção transport_maps ser válida). Encontrei um post na Internet que explicava que isso não funcionaria, somente se uma nova instância do Postfix fosse carregada com as novas configurações. Apesar de não ver sentido em ter uma opção que não funciona como deveria, não consegui fazer isso funcionar de maneira alguma. Parti então para a solução final e que finalmente funcionou.
  • A última abordagem tentada foi a instalação de um Exim que ficou ouvindo na porta 26. Dessa forma, após verificar a mensagem o DSPAM entrega os e-mails para ele. Ele então se encarrega de gerenciar a fila e fazer com que os e-mails sejam entregues, mesmo que a VPN esteja fora do ar.
Cenário final


Outra alternativa teria sido colocar o próprio Postfix em outra instância, mas achei mais tranquilo colocar o Exim como smarthost. Isso é claro, foi uma escolha pessoal, pois qualquer outro MTA atenderia bem nessa situação.