Balanceamento de carga no Zimbra Open-Source Edition usando HAProxy

Uma das principais tarefas ao construir infraestruturas Zimbra OSE em grande escala é o balanceamento de carga adequado. Além de aumentar a tolerância a falhas do serviço, sem balanceamento de carga é impossível garantir a mesma capacidade de resposta do serviço para todos os usuários. Para resolver este problema, são utilizados balanceadores de carga - soluções de software e hardware que redistribuem solicitações entre servidores. Entre eles existem alguns bastante primitivos, como o RoundRobin, que simplesmente envia cada solicitação subsequente para o próximo servidor da lista, e também existem outros mais avançados, por exemplo o HAProxy, que é amplamente utilizado em infraestruturas de computação de alta carga devido a um uma série de vantagens significativas. Vamos dar uma olhada em como você pode fazer o balanceador de carga HAProxy e o Zimbra OSE funcionarem juntos.

Balanceamento de carga no Zimbra Open-Source Edition usando HAProxy

Assim, de acordo com os termos da tarefa, temos a infraestrutura Zimbra OSE, que conta com dois Zimbra Proxy, dois servidores LDAP e LDAP Replica, quatro armazenamentos de correio com 1000 caixas de correio cada e três MTAs. Por se tratar de um servidor de e-mail, ele receberá três tipos de tráfego que necessitam de balanceamento: HTTP para download do cliente web, bem como POP e SMTP para envio de e-mail. Neste caso, o tráfego HTTP irá para servidores Zimbra Proxy com endereços IP 192.168.0.57 e 192.168.0.58, e o tráfego SMTP irá para servidores MTA com endereços IP 192.168.0.77 e 192.168.0.78.

Conforme já mencionado, para garantir que as solicitações sejam distribuídas uniformemente entre os servidores, utilizaremos o balanceador de carga HAProxy, que será executado no nó de entrada da infraestrutura Zimbra rodando Ubuntu 18.04. A instalação do haproxy neste sistema operacional é feita usando o comando sudo apt-get instalar haproxy. Depois disso você precisa no arquivo /etc/default/haproxy alterar parâmetro HABILITADO = 0 em HABILITADO = 1. Agora, para ter certeza de que o haproxy está funcionando, basta digitar o comando serviço haproxy. Se este serviço estiver em execução, isso ficará claro na saída do comando.

Uma das principais desvantagens do HAProxy é que por padrão ele não transmite o endereço IP do cliente conectado, substituindo-o pelo seu próprio. Isso pode levar a situações em que os e-mails enviados pelos invasores não podem ser identificados pelo endereço IP para serem adicionados à lista negra. No entanto, esse problema pode ser resolvido. Para fazer isso você precisa editar o arquivo /opt/zimbra/common/conf/master.cf.in em servidores com Postfix e adicione as seguintes linhas:

26      inet  n       -       n       -       1       postscreen
        -o postscreen_upstream_proxy_protocol=haproxy
 
466    inet  n       -       n       -       -       smtpd
%%uncomment SERVICE:opendkim%%  -o content_filter=scan:[%%zimbraLocalBindAddress%%]:10030
        -o smtpd_tls_wrappermode=yes
        -o smtpd_sasl_auth_enable=yes
        -o smtpd_client_restrictions=
        -o smtpd_data_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_recipient_restrictions=
        -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
        -o syslog_name=postfix/smtps
        -o milter_macro_daemon_name=ORIGINATING
        -o smtpd_upstream_proxy_protocol=haproxy
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_filter=[%%zimbraLocalBindAddress%%]:10027
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_options=speed_adjust
 
588 inet n      -       n       -       -       smtpd
%%uncomment SERVICE:opendkim%%  -o content_filter=scan:[%%zimbraLocalBindAddress%%]:10030
        -o smtpd_etrn_restrictions=reject
        -o smtpd_sasl_auth_enable=%%zimbraMtaSaslAuthEnable%%
        -o smtpd_tls_security_level=%%zimbraMtaTlsSecurityLevel%%
        -o smtpd_client_restrictions=permit_sasl_authenticated,reject
        -o smtpd_data_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_recipient_restrictions=
        -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
        -o syslog_name=postfix/submission
        -o milter_macro_daemon_name=ORIGINATING
        -o smtpd_upstream_proxy_protocol=haproxy
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_filter=[%%zimbraLocalBindAddress%%]:10027
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_options=speed_adjust

