Построение отказоустойчивого кластера TEGU с использование HAPROXY¶
Choose a language: RU | EN | ZH
- Содержание
- Построение отказоустойчивого кластера TEGU с использование HAPROXY
- Вариант первый:
- Одна нога балансировщика смотрит в интернет напрямую.
- Настраиваем на балансировщике сетевые интерфейсы согласно схеме.
- Устанавливаем bind9
- Прописываем настройки nftables согласно схеме.
- Разрешаем вход через SSH.
- Добавляем в SSH дополнительный порт 2223
- Устанавливаем fail2ban
- Приводим fail2ban в соответствии к следующим настройкам:
- Проверяем логи fail2ban на наличие ошибок.
- Прописываем конфиг HAProxy.
- Ноды Tegu.
- Вариант 2
- Ноды Tegu.
- На этом установка завершена!
Организация балансировки вычислительных нод Tegu потребуется вам в случае использования редакции Tegu Enterprise в мультисерверном (кластерном) исполнении. Такая балансировка не имеет прямого отношения к дистрибутиву Tegu, т.к. выполняется сетевым оборудованием пользователя.
Однако, нет ничего страшного в случае, если у пользователя нет сетевого оборудования, способного выполнять балансировку трафика, т.к. подобное решение можно реализовать стандартными средствами Linux и дополнительным ПО, отслеживающим падение нод.
Устанавливаем HAProxy
apt update
apt install haproxy
Прописываем конфиг HAProxy:
nano /etc/haproxy/haproxy.cfg
# Global settings #--------------------------------------------------------------------- global log 127.0.0.1:514 local2 maxconn 10000 #--------------------------------------------------------------------- defaults mode http log global option httplog option redispatch retries 3 timeout connect 60s #ne trogat' a to budet time-wait mnogo timeout client 60s #ne trogat' a to budet time-wait mnogo timeout server 15m timeout http-keep-alive 340s timeout check 30s option http-keep-alive maxconn 10000 #52428 #--------------------------------------------------------------------- # main frontend which proxys to the backends frontend http bind *:8888 option httplog default_backend tegu_http frontend https bind *:9999 option tcplog mode tcp default_backend tegu_https frontend smtp_25 bind *:25 option tcplog mode tcp default_backend tegu_smtp_25 frontend smtp_465 bind *:465 option tcplog mode tcp default_backend tegu_smtp_465 frontend imap_993 bind *:993 option tcplog mode tcp default_backend tegu_imap_993 frontend dav_http_8808 bind *:8808 option tcplog mode tcp default_backend tegu_dav_http_8808 frontend dav_https_8809 bind *:8809 option tcplog mode tcp default_backend tegu_dav_https_8809 backend tegu_https balance source mode tcp option ssl-hello-chk server teguA 10.33.33.31:9999 check server teguB 10.33.33.32:9999 check server teguC 10.33.33.31:9999 check backend tegu_http balance roundrobin mode http cookie SERVERID insert indirect server teguA 10.33.33.31:8888 cookie A check server teguB 10.33.33.32:8888 check server teguC 10.33.33.31:8888 check backend tegu_smtp_25 balance roundrobin mode tcp server teguA 10.33.33.31:25 check server teguB 10.33.33.32:25 check server teguC 10.33.33.31:25 check backend tegu_smtp_465 balance source mode tcp # stick match src table tegu_imap_993 server teguA 10.33.33.31:465 check server teguB 10.33.33.32:465 check server teguC 10.33.33.31:465 check backend tegu_imap_993 balance roundrobin mode tcp stick store-request src stick-table type ip size 200k expire 30m server teguA 10.33.33.31:993 check server teguB 10.33.33.32:993 check server teguC 10.33.33.31:993 check backend tegu_dav_http_8808 balance roundrobin mode tcp # stick match src table tegu_imap_993 server teguA 10.33.33.31:8808 check server teguB 10.33.33.32:8888 check server teguC 10.33.33.31:8888 check backend tegu_dav_https_8809 balance source mode tcp # stick match src table tegu_imap_993 server teguA 10.33.33.31:8809 check server teguB 10.33.33.32:8809 check server teguC 10.33.33.31:8809 check # stats frontend stats mode http bind *:8080 stats enable stats uri / stats refresh 10s stats show-node stats auth admin:Haproxy@Tegu
Если в nftables в основной цепоче forward последним правилом настроено отбрасывание всех внешних пакетов, то необходимо исключить из этого правила пакеты с меткой 333444555:
iifname "eth1" mark != 333444555 counter drop
Рассмотрим более подробно два варианта установки и настройки балансировщика на базе Debian:¶
1. Когда одна нога сетевого интерфейса балансировщика смотрит в интернет напрямую. 2. Когда одной ногой сетевого интерфейса балансировщик смотрит через VPN наружу из другой подсети.
отсюда разные настройки сетевых интерфейсов и разные настройки правил nftables.
В качестве подробного примера рассмотрим балансировщик построенный на Linux Debian 11.
При установке операционной системы в экспертном режиме создаем одну рутовую учетную запись.
Лучшим вариантом будет использованием контейнера в виртуализированной среде Proxmox.
Проверяем обновления пакетов.
apt update
Устанавливаем обновления на операционную систему.
apt-full upgrade
Удаляем iptables
apt purge iptables
Устанавливаем nftables
apt install nftables
Далее, необходимо настроить службу и автоматический старт:
systemctl enable nftables systemctl start nftables systemctl status nftables
Устанавливаем сетевые утилиты:
apt install tcpdump ethtool iftop net-tools procps
Вариант первый:¶
Одна нога балансировщика смотрит в интернет напрямую.¶
Настраиваем на балансировщике сетевые интерфейсы согласно схеме.¶
nano /etc/network/interfaces
auto lo iface lo inet loopback auto ens19 iface ens19 inet static address 75.137.210.126/24 gateway 75.137.210.1 auto ens18 iface ens18 inet static address 10.199.199.130/24
Устанавливаем bind9¶
apt install bind9
Прописываем следующие настройки.
nano /etc/default/bind9
# # run resolvconf? RESOLVCONF=no # startup options for the server OPTIONS="-4 -u bind"
Меняем DNS на 127.0.0.1
nano /etc/resolv.conf
Должно получится так:
search lan nameserver 127.0.0.1
Включаем форвардинг.
Необходимо раскоментировать строку net.ipv4.ip_forward=1
nano /etc/sysctl.d/99-sysctl.conf
Перезапускаем bind9
systemctl restart bind9
Прописываем настройки nftables согласно схеме.¶
nano /etc/nftables.conf
#!/usr/sbin/nft -f flush ruleset table ip nat { chain prerouting { type nat hook prerouting priority -150; policy accept; } chain postrouting { type nat hook postrouting priority 100; policy accept; oifname "ens19" ip saddr 10.199.199.0/24 counter masquerade } } table inet filter { chain input { type filter hook input priority 0; policy accept; ct state established,related counter accept icmp type echo-request counter accept iifname "ens19" tcp dport 2223 counter accept comment "SSH-Доступ" iifname "ens19" tcp dport http counter accept comment "Let's Encrypt auth" iifname "ens19" tcp dport 8888 counter accept comment "Tegu Web" iifname "eth19" tcp dport 9999 counter accept comment "Tegu Web" iifname "eth19" tcp dport 25 counter accept comment "Tegu SMTP" iifname "eth19" tcp dport 465 counter accept comment "Tegu SMTP" iifname "eth19" tcp dport 993 counter accept comment "Tegu IMAP" iifname "eth19" tcp dport 8808 counter accept comment "Tegu DAV" iifname "eth19" tcp dport 8809 counter accept comment "Tegu DAV" iifname "eth19" tcp dport 8080 counter accept comment "HA Proxy WEB iifname "eth0" counter drop } chain forward { type filter hook forward priority 0; policy accept; ct state established,related counter accept iifname "ens19" mark != 333444555 counter drop } chain output { type filter hook output priority 0; policy accept; } }
P. S
Если в nftables в основной цепочке forward последним правилом настроено отбрасывание всех внешних пакетов, то необходимо исключить из этого правила пакеты с меткой 333444555:
iifname "eth1" mark != 333444555 counter drop
Разрешаем вход через SSH.¶
nano /etc/ssh/sshd_config
Находим строку
#PermitRootLogin prohibit-password
меняем значение на
PermitRootLogin yes
перезапускаем сервис SSH.
systemctl restart sshd
Добавляем в SSH дополнительный порт 2223¶
nano /etc/ssh/sshd_config
Port 22 Port 2223
systemctl restart sshd service nftables restart
Рестартуем procps и nftables
service procps restart service nftables restart
Устанавливаем fail2ban¶
apt install fail2ban
Приводим fail2ban в соответствии к следующим настройкам:¶
nano /etc/fail2ban/jail.d/defaults-debian.conf
[DEFAULT] bantime = 10800 findtime = 3600 ignoreip = 127.0.0.1/8 maxretry = 3 banaction = nftables-multiport [sshd] port = 2223 enabled = true
рестартуем nftables и fail2ban
service nftables restart && service fail2ban restart
Проверяем логи fail2ban на наличие ошибок.¶
tail -F /var/log/fail2ban.log
Прописываем конфиг HAProxy.¶
nano /etc/haproxy/haproxy.cfg
# Global settings #--------------------------------------------------------------------- global log 127.0.0.1:514 local2 maxconn 10000 #--------------------------------------------------------------------- defaults mode http log global option httplog option redispatch retries 3 timeout connect 60s #ne trogat' a to budet time-wait mnogo timeout client 60s #ne trogat' a to budet time-wait mnogo timeout server 15m timeout http-keep-alive 340s timeout check 30s option http-keep-alive maxconn 10000 #52428 #--------------------------------------------------------------------- # main frontend which proxys to the backends frontend http bind *:8888 option httplog default_backend tegu_http frontend https bind *:9999 option tcplog mode tcp default_backend tegu_https frontend smtp_25 bind *:25 option tcplog mode tcp default_backend tegu_smtp_25 frontend smtp_465 bind *:465 option tcplog mode tcp default_backend tegu_smtp_465 frontend imap_993 bind *:993 option tcplog mode tcp default_backend tegu_imap_993 frontend dav_http_8808 bind *:8808 option tcplog mode tcp default_backend tegu_dav_http_8808 frontend dav_https_8809 bind *:8809 option tcplog mode tcp default_backend tegu_dav_https_8809 backend tegu_https balance source mode tcp option ssl-hello-chk server teguA 10.33.33.31:9999 check server teguB 10.33.33.32:9999 check server teguC 10.33.33.31:9999 check backend tegu_http balance roundrobin mode http cookie SERVERID insert indirect server teguA 10.33.33.31:8888 cookie A check server teguB 10.33.33.32:8888 check server teguC 10.33.33.31:8888 check backend tegu_smtp_25 balance roundrobin mode tcp server teguA 10.33.33.31:25 check server teguB 10.33.33.32:25 check server teguC 10.33.33.31:25 check backend tegu_smtp_465 balance source mode tcp # stick match src table tegu_imap_993 server teguA 10.33.33.31:465 check server teguB 10.33.33.32:465 check server teguC 10.33.33.31:465 check backend tegu_imap_993 balance roundrobin mode tcp stick store-request src stick-table type ip size 200k expire 30m server teguA 10.33.33.31:993 check server teguB 10.33.33.32:993 check server teguC 10.33.33.31:993 check backend tegu_dav_http_8808 balance roundrobin mode tcp # stick match src table tegu_imap_993 server teguA 10.33.33.31:8808 check server teguB 10.33.33.32:8888 check server teguC 10.33.33.31:8888 check backend tegu_dav_https_8809 balance source mode tcp # stick match src table tegu_imap_993 server teguA 10.33.33.31:8809 check server teguB 10.33.33.32:8809 check server teguC 10.33.33.31:8809 check # stats frontend stats mode http bind *:8080 stats enable stats uri / stats refresh 10s stats show-node stats auth admin:Haproxy@Tegu
Команды для управления сервисом HAProxy
systemctl start haproxy systemctl status haproxy systemctl stop haproxy systemctl restart haproxy
Ноды Tegu.¶
На стороне почтовых нод приводим сетевые настройки в соответствии схемы.¶
Не забываем о том, что шлюзом у нас является балансировщик.
nano /etc/network/interfaces
# The loopback network interface auto lo iface lo inet loopback # The primary network interface auto ens18 iface ens18 inet static address 10.199.199.131/24 gateway 10.199.199.130
Также не забываем про маршруты
nano /etc/network/routes
Маршруты прописываются в следующем формате:
# For example: # # 172.1.1.0 255.255.255.0 192.168.0.1 any
Вариант 2¶
Балансировщик одной ногой сетевого интерфейса смотрит через VPN наружу из другой подсети.¶
Отметим основные отличия:
На балансировщике настраиваем сеть
nano /etc/network/interfaces
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 10.44.44.14/24 gateway 10.44.44.254 auto eth1 iface eth1 inet static address 10.33.33.10/24
Настройки nftables¶
nano /etc/nftables.conf
#!/usr/sbin/nft -f flush ruleset table ip nat { chain prerouting { type nat hook prerouting priority -150; policy accept; } chain postrouting { type nat hook postrouting priority 100; policy accept; oifname eth1 ip saddr 10.44.44.0/24 ip daddr { 10.33.33.20, 10.33.33.21, 10.33.33.22 } counter masquerade oifname "eth0" ip saddr 10.33.33.0/24 counter masquerade } } table inet filter { chain input { type filter hook input priority 0; policy accept; ct state established,related counter accept iifname "eth19" tcp dport 80 counter accept comment "Let's Encrypt" iifname "eth19" tcp dport 2223 counter accept comment "SSH-Доступ" iifname "eth19" tcp dport http counter accept comment "Let's Encrypt auth" iifname "ens19" tcp dport 8888 counter accept comment "Tegu Web" iifname "eth19" tcp dport 9999 counter accept comment "Tegu Web" iifname "eth19" tcp dport 25 counter accept comment "Tegu SMTP" iifname "eth19" tcp dport 465 counter accept comment "Tegu SMTP" iifname "eth19" tcp dport 993 counter accept comment "Tegu IMAP" iifname "eth19" tcp dport 8808 counter accept comment "Tegu DAV" iifname "eth19" tcp dport 8809 counter accept comment "Tegu DAV" iifname "eth19" tcp dport 8080 counter accept comment "HA Proxy WEB iifname "eth19" counter drop } chain forward { type filter hook forward priority 0; policy accept; ct state established,related counter accept iifname "eth0" mark != 333444555 counter drop } chain output { type filter hook output priority 0; policy accept; } }
Ноды Tegu.¶
На стороне почтовых нод приводим сетевые настройки в соответствии схемы.¶
nano /etc/network/interfaces
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 10.44.44.22/24 auto eth1 iface eth1 inet static address 10.33.33.20/24 gateway 10.33.33.10
и маршруты
nano /etc/network/routes
10.199.199.0 255.255.255.0 10.44.44.254 eth0 10.252.128.0 255.255.255.0 10.44.44.254 eth0
P/S Маршруты приведены для примера.
На этом установка завершена!¶