Хочу отработать практические навыки настройки haproxy в паре использования с самоподписанным сертификатом. Зная все что проделано ниже уже можно применять к поставленной в продуктиве задаче. Т.к. пока нет базы и четкого понимания браться за дело – это пустая трата времени.

Цель: При обращении с рабочей станции на фронтенд, балансировщик будет перекидывать меня на доступный хост из трех бекендов. В дальнейшем задачу буду усложнять.

Что понадобится. Где взять под это ресурсы? А я буду использовать свой тестовый полигон на базе гипервизора Debian 10 + Proxmox 6

Так это три тестовых ноды.

Три ноды в роли бекэнда haproxy

VM ID Name IP
114 srv-node1 172.33.33.46
115 srv-node2 172.33.33.47
116 srv-node3 172.33.33.48

+ Еще одна VM под srv-haproxy

+ Eще одна VM (W7X64: Windows 7 Pro SP1 x64)  рабочая станция, с которой

) под рабочую станцию, с которой будут делать запрос к frontend(у) srv-haproxy посредством браузера при обращении на URL вида: https://IP&DNS (srv-haproxy).

Операционная система будет развернута на эти контейнеры через PXE загрузку с применением сервиса FOG Project (172.35.35.8), т.к. на нем уже настроена чтобы система раз и развернулась без какой-либо интерактивности со мной, т.е. применен файл ответов на вопросы установщика.

Шаг №1: На хосте (srv-haproxy) с которого взаимодействую с нодами устанавливаю утилиту sshpass дабы сделать следующее:

А) поставить на ноды пакет Web-сервиса, т.е. apache2

Б) Создать файл, свидетельствующий что это нода такая-то при заходе на Web-адрес ноды URL которой выглядит так: http://IP&DNS(srv-node[1-3]:80)

Приступаю:

ekzorchik@srv-haproxy:~$ sudo apt-get install -y sshpass

ekzorchik@srv-haproxy:~$ /usr/bin/sshpass -p 712mbddr@ ssh -o StrictHostKeyChecking=no ekzorchik@172.33.33.46 'echo 712mbddr@ | sudo -S apt-get install -y apache2'

ekzorchik@srv-haproxy:~$ /usr/bin/sshpass -p 712mbddr@ ssh -o StrictHostKeyChecking=no ekzorchik@172.33.33.46 'echo 'srv-node1 on Ubuntu 18.04 Server' > /home/ekzorchik/index.html;echo 712mbddr@ | sudo -S mv /home/ekzorchik/index.html /var/www/html/index.html;ls -l /var/www/html/ | grep index.html'

[sudo] password for ekzorchik: -rw-rw-r-- 1 ekzorchik ekzorchik 33 Oct  2 14:46 index.html

ekzorchik@srv-haproxy:~$

по аналогии проделываю для ноды srv-node2 (172.33.33.47) и srv-node3 (172.33.33.48)

Шаг №2: Произвожу первичную настройку нод посредством скрипта преднастройки системы на последующее использование. Скачиваю его из своей локальной сети где он расположен как репозитарий на связке https(Mercurial+Web):

Srv-node1: Ubuntu 18.04 Server (CPU = 1, HDD=40,RAM = 1)

IP: 172.33.33.46/24

ekzorchik@srv-node1:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject

ekzorchik@srv-node1:~$ sudo ./dproject/default

Srv-node2: Ubuntu 18.04 Server (CPU = 1, HDD=40,RAM = 1)

IP: 172.33.33.47/24

ekzorchik@srv-node2:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject

ekzorchik@srv-node2:~$ sudo ./dproject/default

Srv-node3: Ubuntu 18.04 Server (CPU = 1, HDD=40,RAM = 1)

IP: 172.33.33.48/24

ekzorchik@srv-node3:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject

ekzorchik@srv-node3:~$ sudo ./dproject/default

Для последующего удобства одну ноду забекаплю через сервис FOG, как это делается смотреть в заметке: “ Снимаем образ Lubuntu Trusty Desktop через FOG

Шаг №3: Разворачиваю на системе srv-haproxy сервис HAPROXY:

ekzorchik@srv-haproxy:~$ apt-cache search haproxy | head -n1

haproxy - fast and reliable load balancing reverse proxy

ekzorchik@srv-haproxy:~$ apt-cache show haproxy | grep Version

Version: 1.8.8-1ubuntu0.4

Version: 1.8.8-1ubuntu0.3

Version: 1.8.8-1

Подключаю PPAрепозитарий содержащий более старшую версию:

ekzorchik@srv-haproxy:~$ sudo add-apt-repository ppa:vbernat/haproxy-2.0

ekzorchik@srv-haproxy:~$ cat /etc/apt/sources.list.d/vbernat-ubuntu-haproxy-2_0-bionic.list

deb http://ppa.launchpad.net/vbernat/haproxy-2.0/ubuntu bionic main

# deb-src http://ppa.launchpad.net/vbernat/haproxy-2.0/ubuntu bionic main

ekzorchik@srv-haproxy:~$

ekzorchik@srv-haproxy:~$ apt-cache show haproxy | grep Version

Version: 2.0.7-1ppa1~bionic

Version: 1.8.8-1ubuntu0.4

Version: 1.8.8-1ubuntu0.3

Version: 1.8.8-1

ekzorchik@srv-haproxy:~$

ekzorchik@srv-haproxy:~$ sudo apt-get install -y haproxy

Шаг №4:  Сперва делаю резервную копию конфигурационного файла haproxy.cfg:

ekzorchik@srv-haproxy:~$ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup

или

ekzorchik@srv-haproxy:~$ sudo cp /etc/haproxy/haproxy.cfg{,.bak}

ekzorchik@srv-haproxy:~$ ls /etc/haproxy/ | grep bak

haproxy.cfg.bak

ekzorchik@srv-haproxy:~$

Шаг №5: Вношу собственные настройки в файл haproxy.cfg

ekzorchik@srv-haproxy:~$ sudo nano /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

# 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-RSA-AES256-GCM-SHA384

ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets

tune.ssl.debfault-dh-param 2048

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

Шаг №6: Создаю самоподписанный SSL сертификат для HAProxy:

Создаю приватный ключ:

ekzorchik@srv-haproxy:~$ sudo openssl genrsa -out /etc/ssl/private/haproxy.key 2048

Generating RSA private key, 2048 bit long modulus (2 primes)

....+++++

.............................+++++

e is 65537 (0x010001)

ekzorchik@srv-haproxy:~$

Создаю Certificate signing request (CSR):

ekzorchik@srv-haproxy:~$ sudo openssl req -new -key /etc/ssl/private/haproxy.key -out /etc/ssl/certs/haproxy.csr

Создаю Self Signed Cerfificate (CRT):

ekzorchik@srv-haproxy:~$ sudo openssl x509 -req -days 3650 -in /etc/ssl/certs/haproxy.csr -signkey /etc/ssl/private/haproxy.key -out /etc/ssl/certs/haproxy.crt

Signature ok

subject=C = AU, ST = Some-State, O = Internet Widgits Pty Ltd

Getting Private key

ekzorchik@srv-haproxy:~$

Создаю SSL pem файл:

ekzorchik@srv-haproxy:~$ sudo bash -c "cat /etc/ssl/private/haproxy.key /etc/ssl/certs/haproxy.crt >> /etc/ssl/certs/haproxy.pem"

ekzorchik@srv-haproxy:~$ sudo ls -l /etc/ssl/private/

total 4

-rw------- 1 root root 1679 Oct  2 12:17 haproxy.key

ekzorchik@srv-haproxy:~$

Шаг №7: Вношу изменения в haproxy.cfg насчет работы с сертификатом:

ekzorchik@srv-haproxy:~$ sudo nano /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

#Макс кол-во одновременных подключений

maxconn 1024

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-RSA-AES256-GCM-SHA384

ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets

#Макс размер временных DHE-ключей

tune.ssl.default-dh-param 2048

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

frontend proxy

#ssl crt instruction for work haproxy + ssl

bind 172.33.33.2:443 ssl crt /etc/ssl/certs/haproxy.pem

#forward traffic to backend (name: webapp_backends)

default_backend webapp_backends

backend webapp_backends

balance roundrobin

#проверка работоспособности сервера

#и перенаправление запросов на 80 порт

server srv-node1.polygon.local 172.33.33.46:80 check

server srv-node2.polygon.local 172.33.33.47:80 check

server srv-node3.polygon.local 172.33.33.48:80 check

#Enable HAProxy Statistics via Web

listen stats

bind 172.33.33.2:443 ssl crt /etc/ssl/certs/haproxy.pem

#Включить ведение отчетов

stats enable

#Скрыть используемую версию HAProxy

stats hide-version

#Time refresh

stats refresh 30s

#Отображать имя хоста каждой ноды

stats show-node

#Доступ к статистике защищен связкой логин и пароль

stats auth ekzorchik:712mbddr@

#URL доступа к статистике

stats uri /proxy?stats

Шаг №8: После внесения изменений в haproxy.cfg следует проверить его на корректность (-c check mode : only check config files and exit):

ekzorchik@srv-haproxy:~$ sudo haproxy -c -f /etc/haproxy/haproxy.cfg

Configuration file is valid

ekzorchik@srv-haproxy:~$

Шаг №9: Запускаю HAProxy:

ekzorchik@srv-haproxy:~$ sudo systemctl enable haproxy

Synchronizing state of haproxy.service with SysV service script with /lib/systemd/systemd-sysv-install.

Executing: /lib/systemd/systemd-sysv-install enable haproxy

ekzorchik@srv-haproxy:~$ sudo systemctl restart haproxy && sudo systemctl status haproxy | head -n5

● haproxy.service - HAProxy Load Balancer

Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled)

Active: active (running) since Wed 2019-10-02 12:45:32 MSK; 11ms ago

Docs: man:haproxy(1)

file:/usr/share/doc/haproxy/configuration.txt.gz

ekzorchik@srv-haproxy:~$

Шаг №10: Моя рекомендация на системе, которая работает, как haproxy обязательно использовать надстройку над iptables: firewalld или ufw.

Шаг №11: Проверяю, на Windows 7 Pro SP1 x64 в файле C:\Windows\System32\drivers\etc\hosts прописываю

Т.к. в сети нет DNS-сервиса то прописываю системы в файл ...\etc\hosts

Указываю в браузере обращение на Frontend: https://172.33.33.2 и меня кидает на srv-node3

Обращаюсь на Frontend через URL вида: https://srv-haproxy:443 и меня перекидывает на Backend

Нажимая клавишу F5 обновляется страница на которую haproxy меня перекидывает.

Если бы у меня был настроенный DNS сервис мне не пришлось бы прописывать в файл hosts и если бы сертификат был не самоподписанный, то строка адреса была бы с замочком.

Итого я для себя разобрал, какие настройки нужно сделать дабы установить haproxy и как он переключает на backend. На этом у меня все, с уважением автор блога Олло Александр aka ekzorchik.