Por conta disso, abriremos as portas 26, 466 e 588, que receberão o tráfego de entrada do HAProxy. Depois que os arquivos forem salvos, você deve reiniciar o Postfix em todos os servidores usando o comando zmmtactl restart.

Depois disso, vamos começar a configurar o HAProxy. Para fazer isso, primeiro crie uma cópia de backup do arquivo de configurações cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak. Em seguida, abra o arquivo fonte em um editor de texto /etc/haproxy/haproxy.cfg e comece a adicionar as configurações necessárias passo a passo. O primeiro bloco será adicionar um servidor que recebe logs, definir o número máximo permitido de conexões simultâneas, bem como especificar o nome e o grupo do usuário ao qual pertencerá o processo em execução.

global
    user daemon
    group daemon
    daemon
    log 127.0.0.1 daemon
    maxconn 5000
    chroot /var/lib/haproxy

O número de 5000 conexões simultâneas apareceu por um motivo. Como temos 4000 caixas de correio em nossa infraestrutura, precisamos considerar a possibilidade de que todas acessem seus e-mails comerciais ao mesmo tempo. Além disso, é necessário deixar uma pequena reserva caso seu número aumente.

Agora vamos adicionar um bloco com configurações padrão:

defaults
        timeout client 1m
        log global
        mode tcp
        timeout server 1m
        timeout connect 5s

Este bloco define o tempo limite máximo para que o cliente e o servidor fechem a conexão quando ela expirar e também define o modo de operação do HAProxy. No nosso caso, o balanceador de carga opera em modo TCP, ou seja, simplesmente transmite pacotes TCP sem analisar seu conteúdo.

A seguir adicionaremos regras para conexões em várias portas. Por exemplo, se a porta 25 for usada para conexões SMTP e correio, então faz sentido encaminhar as conexões dela para os MTAs disponíveis em nossa infraestrutura. Se a conexão estiver na porta 80, então esta é uma solicitação http que precisa ser encaminhada ao Zimbra Proxy.

Regra para a porta 25:

frontend smtp-25
bind *:27
default_backend backend-smtp-25
 
backend backend-smtp-25
server mta1 192.168.0.77:26 send-proxy
server mta2 192.168.0.78:26 send-proxy

Regra para a porta 465:

frontend smtp-465
bind *:467
default_backend backend-smtp-465

backend backend-smtp-465
server mta1 192.168.0.77:466 send-proxy
server mta2 192.168.0.78:466 send-proxy

Regra para a porta 587:

frontend smtp-587
bind *:589
default_backend backend-smtp-587
 
backend backend-smtp-587
server mail1 192.168.0.77:588 send-proxy
server mail2 192.168.0.78:588 send-proxy

Regra para a porta 80:

frontend http-80
bind    *:80
default_backend http-80
 
backend http-80
mode tcp
server zproxy1 192.168.0.57:80 check
server zproxy2 192.168.0.58:80 check

Regra para a porta 443:

frontend https
bind  *:443
default_backend https-443
 
backend https-443
mode tcp
server zproxy1 192.168.0.57:80 check
server zproxy2 192.168.0.58:80 check

Observe que nas regras de encaminhamento de pacotes TCP para o MTA, ao lado de seus endereços existe um parâmetro enviar-proxy. Isso é necessário para que, de acordo com as alterações que fizemos anteriormente nas configurações do Postfix, o endereço IP original do seu remetente seja enviado junto com os pacotes TCP.

Agora que todas as alterações necessárias foram feitas no HAProxy, você pode reiniciar o serviço usando o comando reinício do haproxy do serviço e comece a usá-lo.

Para todas as perguntas relacionadas ao Zextras Suite, você pode entrar em contato com o representante da Zextras Ekaterina Triandafilidi por e-mail [email protegido]

Fonte: habr.com

Adicionar um comentário