Одной из главных задач при построении масштабных инфраструктур Zimbra OSE является грамотная балансировка нагрузки. Помимо того, что она ��овышает отказоустойчивость сервиса, без балансировки нагрузки невозможно обеспечить одинаковую отзывчивость сервиса для всех пользователей. Для того, чтобы решить эту задачу, используются балансировщики нагрузки — программные и аппаратные решения, перераспределяющие запросы между серверами. Среди них есть как довольно примитивные, вроде RoundRobin, который просто каждый следующий запрос направляет следующему в списке серверу, а есть и более продвинутые, например HAProxy, который широко применяется в высоконагруженных вычислительных инфраструктурах из-за ряда весомых достоинств. Давайте же посмотрим на то, как можно обеспечить совместную работу балансировщика нагрузки HAProxy и Zimbra OSE.

image

Итак, по условиям задачи нам дана инфраструктура 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