Home WindowsExchange Server Настройка балансировщика HaProxy для Exchange на Ubuntu

Настройка балансировщика HaProxy для Exchange на Ubuntu

by admin
737 views
HAProxy Logo 2 1

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

Логика работы описана на картинке

Версия Ubuntu которая была выбрана для установки

root@haproxy:/home/administrator#  lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
Codename:       jammy
root@haproxy:/home/administrator#

Установка пакета Haproxy

 $ sudo apt install haproxy

Проверим версию пакета

root@haproxy:/home/administrator# haproxy -v
HAProxy version 2.4.14-1ubuntu1 2022/02/28 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2026.
Known bugs: http://www.haproxy.org/bugs/bugs-2.4.14.html
Running on: Linux 5.15.0-43-generic #46-Ubuntu SMP Tue Jul 12 10:30:17 UTC 2022 x86_64
root@haproxy:/home/administrator#

Теперь, когда у вас установлен HAProxy, давайте посмотрим, как его настроить. Все настройки определены в файле /etc/haproxy/haproxy.cfg (или /etc/hapee-{version}/hapee-lb.cfg для HAProxy Enterprise). Если вы используете Docker, то этот файл монтируется как том в контейнер по пути /usr/local/etc/haproxy/haproxy.cfg.

Начнем редактировать его

Nano /etc/haproxy/haproxy.cfg

Дефолтный конфиг от Haproxy

root@haproxy:/etc/haproxy# nano haproxy.cfg
  GNU nano 6.2                                                                                                     haproxy.cfg
global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE>
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

Конфиг для Exchange для балансировки 443 порта

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
        ssl-default-bind-options no-sslv3

defaults
        balance roundrobin
        log     global
        mode    tcp
        option  dontlognull

frontend fe_exch_443
        bind 10.0.0.50:443
        default_backend be_exch_443

backend be_exch_443
        server exch2 10.0.0.20:443 check
        server exch1 10.0.0.30:443 check

После редактирования конфига перезагружаем службу

sudo systemctl restart haproxy

Конфиг для Exchange для балансировки 443 порта и smtp 25

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
        ssl-default-bind-options no-sslv3

defaults
        balance roundrobin
        log     global
        mode    tcp
        option  dontlognull

frontend fe_exch_443
        bind 10.0.0.50:443
        default_backend be_exch_443

frontend ft_smtp
      bind 10.0.0.50:25
      mode tcp
 #     timeout client 1m
 #     log global
      option tcplog
      default_backend bk_smtp

backend be_exch_443
        server exch2 10.0.0.20:443 check
        server exch1 10.0.0.30:443 check

backend bk_smtp
      mode tcp
      log global
#      option tcplog
#      timeout server 1m
#      timeout connect 7s
      server mail1 10.0.0.20:25 weight 10 check
      server mail2 10.0.0.30:25 weight 20 check

После редактирования конфига также перезагружаем службу

sudo systemctl restart haproxy

Отдельная статья

Также есть замечательная статья в которой описывают настройку с использованием  HealthCheck.htm

В Exchange 2016 и Exchange 2019 службы клиентского доступа не имеют состояния . Другими словами, поскольку вся обработка почтового ящика происходит во внутренних службах на сервере почтовых ящиков, не имеет значения, какой экземпляр службы клиентского доступа в массиве служб клиентского доступа получает каждый отдельный клиентский запрос. Это означает, что привязка сеансов больше не требуется на уровне балансировщика нагрузки. Это позволяет сбалансировать входящие подключения к службам клиентского доступа с помощью простых методов балансировки нагрузки, таких как циклический перебор DNS. Это также позволяет устройствам аппаратной балансировки нагрузки поддерживать значительно больше одновременных подключений.

У каждой веб-службы есть виртуальный файл HealthCheck.htm , сообщающий о ее состоянии . Разрешите HAProxy использовать содержимое этого файла для проверки работоспособности сервера. Таким образом, он будет знать, что нужно перенаправлять клиентов, если одна из служб не работает, даже если рассматриваемый сервер Exchange может по-прежнему прослушивать порт 443.

