Хочу отработать практические навыки настройки haproxy
в паре использования с самоподписанным сертификатом. Зная все что проделано ниже уже можно применять к поставленной в продуктиве задаче. Т.к. пока нет базы и четкого понимания браться за дело – это пустая трата времени.
Цель: При обращении с рабочей станции на фронтенд, балансировщик будет перекидывать меня на доступный хост из трех бекендов. В дальнейшем задачу буду усложнять.
Что понадобится. Где взять под это ресурсы? А я буду использовать свой тестовый полигон на базе гипервизора Debian 10 + Proxmox 6
Так это три тестовых ноды.
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
прописываю
Указываю в браузере обращение на Frontend: https://172.33.33.2
и меня кидает на srv-node3
Нажимая клавишу F5
обновляется страница на которую haproxy
меня перекидывает.
Если бы у меня был настроенный DNS
сервис мне не пришлось бы прописывать в файл hosts
и если бы сертификат был не самоподписанный, то строка адреса была бы с замочком.
Итого я для себя разобрал, какие настройки нужно сделать дабы установить haproxy
и как он переключает на backend
. На этом у меня все, с уважением автор блога Олло Александр aka ekzorchik.