Dividindo carga de saída de servidor SMTP (MTA Selor)

Como dividir/balancear a carga de saída de seus e-mails entre dois ou mais links, com base no domínio de saída, IP, remetente ou qualquer outra coisa. O servidor de e-mails usado para isto, será o MTA Selor.

[ Hits: 4.655 ]

Por: Lucas Priori em 08/08/2014


Configurando



Muitas pessoas entram em contato comigo, para saber como dividir a carga de saída entre dois ou mais links.

Imagine que seu servidor tem disponível 2 ou mais links e você, por algum motivo, quer que o seu MTA envie algumas mensagens usando esses links alternativos.

O Servidor SMTP usado aqui será o MTA Selor.

Neste artigo, eu preciso supor algumas cadeias de redes LOCAIS para poder criar os exemplos (adapte-as para a rede de seu servidor). Usarei, então:

Rede 1: 192.168.0.0/24:
  • IP do servidor: 192.168.0.25
  • IP do gateway: 192.168.0.1 (link1)

Rede 2: 10.10.10.0/24:
  • IP do servidor: 10.10.10.25
  • IP do gateway: 10.10.10.1 (link2)

A Rede 1 (principal), provavelmente, já está configurada em seu servidor, então, precisamos criar apenas a tabela e a saída para a Rede 2.

Configurando a saída do outro link:

Edite o arquivo /etc/iproute2/rt_tables para criarmos a tabela que será relacionada ao nosso link secundário:

# pico /etc/iproute2/rt_tables

Dentro do arquivo, logo abaixo de "default", acrescente a seguinte linha:

00     link2

Salve e saia do arquivo.

Rode os seguintes comandos:

# ip route flush cache
# ip route add default via 10.10.10.1 table link2

Agora, para a tabela link2, o GNU/Linux já sabe que o gateway dela será o 10.10.10.1, e não o 192.168.0.1 da rede 1.

Basta adicionarmos uma regra dizendo que todos os pacotes que saem e o endereço de origem, é o nosso servidor de e-mails 10.10.10.25, devem sair pelo link2:

# ip rule add from 10.10.10.25 lookup link2
# ip route flush cache

A parte do GNU/Linux está feita. Agora, nós podemos entrar no arquivo de evento do Selor e especificar qualquer condição para forçarmos a saída do e-mail por este link.

Todos os pacotes cujo o IP de origem for 10.10.10.25, sairão pelo link2. No Selor, nós podemos especificar qual IP de origem ele deve usar para enviar um e-mail para fora. Usamos para isto a ação: Mx_source!

Abra o arquivo referente ao evento Event.rcpt (por padrão, fica em /usr/local/selor/rcpt_rules):

# pico /usr/local/selor/rcpt_rules

Vamos à "festa":

Digamos que o Hotmail está recusando mensagens de nosso servidor sem a menor explicação (coisa extremamente comum de acontecer, mesmo com um IP limpo, com SPF e tudo mais...) e queremos enviar as mensagens pelo link secundário:

Acrescente a seguinte linha no início do arquivo:

Find_in_to? "@hotmail.com" Mx_source! "10.10.10.25"

Obs.: lembrando que o IP de Internet desse segundo link, deve estar com seu endereço reverso configurado. Pode ser igual ao do IP do Link1.

Podemos usar muitas condições para acionarmos a ação Mx_source! "10.10.10.25", que faz o envio do e-mail sair pelo link2.

Tem aquele funcionário da empresa que precisa enviar mala direta, mas nós não queremos congestionar o link1 com suas mensagens:

Pode ser pelo IP do micro dele (Ex: 192.168.0.155):

Ip? "192.168.0.155" Mx_source! "10.10.10.25"

Ou, pode ser por usuário autenticado ([email protected]):

Auth? Cmp_str? "%u:[email protected]" Mx_source! "10.10.10.25"

Extra

Vale lembrar que temos também a ação Mx_dest!, que força a entrega daquele destinatário para um outro MTA. Às vezes, pegamos o problema de um servidor SMTP remoto começar a recusar mensagens de nosso servidor por algum motivo.

Podemos encaminhar as mensagens com destino ao domínio hospedado naquele HOST para um outro MTA nosso em outra rede. Digamos que o HOST que mantém os e-mails do domínio "dominiodeteste123.net" está recusando conexões de nosso MTA, mas nós temos um segundo MTA em outro link e vamos supor que esteja no IP 254.254.254.50 na porta 587.

Find_in_to? "@dominiodeteste123.net" Mx_dest! "254.254.254.50 587"

Você poderia também usar autenticação, para fazer o Selor autenticar-se no outro MTA para entregar a mensagem:

Find_in_to? "@dominiodeteste123.net" Mx_dest! "254.254.254.50 587" Mx_auth! "usuario:senha"

Extra 2

O Selor compilado com a libcap (capability) para GNU/Linux, vem com a ação "So_mark!" que adiciona marcações aos pacotes quando estão sendo enviados, igual aos MARKs do iptables -t mangle .... -j MARK --set-mark, onde podemos criar regras para fazer QoS e controlar a taxa de transmissão.

Ex.:

Ip? "192.168.0.60" So_mark! "1"

Todos os e-mails que o IP 192.168.0.60 enviar através de seu servidor, sairão com pacotes TCP/IP marcados com o valor 1. Você pode criar regras de QoS, através da ferramenta "tc".

Existem inúmeros artigos aqui no Viva o Linux explicando como fazer QoS com base nestas marcações.


Qualquer dúvida é só perguntar.

Obrigado à equipe do Viva o Linux.

   

Páginas do artigo
   1. Configurando
Outros artigos deste autor

Benchmark entre servidores de e-mails

MTA Selor: Servidor de E-mails - Novo Projeto GPL

Servidor de emails com Dovecot e MTA Sceo (projeto brasileiro)

Servidor de e-mail no Linux com MTA Sceo

Leitura recomendada

Instalando o servidor de mensagens Postfix no Slackware 10.1

Cluster de Alta disponibilidade do Zimbra Collaboration System

Servidor de email completo com Postfix

Configurando servidor IMAP

Configurando várias contas de e-mail no Thunderbird

  
Comentários
[1] Comentário enviado por joorlando3 em 11/08/2014 - 09:21h

As dicas são muito boas! O hotmail recusa mesmo emails. As dicas de usar duas rotas são muito boas, algo que anteriormente demorei muito para entender.

[2] Comentário enviado por renatomartins_3 em 11/08/2014 - 20:37h

Parabéns !!!
ótimo Artigo
vai me ajudar e a outros tb !!

Estou usando o selor com muito sucesso ele è um ótimo servidor mta bem cutomizavel
migrei vários servidores que tinha tanto postifx e qmail para ele e estou muito feliz com os resultados !!

do postfix e do qmail as migrações foram totalmente transparentes usei até os mesmo usuários e senha dos domínios virtuais
Show de Bola mesmo

Parabéns Lucas !!


Contribuir com comentário