Проект

Общее

Профиль

Построение отказоустойчивого кластера TEGU с использование HAPROXY

Choose a language: RU | EN | ZH

Table of contents

Организация балансировки вычислительных нод 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 Маршруты приведены для примера.

На этом установка завершена!