====== Keepalived ====== Состоит из 2 частей: - LB, основанная на модуле ядра Linux Virtual Server (IPVS), 4 уровень OSI. Keepalived предоставляет набор проверок состояния серверов для динамического и гибкого распределения ресурсов в балансируемом пуле. - HA, основанная на Virtual Redundancy Routing Protocol (VRRP). Машина, выполняющая роль LB в терминологии Keepalived называется //Director// или //LVS router.// Вкратце, Keepalived выполняет 2 функции - проверку состояния ресурсов и их балансировку, и обеспечение отказоустойчивости самих балансировщиков ("директоров"). Работает как 3 процесса: родительский, отслеживающий состояние дочерних (watchdog), и дочерние - один отвечает за VRRP, другой - за проверку здоровья. Родительский каждые 5 сек шлёт hello-пакет дочерним процессам, и если они не отвечают, перезапускает их. Файл конфигурации по умолчанию - ''/etc/keepalived/keepalived.conf''. Варианты проверок: - TCP_CHECK - уровень 4, TCP Vanilla check. Если сервер не отвечает - долой из пула. - HTTP_GET - уровень 5, ходит на URL, проверка MD5, вычисляется утилитой genhash, идущей в составе keepalived. Можно для одного сервера указывать несколько URL. - SSL_GET - то же, что и HTTP_GET, только использует SSL_соединение. - MISC_CHECK - использование самописного скрипта, который на выходе должен давать 0 или 1. Запускается на Директоре, с указанием полного пути. Если запускается с аргументами, надо заключать в двойные кавычки. Failover (VRRP) Framework: - Failover: создание виртуальных адресов (VIPs), это основное применение протокола VRRP. - VRRP Instance synchronization: можно настроить мониторинг состояния между 2 узлами VRRP, т. е. //VRRP sync group.// Это гарантирует, что 2 экземпляра VRRP остаются в одном и том же состоянии. Узлы в группе мониторят друг друга. - Nice Fallback - Advert Packet integrity: используется IPSEC-AH ICV. - System call: при изменении состояния VRRP (VRRP state transition), можно выполнять сторонний скрипт или программу. Режимы работы LB: - Виртуальный сервер через NAT. Используется, если на Директоре 2 интерфейса - один внешний, другой внутренний. Юзеры обращаются на внешний порт, и запросы транслируются на серверы в LAN, а ответы в обратном порядке. Преимущество - сервера закрыты от внешних запросов, недостаток - LB превращается в узкое место, т. к. через него ходят и запросы, и ответы. Недостаток - узким местом может стать сервер LB, т. к. весь трафик идёт через него. - Через туннель - запросы с LB на сервера идут по IP-туннелю, а ответ идёт с серверов напрямую клиентам. Недостаток - более сложная настройка сети. - Прямая маршрутизация - клиенты обращаются на VIP, а сервера шлют им ответ напрямую. Недостаток этого метода маршрутизации заключается в ограничении ARP. Чтобы настоящие серверы могли напрямую отвечать на запросы публичных пользователей, каждый реальный сервер должен использовать виртуальный IP-адрес в качестве исходного адреса при отправке ответов. В результате комбинация VIP и MAC-адресов распределяется между самим балансировщиком нагрузки, а также каждым из реальных серверов, что может привести к ситуациям, когда реальные серверы получают запросы напрямую, минуя балансировщик нагрузки при входящих запросах. Существуют методы решения этой проблемы за счет дополнительной сложности конфигурации и управляемости. https://www.keepalived.org/doc/introduction.html\\ https://www.keepalived.org/manpage.html ===== Конфиг ===== Простейший конфиг vrrp_instance haproxy1 { interface eth0 virtual_router_id 1 # to be MASTER, make priority 50 more than on other machines. priority 100 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.40 } } https://www.redhat.com/sysadmin/advanced-keepalived\\ https://e-mc2.net/keepalived-documentation-nightmare ''/etc/keepalived/keepalived.conf'', 2 VIP с отправкой писем при изменении статуса и отслеживанием работы сервиса с изменением веса. Первичный сервер global_defs { notification_email { user@domain.ru } notification_email_from vmls-haproxy1@domain.ru smtp_server mail.domain.ru smtp_connect_timeout 60 enable_script_security } vrrp_script chk_haproxy { script "/usr/bin/killall -0 haproxy" interval 3 weight 50 user root } vrrp_instance haproxy_DMZ { interface eth2 virtual_router_id 1 priority 100 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.20.44/24 } track_script { chk_haproxy } smtp_alert } vrrp_instance haproxy_LAN { interface eth0 virtual_router_id 2 priority 100 authentication { auth_type PASS auth_pass 54321 } virtual_ipaddress { 10.1.4.55/16 } track_script { chk_haproxy } smtp_alert } Вторичный сервер global_defs { notification_email { user@domain.ru } notification_email_from vmls-haproxy2@domain.ru smtp_server mail.domain.ru smtp_connect_timeout 60 enable_script_security } vrrp_script chk_haproxy { script "/usr/bin/killall -0 haproxy" interval 3 weight 50 user root } vrrp_instance haproxy_DMZ { interface eth2 virtual_router_id 1 priority 90 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.20.44/24 } track_script { chk_haproxy } smtp_alert } vrrp_instance haproxy_LAN { interface eth0 virtual_router_id 2 priority 90 authentication { auth_type PASS auth_pass 54321 } virtual_ipaddress { 10.1.4.55/16 } track_script { chk_haproxy } amtp_alert } ===== Отправка писем ===== Силами Postfix. При настройке выбрать Satellite system, т. е. весь почтовый трафик идёт через внешний почтовый сервер. Примерный конфиг ''/etc/postfix/main.cf''. В данном случае - отправка на внутрисетевой открытый релей Exchange. Запуск мастера настройки заново - ''dpkg-reconfigure postfix''. # See /usr/share/postfix/main.cf.dist for a commented, more complete version # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h readme_directory = no # See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on # fresh installs. compatibility_level = 2 # TLS parameters smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_tls_security_level=may smtp_tls_CApath=/etc/ssl/certs smtp_tls_security_level=may smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = vmls-haproxy2.domain.ru alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = vmls-haproxy2.domain.ru, vmls-haproxy2, localhost.localdomain, localhost relayhost = mail.domain.ru mailbox_size_limit = 0 recipient_delimiter = inet_interfaces = loopback-only inet_protocols = ipv4