Equilibrio de carga en Zimbra Open-Source Edition con HAProxy

Una de las tareas principales en la construcción de infraestructuras Zimbra OSE a gran escala es el equilibrio de carga competente. Además del hecho de que aumenta la tolerancia a fallas del servicio, sin equilibrio de carga es imposible proporcionar 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, hay algunos bastante primitivos, como RoundRobin, que simplemente envía cada solicitud siguiente al siguiente servidor de la lista, y hay otros más avanzados, por ejemplo, HAProxy, que se usa ampliamente en infraestructuras informáticas altamente cargadas debido a una serie de ventajas significativas. Veamos cómo el equilibrador de carga HAProxy y Zimbra OSE pueden trabajar juntos.

imagen

Entonces, de acuerdo con las condiciones de la tarea, se nos dio la infraestructura de Zimbra OSE, en la que hay dos servidores Zimbra Proxy, dos LDAP y LDAP Replica, cuatro almacenes de correo con 1000 buzones en cada uno y tres MTA. Teniendo en cuenta que estamos tratando con un servidor de correo electrónico, 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 Proxy Zimbra 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 equilibrador de carga HAProxy, que funcionará en el nodo de entrada de la infraestructura de Zimbra que ejecuta Ubuntu 18.04. La instalación de haproxy en este sistema operativo se realiza utilizando el comando sudo apt-get install haproxy . Después de eso, en el archivo / etc / default / haproxy, cambie el parámetro ENABLED = 0 a ENABLED = 1 . Ahora, para asegurarse de que haproxy está funcionando, simplemente ingrese el comando service haproxy . En el caso de que este servicio funcione, quedará claro a partir de la salida del comando.

Uno de los principales inconvenientes de HAProxy es que, por defecto, no transmite la dirección IP del cliente conectado, reemplazándola por la suya. Esto puede llevar a situaciones en las que las cartas enviadas por los atacantes no pueden identificarse por la dirección IP para agregarlas a la lista negra. Sin embargo, este problema puede resolverse. Para hacer esto, edite el archivo /opt/zimbra/common/conf/master.cf.in en servidores con 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 tráfico entrante de HAProxy. Después de guardar los archivos, debe reiniciar Postfix en todos los servidores con el comando zmmtactl restart.

Después de eso, comencemos a configurar HAProxy. Para hacer esto, primero cree una copia de seguridad del archivo con la configuración cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak . Luego, abra el archivo fuente /etc/haproxy/haproxy.cfg en un editor de texto y comience a agregarle gradualmente las configuraciones necesarias. El primer bloque será agregar un servidor que elimine los registros, estableciendo el número máximo permitido de conexiones simultáneas, así como especificando 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 una razón. Dado que hay 4000 buzones en nuestra infraestructura, es necesario prever la probabilidad de que todos ellos vayan a su correo de trabajo al mismo tiempo. Además, debe dejar un pequeño margen en caso de que su número aumente.

Ahora agregue 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 de espera máximo del cliente y del servidor para desconectarse cuando caduca, y también establece el modo de operación HAProxy. En nuestro caso, el equilibrador de carga funciona en modo TCP, es decir, simplemente transmite paquetes TCP sin analizar su contenido.

A continuación, agregaremos reglas para las conexiones en diferentes puertos. Por ejemplo, si el puerto 25 se usa para conexiones SMTP y transferencia de correo, entonces tiene sentido redirigir las conexiones a los MTA disponibles en nuestra infraestructura. Si la conexión está en el puerto 80, entonces esta es una solicitud http que debe enviarse a Zimbra Proxy.

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 enviar paquetes TCP al MTA, el parámetro send-proxy se encuentra junto a sus direcciones. 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 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 service haproxy restart y comenzar a usarlo.

Para todas las preguntas relacionadas con la Suite Zextras, puede contactar al representante de la empresa "Zextras" Ekaterina Triandafilidi por correo electrónico katerina@zextras.com

Source: https://habr.com/ru/post/479536/


All Articles