Построение отказоустойчивого кластера 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 вы не увидите в логах Tegu реальных IP адресов т почтовых клиентов, а только адрес балансировщика если это так необходимо то лучше воспользоваться для тестирования нашим балансировщиком Tiar где нет этой проблемы.

Устанавливаем 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 Маршруты приведены для примера.
На этом установка завершена!¶