Една от основните задачи при изграждането на мащабируеми инфраструктури 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. Това е необходимо, за да може, в съответствие с направените от нас по-рано изменения в настройките на Postfix, заедно с TCP пакетите да се прехвърля и оригиналният IP адрес на изпращача.
Сега, когато всички необходими промени в HAProxy са направени, можем да рестартираме сервиза с командата service haproxy restart и да започнем да го използваме.
За всички въпроси, свързани с Zextras Suite, можете да се свържете с представителя на компанията „Zextras“ Екатерина Триандафилиди на имейл katerina@zextras.com
Източник: habr.com
