Una dintre principalele sarcini în construirea infrastructurilor extinse Zimbra OSE este echilibrarea corectă a încărcăturii. Pe lângă faptul că aceasta sporește rezistența la defecțiuni a serviciului, fără echilibrarea încărcăturii nu este posibilă asigurarea unei reacții uniforme a serviciului pentru toți utilizatorii. Pentru a rezolva această problemă, se folosesc echilibratoarele de încărcătură — soluții software și hardware care redistribuie cererile între servere. Printre acestea se numără atât soluții destul de primitive, precum RoundRobin, care direcționează fiecărei cereri următoarea în lista serverului, cât și soluții mai avansate, precum HAProxy, care este utilizat pe scară largă în infrastructurile de calcul cu încărcătură mare datorită mai multor avantaje semnificative. Hai să vedem cum putem asigura colaborarea dintre echilibratorul de încărcătură HAProxy și Zimbra OSE.

Așadar, conform condițiilor problemei, ne este dată o infrastructură Zimbra OSE, în care există două Zimbra Proxy, două servere LDAP și un replica LDAP, patru depozite de e-mail cu 1000 de căsuțe poștale fiecare și trei MTA. Având în vedere că ne ocupăm de un server de e-mail, acesta va primi trei tipuri de trafic care necesită echilibrare: HTTP pentru încărcarea clientului web, precum și POP și SMTP pentru trimiterea e-mailurilor. În acest context, traficul HTTP va fi direcționat către servere Zimbra Proxy cu adrese IP 192.168.0.57 și 192.168.0.58, iar traficul SMTP va fi direcționat către serverele MTA cu adrese IP 192.168.0.77 și 192.168.0.78.
După cum s-a menționat anterior, pentru a asigura o distribuție uniformă a cererilor între servere, vom folosi echilibratorul de încărcătură HAProxy, care va funcționa pe nodul de intrare al infrastructurii Zimbra care rulează Ubuntu 18.04. Instalarea haproxy în acest sistem de operare se efectuează cu ajutorul comenzii sudo apt-get install haproxy. După aceasta, este necesar să modificați parametrul în fișierul /etc/default/haproxy pentru a schimba ENABLED=0 pe ENABLED=1. Acum, pentru a ne asigura că haproxy funcționează, este suficient să introducem comanda service haproxy. În cazul în care acest serviciu este activ, se va observa din ieșirea comenzii.
Una dintre principalele neajunsuri ale HAProxy este că, în mod implicit, nu transmite adresa IP a clientului conectat, înlocuind-o cu propria sa adresă. Aceasta poate duce la situații în care mesajele trimise de atacatori nu pot fi identificate. adresa IP, pentru a-l adăuga în lista de blocare. Totuși, această problemă poate fi rezolvată. Este necesar să editați fișierul /opt/zimbra/common/conf/master.cf.in pe serverele cu Postfix și să adăugați următoarele linii:
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_adjustAstfel, vom deschide porturile 26, 466 și 588, care vor accepta traficul de intrare din HAProxy. După ce fișierele sunt salvate, trebuie să repornim Postfix pe toate serverele folosind comanda zmmtactl restart.
După aceea, vom începe configurarea HAProxy. Pentru aceasta, mai întâi vom crea o copie de rezervă a fișierului de configurare cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak. Apoi vom deschide fișierul sursă într-un editor de text /etc/haproxy/haproxy.cfg și vom începe să adăugăm treptat setările necesare. Prima secțiune va consta în adăugarea serverului care înregistrează loguri, stabilirea numărului maxim permis de conexiuni simultane, precum și specificarea numelui și grupului utilizatorului căruia îi va aparține procesul executabil.
global
user daemon
group daemon
daemon
log 127.0.0.1 daemon
maxconn 5000
chroot /var/lib/haproxyNumărul de 5000 de conexiuni simultane a fost ales cu un motiv. Deoarece în infrastructura noastră există 4000 de căsuțe poștale, este necesar să se prevadă probabilitatea ca toate acestea să acceseze simultan corespondența lor de lucru. În plus, trebuie să lăsăm un mic rezerva în caz că numărul lor va crește.
Acum vom adăuga un bloc cu setările implicite:
defaults
timeout client 1m
log global
mode tcp
timeout server 1m
timeout connect 5sÎn acest bloc se stabilește timpul maxim de așteptare pentru client și server, pentru a întrerupe conexiunea la expirare, și se specifică modul de operare al HAProxy. În cazul nostru, echilibrorul de încărcare funcționează în modul TCP, adică pur și simplu transmite pachetele TCP fără a le analiza conținutul.
Apoi vom adăuga reguli pentru conexiuni pe porți diferite. De exemplu, dacă portul 25 este utilizat pentru conexiuni SMTP și transfer de email, atunci are sens să redirecționăm conexiunile către acesta către MTA-urile din infrastructura noastră. Dacă conexiunea se face pe portul 80, atunci acesta este un solicitare http, care trebuie redirecționată către Zimbra Proxy.
Regulă pentru portul 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-proxyRegulă pentru portul 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-proxyRegulă pentru portul 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-proxyRegulă pentru portul 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 checkRegulă pentru portul 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 checkRețineți că în regulile de redirecționare a pachetelor TCP către MTA, lângă adresele lor, se află parametrul send-proxy. Acest lucru este necesar pentru ca, conform modificărilor anterioare făcute în setările Postfix, împreună cu pachetele TCP să fie transmisă și adresa IP originală a expeditorului.
Acum, când toate modificările necesare în HAProxy au fost efectuate, putem reporni serviciul folosind comanda service haproxy restart și putem începe să-l folosim.
Pentru orice întrebări legate de Zextras Suite, puteți contacta reprezentanta companiei „Zextras” Ekaterina Triandafylidi la adresa de email katerina@zextras.com
Sursa: habr.com
