我正在尝试弄清楚如何根据条件电子邮件服务器进行反向代理,或者如何处理仅在 1 个公共 IP 地址上从不同服务器发送/接收电子邮件?
我当前的配置如下:
我已经成功地根据条件管理了代理网络服务器(OpenLiteSpeed)OPNSense 简介+HA代理例如domain1.com -> Web 服务器 1;domain2.com -> Web 服务器 2; ETC。
A 记录每个域名都指向我的公共 IP 地址,并且网络流量由 OPNsense 和 HAproxy 根据条件处理到特定的本地服务器。
问题是我无法用Postfix/Dovecot. 因此每个邮件服务器例如 mail.domain1.com、mail.domain2.com 等等。一个记录和MX 记录也指向我的公共IP地址,但由独立的服务器内部处理。
我知道我可以将 25,465,993 等从我的专用服务器转发到特定的邮件服务器,但这只在特定的服务器上有效,其他服务器将无法处理邮件。
知道如何解决这个问题吗?
我刚刚读到过这个但不确定它是否能正常工作 ->
global
# ... (unchanged)
defaults
# ... (unchanged)
frontend email_frontend
bind *:993 ssl crt /path/to/ssl_certificate.pem # IMAPS
bind *:995 ssl crt /path/to/ssl_certificate.pem # POP3S
bind *:25 ssl crt /path/to/ssl_certificate.pem # SMTP
mode tcp
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
acl is_domain1 req_ssl_sni -i domain1.com
acl is_domain2 req_ssl_sni -i domain2.com
use_backend backend_domain1 if is_domain1
use_backend backend_domain2 if is_domain2
backend backend_domain1
mode tcp
server mail_server_domain1 172.16.0.2:993 check # IMAPS
server mail_server_domain1 172.16.0.2:995 check # POP3S
server mail_server_domain1 172.16.0.2:25 check # SMTP
backend backend_domain2
mode tcp
server mail_server_domain2 172.16.0.3:993 check # IMAPS
server mail_server_domain2 172.16.0.3:995 check # POP3S
server mail_server_domain2 172.16.0.3:25 check # SMTP
答案1
总结:您可以在作为 MX 主机的 SMTP 服务器前面使用 HAproxy仅进行负载平衡。您不能使用它根据某个域名选择将请求路由到哪个服务器。所有后端都应该相似,特别是,它们都必须在初始问候中使用相同的服务器名称进行自我介绍。这都是由于 SMTP 协议的性质以及世界对 SMTP 服务器行为的各种期望所致。
警告:在单个公共 IP 后面有多个不同的邮件服务器(它们以不同的方式自我介绍)是一种非常糟糕的想法。例如会发生什么:你会将该 IP 列入黑名单。
总的来说,如果我正确理解了你的意图,那么你想要的是不可能的。
您可以通过三种方式为各种电子邮件相关服务设置负载平衡:
- 对于 RAW TLS 端口(465、993、995):在 HAproxy 上剥离 TLS/SSL,但随后您需要使用其未加密后端对应:SMTP 提交后端将转到 587(而不是 465,HAproxy 前端应该监听该端口),IMAP 转到 143(而不是 993),POP3 转到 110(而不是 995)。然后您需要 HAproxy 机器上的证书和密钥。
- 对于 RAW TLS 端口:不要剥离 TLS,但解析未加密的 TLS 标头并采取相应措施(就像您对 所做的那样
acl ... req_ssl_sni ...
)。在这种情况下,您的后端将需要配置证书,而 HAproxy 不需要它。 - 对于任何端口:不要剥离和解析 TLS,让 HAproxy 仅处理 TCP 流;所有 TLS/SSL 处理都将在后端服务器上完成。在这种情况下,您不应在 HAproxy 上设置任何证书,而应在真正的后端服务器上设置它们。
端口 25 不是 RAW TLS 端口;无法使用上述选项 1 或 2 中的设置(至少,不是那么简单)。此处的 SSL/TLS 仅在所谓的 STARTTLS 模式下受支持。对话不是以 ClientHello 开始,而是以通常的 SMTP 开始,例如首先服务器发送问候语,然后客户端发送EHLO
,如果服务器指示支持 STARTTLS,则客户端可能会(也可能不会)发出命令STARTTLS
,然后才出现 ClientHello。完全相同的工作原理 587。端口 110 和 143 的工作方式非常相似:客户端等待服务器指示 STARTTLS,然后发出 STARTTLS 命令,唯一的区别是对话分别像往常一样开始 POP3 和 IMAP。
不幸的是,这不是 HAproxy 所期望的方案。您不能指望它跟踪 SMTP 对话,在其中找到 TLS,并在端口 25 上提取 SNI,因为您在配置中已经拥有它。您根本无法使用它们的原始 TLS 对应项(选项 1 或 2 可用)来公开其他三个与客户端相关的端口;但是,对于端口 25,这是不可能的,您必须在真实邮件服务器上使用 STARTTLS 在带内处理它的 SSL。出于兼容性原因,该服务没有 RAW 对应项。唯一可用的选项是上面的选项 3:根本不要在 HAproxy 上进行任何与 TLS 相关的处理。
这也意味着您不能像通过 SNI 使用 HTTPS 那样在“单个 IP 上拥有纯基于名称的 SMTP 虚拟主机”。
附注:我写了关于端口 465 和 587 的内容,但我在您的配置中没有看到它们。看来您没有使用专用的提交/smtpd 服务来提交客户端电子邮件,我怀疑您在端口 25 上进行经过身份验证的提交。这不是一个好的、安全的设置,而且很难正确管理。让您的生活更轻松:删除端口 25 上的任何身份验证支持;它仅用于接收来自其他邮件服务器的邮件。启用submission
或/和smtps
服务master.cf
并仅支持这些的身份验证,并以类似的方式更新客户端配置以仅使用提交服务来提交邮件。
另一个补充说明:您真的在使用 POP3 吗?为什么?使用 POP3 可以做的所有事情都可以通过 IMAP 完成。只是不要设置它,就像它从未存在过一样 :)
答案2
多路复用由应用程序协议处理。Haproxy 了解 HTTP,因此它可以处理 HTTP 流量。另一方面,它不了解 SMTP。虽然您可以根据 Postfix 传输图路由流量,但 Postfix 具有明确的功能在接收端充当中继。但这需要一些 DNS 操作来配置将内部地址报告为 MX 的分割区域。我将使用 Postfix 收件人映射,如下所示:
recipient_canonical_maps = hash:/etc/postfix/mydomains
后者包含....
@domain1.com @vm1.internalzone
@domain2.com @vm3.internalzone
...
注意:需要注意的是 - 您需要额外的配置来防止它成为开放中继(relay_domains 应该可以工作)。请确保您测试了配置。
但我忍不住觉得这本质上是一种糟糕的架构 - 将域绑定到特定实例。我更倾向于按功能进行整合。根据提供的信息,opensense VM 不会为服务增加任何价值。
答案3
使用 postfix 不需要反向代理,postfix 可以处理多个域
在您的 postfix main.cf 中您创建
transport_maps = hash:/etc/postfix/transport
并指定此服务器将接受哪些域的邮件
mydestination = example.com example2.com example3.net
并在传输文件中指定负责每个域的邮件服务器
example.com smtp:[mailserver1.example.com]
example2.com smtp:[mailserver2.example.com]
然后运行postmap /etc/postfix/transport
并重新启动或重新加载 postfix