Една от основните задачи при изграждането на мащабни инфраструктури Zimbra OSE е правилното балансиране на натоварването. Освен че повишава устойчивостта на услугата, без балансировка на натоварването е невъзможно да се осигури еднаква реакция на услугата за всички потребители. За да се реши този проблем, се използват балансировачи на натоварването — софтуерни и хардуерни решения, които переразпределят заявките между сървърите. Сред тях има както доста примитивни, като RoundRobin, който просто насочва всяка следваща заявка към следващия в списъка сървър, така и по-напреднали, например HAProxy, който се използва широко в високо натоварени изчислителни инфраструктури поради редица значителни предимства. Нека да разгледаме как може да се осигури съвместна работа между балансировача на натоварването HAProxy и Zimbra OSE.

И така, според условията на задачата имаме инфраструктура Zimbra OSE, в която има два Zimbra Proxy, два LDAP сървъра и LDAP Replica, четири пощенски хранилища с по 1000 пощенски кутии на всяко и три MTA. Имайки предвид, че имаме работа с пощенски сървър, на него ще постъпва три вида трафик, които се нуждаят от балансировка: HTTP за зареждане на уеб клиента, както и POP и SMTP за пренос на електронна поща. В същото време HTTP трафикът ще отива на сървъри Zimbra Proxy с IP адреси 192.168.0.57 и 192.168.0.58, а SMTP трафикът ще отива на MTA сървърите с IP адреси 192.168.0.77 и 192.168.0.78.
Както вече бе споменато, за да се осигури равномерно разпределение на заявките между сървърите, ще използваме балансировача на натоварването HAProxy, който ще работи на входния възел на инфраструктурата Zimbra под управлението на Ubuntu 18.04. Инсталацията на haproxy в тази операционна система се осъществява с командата sudo apt-get install haproxy. След това е необходимо в файла /etc/default/haproxy да се промени параметърът ENABLED=0 на ENABLED=1. Сега, за да се уверим, че haproxy работи, е достатъчно да въведем командата service haproxy. В случай, че тази услуга работи, това ще бъде видно от изхода на командата.
Един от основните недостатъци на HAProxy е, че по подразбиране той не предава IP адреса на свързания клиент, заменяйки го със собствен. Това може да доведе до ситуации, в които изпратените от злонамерени лица писма не могат да бъдат идентифицирани според IP-адресу, за да го добавите в черния списък. Въпреки това, този въпрос може да бъде решен. За целта е необходимо да редактирате файла /opt/zimbra/common/conf/master.cf.in на сървърите с Postfix и да добавите следните редове:
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С това ще отворим портове 26, 466 и 588, които ще приемат входящ трафик от HAProxy. След като файловете бъдат запазени, следва да рестартирате Postfix на всички сървъри с командата zmmtactl restart.
След това ще преминем към настройката на HAProxy. Първо ще създадем резервно копие на файла с настройките cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak. След това ще отворим оригиналния файл в текстов редактор /etc/haproxy/haproxy.cfg и ще започнем стъпка по стъпка да добавяме необходимите настройки. Първият блок ще бъде добавянето на сървъра за регистриране на логовете, определянето на максимално разрешен брой едновременни свързвания, както и указването на име и група на потребителя, към когото ще принадлежи изпълняващият процес.
global
user daemon
group daemon
daemon
log 127.0.0.1 daemon
maxconn 5000
chroot /var/lib/haproxyЦифрата от 5000 едновременни свързвания не е случайна. Понеже в нашата инфраструктура има 4000 имейл кутии, е необходимо да предвидим вероятността всички те да влязат в своя работен имейл едновременно. Освен това, е нужно да оставим малък резерв в случай, че техният брой се увеличи.
Сега ще добавим блок с настройки по подразбиране:
defaults
timeout client 1m
log global
mode tcp
timeout server 1m
timeout connect 5sВ този блок се задава максималното време за изчакване на клиента и сървъра, за да се прекъсне връзката при изтичането му, а също така се задава режимът на работа на HAProxy. В нашия случай, балансировщикът на натоварването работи в режим TCP, тоест просто предава TCP пакети, без да анализира тяхното съдържание.
Следва да добавим правила за връзките на различни портове. Например, ако порт 25 се използва за SMTP връзки и предаване на поща, има смисъл да пренасочим връзки към него на MTA, налични в нашата инфраструктура. Ако връзката се осъществява на порт 80, то това е HTTP заявка, която трябва да бъде пренасочена към Zimbra Proxy.
Правило за порт 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Правило за порт 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Правило за порт 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Правило за порт 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Правило за порт 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Обърнете внимание, че в правилата за пренасочване на TCP пакети към MTA до техните адреси стои параметърът send-proxy. Това е необходимо, за да се уверим, че заедно с TCP пакетите се прехвърля и оригиналният IP адрес на тяхния изпращач, в съответствие с извършените от нас промени в настройките на Postfix.
Сега, когато всички необходими промени в HAProxy са направени, можем да рестартираме услугата с помощта на командата service haproxy restart и да започнем да я използваме.
При всякакви въпроси, свързани с Zextras Suite, можете да се свържете с представителя на компанията "Zextras" Екатерина Триандафилиди на електронната поща katerina@zextras.com
Източник: habr.com