Я использую haproxy версии 2.0.13 на Ubuntu 20.04.1 LTS . Мы также усиливаем безопасность TLS, разрешая только TLS 1.2 и 1.3 . По умолчанию клиенты Outlook 2010/2013 в Windows 7 будут пытаться подключиться к почтовому серверу Exchange через TLS 1.0 и TLS 1.1, поэтому для этого вам необходимо внести некоторые изменения в часть TLS на вашем компьютере с Windows 7. Windows 7 поддерживает TLS 1.1 и TLS 1.2. Но эти версии протокола не включены на нем по умолчанию. В Windows 8 и более поздних версиях эти протоколы включены по умолчанию. Ранее я написал статью, объясняющую включение TLS 1.1 и TLS 1.2 на ПК с Windows 7. Вы можете проверить эту ссылку, если вы заинтересованы. https://bidhankhatri.com.np/windows/windows7-enable-tls12/

Детали конфигурации:

  • Разрешено, только если заголовок хоста HTTP содержит mail.bidhankhatri.com.np www.mail.bidhankhatri.com.np autodiscover.bidhankhatri.com.np www.autodiscover.bidhankhatri.com.np
  • Центр администрирования Exchange разрешен только из определенных сетей.
  • Разрешены только TLS 1.2 и выше.
  • Метрики HAProxy отслеживаются через Prometheus.

Макет файла PEM для HAProxy

cat certificate.crt intermediates.pem private.key > /etc/haproxy/proxy.pem

Инструмент генератора конфигурации Mozilla SSL. Цель этого инструмента — помочь операционным группам с настройкой TLS. Если вам интересно, то можете посмотреть. https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.13&config=intermediate

Конфигурационный файл HAProxy

vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0

maxconn 8000
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon

# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

#If you want to enable TLS 1.0 & TLS 1.1 also then use below line.
#ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:@SECLEVEL=1


# This ciphers should be on production: This should be used if u want to disable TLS1.0 & TLS1.1
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

tune.ssl.default-dh-param 2048

defaults
log global
mode http
option httplog
option dontlognull

retries 3 # Try to connect up to 3 times in case of failure
timeout connect 5s # 5 seconds max to connect or to stay in queue
timeout http-keep-alive 1s # 1 second max for the client to post next request
timeout http-request 15s # 15 seconds max for the client to send a request
timeout queue 30s # 30 seconds max queued on load balancer
timeout client 300s
timeout server 300s



errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
no option http-use-htx

#---------------------------------------------------------------------
#HAProxy Monitoring Config
#---------------------------------------------------------------------
listen stats
bind :1111
mode http
option forwardfor
option httpclose
stats enable
stats uri /
stats refresh 5s
stats show-legends
stats realm Haproxy\ Statistics
stats auth admin:1password2$


frontend fe_prom_exporter
bind :8004
option http-use-htx
http-request use-service prometheus-exporter if { path /metrics }
stats enable
stats uri /stats
stats refresh 10s

#-----------------------
# FrontEnd Begins
# -------------------
#
#
frontend fe_mail
# receives traffic from clients
bind :80
http-response set-header X-Frame-Options SAMEORIGIN
http-response set-header X-Content-Type-Options nosniff
http-response set-header Strict-Transport-Security max-age=63072000


mode http
maxconn 10000

# Allow Exchange Admin Center to certain private network only
acl private_network src XXX.XXX.XXX.XXX/24 XXX.XXX.XXX.XXX/24
acl ecp_req url_beg /ecp
http-request deny if ecp_req !private_network


redirect scheme https code 301 if !{ ssl_fc } # redirect 80 -> 443 (for owa)
bind *:443 ssl crt /etc/haproxy/proxy.pem alpn h2,http/1.1

acl xmail hdr(host) -i mail.bidhankhatri.com.np www.mail.bidhankhatri.com.np autodiscover.bidhankhatri.com.np www.autodiscover.bidhankhatri.com.np

acl autodiscover url_beg /Autodiscover
acl autodiscover url_beg /autodiscover
acl mapi url_beg /mapi
acl rpc url_beg /rpc
acl owa url_beg /owa
acl owa url_beg /OWA
acl eas url_beg /Microsoft-Server-ActiveSync
acl eas url_beg /Microsoft-Server-activeSync
acl ecp url_beg /ecp
acl ews url_beg /EWS
acl ews url_beg /ews
acl oab url_beg /OAB
acl default_for_mail url_beg /

