Estou tentando criar um cluster SMTP com balanceamento de carga. Os servidores de e-mail já existem e executam o Exim 4. Inicialmente, olhei para usar o Nginx para fazer o balanceamento de carga, mas no sistema de teste todos os servidores de e-mail veem as conexões de entrada como provenientes do IP do balanceador de carga IP do remetente, e depois de pesquisar no Google não parece haver nenhuma maneira de contornar isso. Como isso efetivamente transforma o cluster de e-mail em um retransmissor aberto, é claramente um não-iniciante, o que é uma pena, já que o Nginx funciona lindamente de outra forma.
Por isso, estou procurando usar o HAProxy, pois vejo que ele tem a capacidade de passar as conexões com o IP de origem original intacto para que as listas de permissão de retransmissão e as ACLs do sistema funcionem corretamente.
No entanto, tendo configurado HAProxy como por vários exemplos on-line, eu recebo "erro de sincronização SMTP" (e um erro de 500 séries para que o e-mail seja devolvido) e a conexão caia imediatamente ou apenas a conexão caia sem SMTP mensagem em tudo.
Aqui está o haproxy.conf em uso:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user nobody
group nobody
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
option redispatch
retries 3
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
maxconn 3000
listen smtp
bind 0.0.0.0:25
mode tcp
no option http-server-close
balance roundrobin
# option smtpchk HELO smtp-in.example.com
server smtp01 10.0.0.141:25 send-proxy check
server smtp02 10.0.0.143:25 send-proxy check
Apesar da presença do comando send-proxy, que conheço é como você diz ao haproxy para passar pelo IP de origem, os logs do Exim são assim:
016-12-26 07:06:48 Erro de sincronização do protocolo SMTP (entrada enviada sem aguardar saudação): conexão rejeitada de H = [10.0.0.150] entrada="PROXY TCP4 10.0.0.150 10.0.0.143 40334 25 \ r \ nHELO smtp-in.example.comr \ n "
Neste caso, 150 é o balanceador de carga e o .143 é o servidor SMTP do Exim.
Perguntas:
-
É possível obter o Nginx para apresentar as conexões SMTP aos servidores de e-mail com o IP de origem sendo o IP de origem remoto real em vez do balanceador de carga?
-
Como alternativa, isso é possível no HAProxy e como isso é feito?
Nesse caso, o sistema de produção atual executa o LVS, mas depende das interfaces de balanceador de carga e de loopback em todos os servidores de correio que compartilham o mesmo endereço IP. O novo balanceador de carga será o OpenSUSE 42.2 e, entre outras coisas, se detectar um IP já em uso na rede, ele parece removê-lo de maneira útil para evitar um conflito. Então o LVS está na nova versão.
Outras soluções para o problema que estou considerando incluem a separação do tráfego SMTP de entrada e saída inteiramente (atualmente tudo é executado pelo mesmo balanceador de carga), instalando um retransmissor simples (qmail possivelmente) no endereço IP do balanceador de carga, configurado para permitir somente intervalos reconhecidos de acordo com a prática de retransmissão padrão e usar o round-robin de DNS simples nos registros MX para enviar SMTP de entrada diretamente para os servidores de email. Mas uma solução com balanceamento de carga seria mais elegante.