使用 HAProxy 在 Zimbra 開源版本中實現負載平衡

建造大規模 Zimbra OSE 基礎設施時的主要挑戰之一是適當的負載平衡。除了增加服務的容錯能力之外,如果沒有負載平衡,就不可能確保服務對所有使用者有相同的回應能力。為了解決這個問題,使用了負載平衡器——在伺服器之間重新分配請求的軟體和硬體解決方案。其中,有一些比較原始的,例如RoundRobin,它只是將每個後續請求發送到清單中的下一個伺服器,也有一些更先進的,例如HAProxy,由於許多顯著的優勢,它被廣泛應用於高負載運算基礎設施。讓我們看看如何讓 HAProxy 負載平衡器和 Zimbra OSE 協同工作。

使用 HAProxy 在 Zimbra 開源版本中實現負載平衡

根據問題描述,我們有一個 Zimbra OSE 基礎架構,其中包括兩個 Zimbra 代理程式、兩個 LDAP 伺服器、一個 LDAP 副本、四個郵箱儲存(每個儲存包含 1000 個郵箱)和三個郵件傳輸代理程式 (MTA)。考慮到我們處理的是郵件伺服器,它將接收三種需要負載平衡的流量:用於載入 Web 用戶端的 HTTP 流量,以及用於郵件轉送的 POP 和 SMTP 流量。 HTTP 流量將被傳送到 服務 Zimbra Proxy 的 IP 位址為 192.168.0.57 和 192.168.0.58,SMTP 流量將傳送至 IP 位址為 192.168.0.77 和 192.168.0.78 的 MTA 伺服器。

如前所述,為了確保請求在伺服器之間均勻分配,我們將使用 HAProxy 負載平衡器,它將在 Zimbra 基礎架構的入口節點上執行。 Ubuntu 18.04. 在此作業系統中安裝 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 Proxy 的 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 相關的所有問題,您可以透過電子郵件 katerina@zextras.com 聯繫 Zextras 代表 Ekaterina Triandafilidi

來源: www.habr.com

為具有 DDoS 保護、VPS VDS 服務器的站點購買可靠的主機 🔥 購買具備 DDoS 防護的可靠網站寄存服務,包括 VPS 和 VDS 伺服器 | ProHoster