use_backend be_ex2019_owa if xmail owa
use_backend be_ex2019_autodiscover if xmail autodiscover
use_backend be_ex2019_mapi if xmail mapi
use_backend be_ex2019_activesync if xmail eas
use_backend be_ex2019_ews if xmail ews
use_backend be_ex2019_rpc if xmail rpc
use_backend be_ex2019_default if xmail default_for_mail


frontend fe_exchange_imaps
mode tcp
option tcplog
bind :993 name imaps # ssl crt /etc/ssl/certs/exchange_certificate_and_key_nopassword.pem <-- No need, certificate is read straight from the Exchange servers.
default_backend be_exchange_imaps

frontend fe_exchange_smtp
mode tcp
option tcplog
bind :25 name smtp 
default_backend be_exchange_smtp

#------------------------------
# Back-end section
#------------------------------

backend be_ex2019_autodiscover
mode http
# balance source
option httpchk GET /autodiscover/healthcheck.htm
option log-health-checks
http-check expect status 200
server mail1 mail1.bidhankhatri.com.np:443 check maxconn 1000 ssl ca-file /etc/ssl/certs/ca-certificates.crt
server mail2 mail2.bidhankhatri.com.np:443 check maxconn 1000 ssl ca-file /etc/ssl/certs/ca-certificates.crt

backend be_ex2019_mapi
mode http
balance source
option httpchk GET /mapi/healthcheck.htm
option log-health-checks
http-check expect status 200
server mail3 mail3.bidhankhatri.com.np:443 check maxconn 1000 ssl ca-file /etc/ssl/certs/ca-certificates.crt
server mail4 mail4.bidhankhatri.com.np:443 check maxconn 1000 ssl ca-file /etc/ssl/certs/ca-certificates.crt

backend be_ex2019_rpc
mode http
balance source
option httpchk GET /rpc/healthcheck.htm
option log-health-checks
http-check expect status 200
server mail3 mail3.bidhankhatri.com.np:443 check maxconn 1000 ssl ca-file /etc/ssl/certs/ca-certificates.crt

backend be_ex2019_owa
mode http
# balance source
option httpchk GET /owa/healthcheck.htm
option log-health-checks
http-check expect status 200
server mail1 mail1.bidhankhatri.com.np:443 check maxconn 1000 ssl ca-file /etc/ssl/certs/ca-certificates.crt
server mail2 mail2.bidhankhatri.com.np:443 check maxconn 1000 ssl ca-file /etc/ssl/certs/ca-certificates.crt
server mail3 mail3.bidhankhatri.com.np:443 check maxconn 1000 ssl ca-file /etc/ssl/certs/ca-certificates.crt



backend be_ex2019_activesync
mode http
#balance source
option httpchk GET /microsoft-server-activesync/healthcheck.htm
option log-health-checks
http-check expect status 200
server mail2 mail2.bidhankhatri.com.np:443 check ssl verify none
server mail1 mail1.bidhankhatri.com.np:443 check ssl verify none

backend be_exchange_imaps
mode tcp
#option tcplog
balance source
option log-health-checks
server mail1 mail1.bidhankhatri.com.np:993 weight 10 check
server mail2 mail2.bidhankhatri.com.np:993 weight 20 check
server mail3 mail3.bidhankhatri.com.np:993 weight 30 check

backend be_ex2019_ews
mode http
balance source
option httpchk GET /ews/healthcheck.htm
option log-health-checks
http-check expect status 200
server mail2 mail2.bidhankhatri.com.np:443 check ssl verify none
server mail1 mail1.bidhankhatri.com.np:443 check ssl verify none


backend be_ex2019_default
mode http
balance source
server mail2 mail2.bidhankhatri.com.np:443 check ssl verify none
server mail1 mail1.bidhankhatri.com.np:443 check ssl verify none


backend be_exchange_smtp
mode tcp
#balance source
balance source
option log-health-checks
server mail2 mail2.bidhankhatri.com.np:25 weight 20 check
server mail1 mail1.bidhankhatri.com.np:25 weight 10 check
haproxy -c -f /etc/haproxy/haproxy.cfg
    Configuration file is valid
systemctl start haproxy
systemctl enable haproxy

Мониторинг

В конце сервера prometheus.

vim /etc/prometheus/prometheus.yml
  - job_name: 'haproxy'
    static_configs:
    - targets: ['xxx.xxx.xxx.xxx:8004']
systemctl restart prometheus

Статьи из этой категории

Leave a Comment