Postfix: Utilizando diferentes IPs de saída para diferentes domínios.

Depois de algum tempo (anos!) sem atualizar este blog, eis que achei algum tempo para postar algo interessante, principalmente para mail admins.

Há alguns meses, precisei segmentar em um gateway SMTP, vários domínios diferentes, por IPs de saídas diferentes, eis que depois de ler a documentação do Postfix e suar um pouco a camisa (não seriam os dedos? :-D), encontrei a solução, e a descrevo neste artigo.

A versão do Postfix para essa solução é a 2.7.1. O servidor necessitará de vários IPs válidos, devidamente configurados com seus reversos e tudo mais.

Como o objetivo deste artigo não é ensinar como compilar ou instalar o Postfix, então vamos por a mão na massa a partir de já.

Como se sabe, você pode configurar vários transports no Postfix, que funcionam de maneira independente um do outro, inclusive com configurações que podem se sobrepor as configurações do main.cf!

Imaginemos que tenhamos 3 IPs de saída: 1.1.1.1, 1.1.1.2 e 1.1.1.3. Cada um deles poderá ter um ou mais domínios alocados. E cada um deles (IPs) deverá ter seu transport.

A primeira coisa a se fazer, é criar os transports. Para isso, abra o arquivo master.cf com seu editor preferido, geralmente localizado em /etc/postfix/master.cf.

A configuração dos transport seguem da seguinte maneira:

transport_1 unix - - n - - smtp
-o smtp_bind_address=1.1.1.1

transport_2 unix - - n - - smtp
-o smtp_bind_address=1.1.1.2

transport_3 unix - - n - - smtp
-o smtp_bind_address=1.1.1.3

Após configurar esses transports, é necessário mapeá-los para que o Postfix saiba por onde entregar as mensagens, ou então irá fazê-lo pelo transport padrão, que é o que já vem configurado durante a instalação.

Para isso, criaremos um arquivo de mapeamento chamado transport_table em /etc/postfix/transport_table.

/@meudominio1\.com\.br/ :transport_1
/@meudominio2\.com\.br/ :transport_2
/@meudominio3\.com\.br/ :transport_3

Você também pode mapear vários domínios em um transport.

Feito isso, agora é hora de compilar nosso hash, para isso digitamos:

$ postmap /etc/postfix/transport_table

Terminou? Não.
Agora vem a "mágica" pro Postfix entender como seguir esse mapeamento e dar finalmente utilização aos transports novos que foram criados.

Para fazer a "grande mágica", abra o arquivo /etc/main.cf e adicione a seguinte linha:

sender_dependent_default_transport_maps = regexp:/etc/postfix/transport_table

Feito isso, basta dar um restart no Postfix. Opa, por que não um simples reload? A documentação oficial do Postfix recomenda um restart completo no daemon após qualquer modificação nos transports.

$ postfix restart

Feito isso, basta enviar e-mails com os domínios que você mapeou e conferir em seus cabeçalhos o IP de saída. Caso não tenha dado certo, verifique a versão de seu Postfix e refaça o que foi mostrado neste artigo.

Espero que esse artigo tenha sido útil, pois passei alguns dias pesquisando sobre isso e é raridade encontrar tutoriais falando sobre este assunto.

3 Response to "Postfix: Utilizando diferentes IPs de saída para diferentes domínios."

  1. eisch! voltou com a mulesta, hein, mozo (;
    coisa fina, meu caro. muito bom post.
    ['s]

    Anônimo says:

    Só um detalhe, que pra mim passou a funcionar depois que alterei, o que me leva a crer que foi um erro de sintaxe no exemplo citado:

    /@meudominio1\.com\.br/ :transport_1

    O correto seria o ":" no final da linha, ficando assim:

    /@meudominio1\.com\.br/ transport_1:

    Amigo
    Preciso de um help...
    Me de uma força,...
    Coloquei 4 ips, porem eu preciso fazer o rodizio de ip nao por dominio como foi seu caso, mas sim por tempo ou por x mensagens enviadas...
    A unica solucao que achei por enquanto é usar 4 arquivos de configuracao do phplist, cada um com um servidor diferente setado, e no cron eu chamo de hora em hora um envio usando um arquivo de configuracao diferente.
    So uso o server para envio de email marketing.

    Vlw se puder ajudar.