
✨ HAProxy и Keepalived рассматривает тему load balancer и cluster, а также безопасность(слабое использование SSL/Криптографии (LOGJAM) (CVE-2015-4000) мера предотвращения уязвимости) и защиту от высоких нагрузок.

HAProxy — это программное обеспечение с открытым исходным кодом, которое предоставляет услуги прокси-сервера для TCP и HTTP приложений с высокой доступностью и балансировкой нагрузки.
Keepalived — это программное обеспечение с открытым исходным кодом, способное обеспечить возможность IP failover (отказоустойчивость) для более чем двух серверов. Keepalived использует между собой технику связи Multicast.
В нашей архитектуре мы будем использовать HAProxy для балансировки нагрузки, а Keepalived — для переключения IP, то есть для превращения нашей HAProxy архитектуры в Cluster.
В нашем сценарии имеется 3 сервера. На эти 3 сервера мы установим HAProxy, чтобы сделать их балансировщиками нагрузки. Затем, установив службу Keepalived, при отключении одного из серверов мы будем выполнять IP failover, переключаясь на другой сервер без прерывания работы, тем самым обеспечивая работу нашего сервиса балансировки нагрузки.
Для этого мы будем использовать 4 IP-адреса (адреса полностью вымышленные)
Теперь установим службы HAProxy и Keepalived на всех 3 серверах, как показано ниже.
sudo add-apt-repository ppa:vbernat/haproxy-2.7 -y
sudo apt update
sudo apt install haproxy keepalived -y
sudo openssl dhparam -out /etc/haproxy/dhparams.pem 2048
Прим1: На серверах должно быть установлено "net.ipv4.ip_nonlocal_bind=1". В противном случае конфигурация для HAProxy не сможет одновременно содержать один и тот же IP-адрес, что вызовет ошибку привязки, и служба не будет работать. Для этого необходимо выполнить следующие действия.
Сначала отредактируйте файл "vi /etc/sysctl.conf", вставьте приведенный ниже параметр, сохраните и выйдите.
net.ipv4.ip_nonlocal_bind=1
Затем выполните следующую команду.
sysctl -p
Прим2: Если вы будете использовать SSL на 443 порту, в каталоге "/etc/ssl/private/" должен находиться файл "haproxy.pem" с объединёнными SSL-сертификатами (***.crt, .ca, .key).
Теперь давайте рассмотрим пример конфигурации HAProxy ниже. В вашей инфраструктуре вы будете использовать одинаковую конфигурацию для всех экземпляров HAProxy.
Для этого вам нужно отредактировать файл "/etc/haproxy/haproxy.cfg". Приведенная ниже конфигурация поддерживает минимум HAv2.
vi /etc/haproxy/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
# maxconn 100000 #replaceable
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# An alternative list with additional directives can be obtained from
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
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
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
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
ssl-dh-param-file /etc/haproxy/dhparams.pem
#tune.ssl.default-dh-param 2048
# nbproc 1
# nbthread 8
tune.maxrewrite 16384
tune.bufsize 32768
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
# maxconn 1000000 #replaceable
timeout connect 3000000
timeout client 6000000
timeout server 6000000
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
Раздел конфигурации Dashboard для HAProxy (добавлена интеграция с prometheus для мониторинга).
listen stats
bind fatlan.com:8989
mode http
stats enable
stats uri /stats
option http-use-htx
http-request use-service prometheus-exporter if { path /metrics }
#stats hide-version
stats realm HAProxy\ Statistics
stats auth admin:admin
В приведенной ниже конфигурации в двух блоках используется ACL. В первом блоке, если в ссылке где-либо встречается слово "rest", будет выполняться блок middleware-fatlan-backend; во втором блоке при запросе другого домена (forum.fatlan.com) будет выполняться backend fatlan-forum-backend; все остальные запросы, кроме перенаправления на другие порты, будут выполняться в блоке fatlan-backend443.
Раздел перенаправления 80 порта на 443 порт.
frontend fatlan80
bind fatlan.com:80
mode http
redirect scheme https if !{ ssl_fc }
frontend fatlan443
bind fatlan.com:443 ssl crt /etc/ssl/private/haproxy.pem ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
option httplog
option forwardfor
#http-request set-header X-Client-IP req.hdr_ip([X-Forwarded-For])
#option forwardfor except 127.0.0.0/8
option http-server-close
http-request set-header X-Forwarded-Proto https
# reqadd X-Forwarded-Proto:\ https #old config
mode http
default_backend fatlan-backend443
Пример конфигурации ACL (proxypass): если в ссылке где-либо встречается слово rest, то перенаправлять.
acl middleware-fatlan path_beg /rest
use_backend middleware-fatlan-backend if middleware-fatlan
ACL для перенаправления на другой хост forum.
acl host_fatlanforum hdr(host) -i forum.fatlan.com
use_backend fatlan-forum-backend if host_fatlanforum
Раздел перенаправления по умолчанию, для 443.
backend fatlan-backend443
mode http
balance roundrobin
stick store-request src
stick-table type ip size 256k expire 30m
option forwardfor
# option httplog
option httpchk HEAD /
server frontend_01 10.10.37.12:8001 check port 8001 inter 3000 rise 2 fall 3
server frontend_02 10.10.37.13:8001 check port 8001 inter 3000 rise 2 fall 3
Раздел, куда перенаправляется запрос по ACL с rest.
backend middleware-fatlan-backend
mode http
balance roundrobin
stick store-request src
stick-table type ip size 256k expire 30m
option forwardfor
# option httplog
option httpchk OPTIONS /login HTTP/1.0
http-check expect status 200
http-request replace-path (.*)(?:rest\/)(.*) \1\2
# reqrep ^([^\ :]*)\ /rest[/]?(.*) \1\ //\2 #old config
server middleware_01 10.10.37.34:3000 check port 4000 inter 12000 rise 3 fall 3
server middleware_02 10.10.37.35:3000 check port 4000 inter 12000 rise 3 fall 3