Одной из главных задач при построении масштабных инфраструктур 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, 466 и 588, которые будут принимать входящий трафик из HAProxy. После того как файлы будут сохранены, следует перезапустить Postfix на всех серверах с помощью команды zmmtactl restart.
После этого приступим к настройке HAProxy. Для этого сперва создадим резервную копию файла с настройками cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak. Затем откроем в текстовом редакторе исходный файл /etc/haproxy/haproxy.cfg и начнем поэтапно добавлять в него необходимые настройки. Первым блоком станет добавление сервера, снимающего логи, установка максимально разрешенного числа одновременных подключений, а также указание имени и группы пользователя, к которому будет относиться исполняемый процесс.
Цифра в 5000 одновременных подключений появилась неспроста. Поскольку в нашей инфраструктуре 4000 почтовых ящиков, необходимо предусмотреть вероятность того, что все они одновременно зайдут в свою рабочую почту. Кроме того, необходимо оставить небольшой запас на тот случай, если их число увеличится.
Теперь добавим блок с настройками по умолчанию:
В этом блоке задается максимальное время ожидания клиента и сервера, чтобы разрывать соединение при его истечении, а также задается режим работы HAProxy. В нашем случае балансировщик нагрузки работает в режиме TCP, то есть просто передает пакеты TCP не анализируя их содержимое.
Далее мы добавим правила для соединений на различных портах. Например, если порт 25 используется для SMTP-подключений и передачи почты, то имеет смысл перенаправлять подключения к нему на MTA, имеющиеся в нашей инфраструктуре. Если же соединение идет на порту 80, то это http-запрос, который необходимо переправить на Zimbra Proxy.
Правило для порта 25:
Правило для порта 465:
Правило для порта 587:
Правило для порта 80:
Правило для порта 443:
Обратите внимание, что что в правилах для пересылки TCP-пакетов к MTA рядом с их адресами стоит параметр send-proxy. Это нужно для того, чтобы, в соответствии с внесенными нами ранее изменений в настройки Postfix, вместе с TCP-пакетами пересылался и оригинальный IP-адрес его отправителя.
Теперь, когда все необходимые изменения в HAProxy внесены, можно перезапустить сервис при помощи команды service haproxy restart и приступать к его использованию.
По всем вопросам, связанными c Zextras Suite вы можете обратиться к Представителю компании «Zextras» Екатерине Триандафилиди по электронной почте ekaterina.triandafilidi@zextras.com

Итак, по условиям задачи нам дана инфраструктура 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 и приступать к его использованию.
По всем вопросам, связанными c Zextras Suite вы можете обратиться к Представителю компании «Zextras» Екатерине Триандафилиди по электронной почте ekaterina.triandafilidi@zextras.com
