使用 HAProxy 在 Zimbra 開源版中進行負載平衡

構建大規模 Zimbra OSE 基礎設施的主要任務之一是有效的負載平衡。 除了提高服務的容錯能力之外,如果沒有負載平衡,就不可能確保所有用戶的服務具有相同的響應能力。 為了解決這個問題,使用了負載均衡器——在服務器之間重新分配請求的軟件和硬件解決方案。 其中,既有相當原始的,例如 RoundRobin,它只是將每個下一個請求發送到列表中的下一個服務器,也有更高級的,例如 HAProxy,它廣泛用於高負載的計算基礎設施,因為一些顯著的優勢。 讓我們看看 HAProxy 負載均衡器和 Zimbra OSE 如何協同工作。

使用 HAProxy 在 Zimbra 開源版中進行負載平衡

因此,根據問題的條款,我們得到了 Zimbra OSE 基礎設施,其中有兩個 Zimbra 代理、兩個 LDAP 和 LDAP 副本服務器、四個郵件存儲(每個存儲有 1000 個郵箱)以及三個 MTA。 鑑於我們正在處理郵件服務器,它將收到需要平衡的三種類型的流量:用於下載 Web 客戶端的 HTTP,以及用於發送電子郵件的 POP 和 SMTP。 在這種情況下,HTTP 流量將流向 IP 地址為 192.168.0.57 和 192.168.0.58 的 Zimbra 代理服務器,SMTP 流量將流向 IP 地址為 192.168.0.77 和 192.168.0.78 的 MTA 服務器。

如前所述,為了確保服務器之間的請求均勻分佈,我們將使用 HAProxy 負載均衡器,它將在運行 Ubuntu 18.04 的 Zimbra 基礎設施的輸入節點上運行。 使用以下命令在此操作系統上安裝 haproxy sudo apt-get 安裝 haproxy。 之後,需要在文件中 /etc/默認/haproxy 改變參數 啟用=0啟用=1。 現在,為了確保 haproxy 正常工作,只需輸入命令 服務 haproxy。 如果該服務正在運行,從命令的輸出中可以清楚地看出。

HAProxy 的主要缺點之一是默認情況下它不傳輸所連接客戶端的 IP 地址,而是用自己的 IP 地址替換。 這可能會導致攻擊者發送的信件無法通過 IP 地址識別,從而將其添加到黑名單中。 不過,這個問題是可以解決的。 為此,您需要編輯該文件 /opt/zimbra/common/conf/master.cf.in 在 Postfix 服務器上並向其中添加以下行:

26      inet  n       -       n       -       1       postscreen
        -o postscreen_upstream_proxy_protocol=haproxy
 
466    inet  n       -       n       -       -       smtpd
%%uncomment SERVICE:opendkim%%  -o content_filter=scan:[%%zimbraLocalBindAddress%%]:10030
        -o smtpd_tls_wrappermode=yes
        -o smtpd_sasl_auth_enable=yes
        -o smtpd_client_restrictions=
        -o smtpd_data_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_recipient_restrictions=
        -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
        -o syslog_name=postfix/smtps
        -o milter_macro_daemon_name=ORIGINATING
        -o smtpd_upstream_proxy_protocol=haproxy
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_filter=[%%zimbraLocalBindAddress%%]:10027
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_options=speed_adjust
 
588 inet n      -       n       -       -       smtpd
%%uncomment SERVICE:opendkim%%  -o content_filter=scan:[%%zimbraLocalBindAddress%%]:10030
        -o smtpd_etrn_restrictions=reject
        -o smtpd_sasl_auth_enable=%%zimbraMtaSaslAuthEnable%%
        -o smtpd_tls_security_level=%%zimbraMtaTlsSecurityLevel%%
        -o smtpd_client_restrictions=permit_sasl_authenticated,reject
        -o smtpd_data_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_recipient_restrictions=
        -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
        -o syslog_name=postfix/submission
        -o milter_macro_daemon_name=ORIGINATING
        -o smtpd_upstream_proxy_protocol=haproxy
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_filter=[%%zimbraLocalBindAddress%%]:10027
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_options=speed_adjust

因此,我們將打開端口 26、466 和 588,這些端口將接收來自 HAProxy 的傳入流量。 保存文件後,使用 zmmtactl restart 命令重新啟動所有服務器上的 Postfix。

之後,我們開始配置HAProxy。 為此,首先創建設置文件的備份副本 cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak。 然後在文本編輯器中打開源文件 /etc/haproxy/haproxy.cfg 並開始逐步向其添加必要的設置。 第一個塊將添加一個獲取日誌的服務器,設置允許的最大同時連接數,以及指定可執行進程所屬的用戶名和組。

global
    user daemon
    group daemon
    daemon
    log 127.0.0.1 daemon
    maxconn 5000
    chroot /var/lib/haproxy

5000 個同時連接的數字出現是有原因的。 由於我們的基礎設施中有 4000 個郵箱,因此有必要提供所有這些郵箱同時轉到其工作郵件的可能性。 此外,還需要留出少量餘量,以防數量增加。

現在讓我們添加一個具有默認設置的塊:

defaults
        timeout client 1m
        log global
        mode tcp
        timeout server 1m
        timeout connect 5s

該塊設置客戶端和服務器在連接過期時關閉連接的最大等待時間,並設置 HAProxy 操作模式。 在我們的例子中,負載均衡器工作在 TCP 模式下,也就是說,它只是傳輸 TCP 數據包而不分析其內容。

接下來,我們將為各個端口上的連接添加規則。 例如,如果端口 25 用於 SMTP 連接和郵件傳輸,則將其連接轉發到我們基礎設施中的 MTA 是有意義的。 如果連接位於端口 80 上,則這是一個需要轉發到 Zimbra 代理的 http 請求。

端口 25 的規則:

frontend smtp-25
bind *:27
default_backend backend-smtp-25
 
backend backend-smtp-25
server mta1 192.168.0.77:26 send-proxy
server mta2 192.168.0.78:26 send-proxy

端口 465 的規則:

frontend smtp-465
bind *:467
default_backend backend-smtp-465

backend backend-smtp-465
server mta1 192.168.0.77:466 send-proxy
server mta2 192.168.0.78:466 send-proxy

端口 587 的規則:

frontend smtp-587
bind *:589
default_backend backend-smtp-587
 
backend backend-smtp-587
server mail1 192.168.0.77:588 send-proxy
server mail2 192.168.0.78:588 send-proxy

端口 80 的規則:

frontend http-80
bind    *:80
default_backend http-80
 
backend http-80
mode tcp
server zproxy1 192.168.0.57:80 check
server zproxy2 192.168.0.58:80 check

端口 443 的規則:

frontend https
bind  *:443
default_backend https-443
 
backend https-443
mode tcp
server zproxy1 192.168.0.57:80 check
server zproxy2 192.168.0.58:80 check

請注意,在將 TCP 數據包轉發到 MTA 的規則中,其地址旁邊是參數 發送代理。 這是必要的,以便根據我們之前對 Postfix 設置所做的更改,其發送者的原始 IP 地址也與 TCP 數據包一起發送。

現在已經對 HAProxy 進行了所有必要的更改,您可以使用以下命令重新啟動服務 重啟haproxy服務 並開始使用它。

對於與 Zextras Suite 相關的所有問題,您可以通過電子郵件聯繫 Zextras 代表 Ekaterina Triandafilidi [電子郵件保護]

來源: www.habr.com

添加評論