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