Balanceo de carga en Zimbra Open-Source Edition usando HAProxy

Una de las principales tareas en la construcción de infraestructuras Zimbra OSE a gran escala es el equilibrio de carga competente. Además de aumentar la tolerancia a fallas del servicio, sin equilibrio de carga es imposible garantizar la misma capacidad de respuesta del servicio para todos los usuarios. Para resolver este problema, se utilizan equilibradores de carga: soluciones de software y hardware que redistribuyen las solicitudes entre servidores. Entre ellos, los hay bastante primitivos, como RoundRobin, que simplemente envía cada solicitud siguiente al siguiente servidor de la lista, y los hay más avanzados, por ejemplo, HAProxy, que se usa mucho en infraestructuras informáticas muy cargadas debido a una serie de ventajas significativas. Echemos un vistazo a cómo el balanceador de carga HAProxy y Zimbra OSE pueden trabajar juntos.

Balanceo de carga en Zimbra Open-Source Edition usando HAProxy

Entonces, de acuerdo con los términos del problema, tenemos la infraestructura Zimbra OSE, que tiene dos Zimbra Proxies, dos servidores LDAP y LDAP Replica, cuatro almacenes de correo con 1000 buzones cada uno y tres MTA. Dado que se trata de un servidor de correo, recibirá tres tipos de tráfico que deben equilibrarse: HTTP para descargar el cliente web, así como POP y SMTP para enviar correo electrónico. En este caso, el tráfico HTTP irá a los servidores Zimbra Proxy con las direcciones IP 192.168.0.57 y 192.168.0.58, y el tráfico SMTP irá a los servidores MTA con las direcciones IP 192.168.0.77 y 192.168.0.78.

Como ya se mencionó, para garantizar una distribución uniforme de las solicitudes entre servidores, utilizaremos el balanceador de carga HAProxy, que se ejecutará en el nodo de entrada de la infraestructura de Zimbra con Ubuntu 18.04. La instalación de haproxy en este sistema operativo se realiza mediante el comando sudo apt-get instalar haproxy. Después de eso, es necesario en el archivo. /etc/predeterminado/haproxy cambiar parámetro HABILITADO = 0 en HABILITADO = 1. Ahora, para asegurarse de que haproxy esté funcionando, simplemente ingrese el comando haproxy de servicio. En el caso de que este servicio se esté ejecutando, quedará claro en la salida del comando.

Una de las principales carencias de HAProxy es que por defecto no transmite la dirección IP del cliente conectado, reemplazándola por la propia. Esto puede conducir a situaciones en las que las cartas enviadas por los atacantes no pueden identificarse por dirección IP para agregarlas a la lista negra. Sin embargo, este problema se puede resolver. Para hacer esto, necesita editar el archivo /opt/zimbra/common/conf/master.cf.in en los servidores de Postfix y agregue las siguientes líneas:

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

Debido a esto, abriremos los puertos 26, 466 y 588, que recibirán el tráfico entrante de HAProxy. Después de guardar los archivos, reinicie Postfix en todos los servidores mediante el comando zmmtactl restart.

Después de eso, comencemos a configurar HAProxy. Para hacer esto, primero cree una copia de seguridad del archivo de configuración cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak. A continuación, abra el archivo de origen en un editor de texto /etc/haproxy/haproxy.cfg y comience a agregarle gradualmente las configuraciones necesarias. El primer bloque será agregar un servidor que tome registros, establecer el número máximo de conexiones simultáneas permitidas, así como especificar el nombre y el grupo del usuario al que pertenecerá el proceso ejecutable.

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

La cifra de 5000 conexiones simultáneas apareció por algo. Dado que existen 4000 buzones en nuestra infraestructura, es necesario prever la posibilidad de que todos vayan a su correo de trabajo al mismo tiempo. Además, es necesario dejar un pequeño margen por si aumenta su número.

Ahora agreguemos un bloque con la configuración predeterminada:

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

Este bloque establece el tiempo máximo de espera del cliente y del servidor para cerrar la conexión cuando expira, y también establece el modo de funcionamiento de HAProxy. En nuestro caso, el balanceador de carga funciona en modo TCP, es decir, simplemente transfiere paquetes TCP sin analizar su contenido.

A continuación, agregaremos reglas para conexiones en varios puertos. Por ejemplo, si el puerto 25 se usa para conexiones SMTP y transferencia de correo, entonces tiene sentido reenviar conexiones a él a los MTA que tenemos en nuestra infraestructura. Si la conexión está en el puerto 80, se trata de una solicitud http que debe reenviarse al proxy de Zimbra.

Regla para el puerto 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

Regla para el puerto 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

Regla para el puerto 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

Regla para el puerto 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

Regla para el puerto 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

Tenga en cuenta que en las reglas para reenviar paquetes TCP al MTA, junto a sus direcciones está el parámetro enviar-proxy. Esto es necesario para que, de acuerdo con los cambios que hicimos anteriormente en la configuración de Postfix, la dirección IP original de su remitente también se envíe junto con los paquetes TCP.

Ahora que se han realizado todos los cambios necesarios en HAProxy, puede reiniciar el servicio con el comando reiniciar servicio haproxy y empezar a usarlo.

Para todas las preguntas relacionadas con Zextras Suite, puede comunicarse con el Representante de Zextras Ekaterina Triandafilidi por correo electrónico [email protected]

Fuente: habr.com

Añadir un comentario