Една от основните задачи при изграждането на широкомащабни инфраструктури на Zimbra OSE е компетентното балансиране на натоварването. В допълнение към увеличаването на устойчивостта на грешки на услугата, без балансиране на натоварването е невъзможно да се осигури еднаква отзивчивост на услугата за всички потребители. За да се реши този проблем, се използват load balancers - софтуерни и хардуерни решения, които преразпределят заявките между сървърите. Сред тях има както доста примитивни, като RoundRobin, който просто изпраща всяка следваща заявка до следващия сървър в списъка, така и има по-усъвършенствани, например HAProxy, който се използва широко в силно натоварени изчислителни инфраструктури поради редица значителни предимства. Нека да разгледаме как HAProxy load balancer и Zimbra OSE могат да работят заедно.
И така, според условията на проблема ни е дадена Zimbra OSE инфраструктура, която има два Zimbra Proxies, два 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 load balancer, който ще работи на входния възел на инфраструктурата на Zimbra, работеща с Ubuntu 18.04. Инсталирането на haproxy на тази операционна система се извършва с помощта на командата sudo apt-get инсталирайте haproxy. След това е необходимо във файла /etc/default/haproxy промяна на параметъра РАЗРЕШЕН=0 на РАЗРЕШЕН=1. Сега, за да се уверите, че haproxy работи, просто въведете командата услуга 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, до техните адреси е параметърът изпрати-прокси. Това е необходимо, така че в съответствие с промените, които направихме по-рано в настройките на Postfix, оригиналният IP адрес на неговия подател също се изпраща заедно с TCP пакетите.
След като всички необходими промени са направени в HAProxy, можете да рестартирате услугата с командата услуга haproxy рестартиране и започнете да го използвате.
За всички въпроси, свързани със Zextras Suite, можете да се свържете с представителя на Zextras Екатерина Триандафилиди по имейл [имейл защитен]
Източник: www.habr.com