使用 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 的代表 [电子邮件保护]

来源: habr.com

添加评论