我有一台 Proxmox 机器,上面运行着 2 台虚拟机,还有两个域,假设为 domainA.com 和 domainB.com。两个域都指向 Proxmox 公共地址,而且我还设置了 nginx,根据传入到每个虚拟机的域名来反向传输 http 流量。
网络如下所示:
proxmox with nginx = #public IP# and 192.168.1.1, domainA.com = 192.168.1.2, domainB.com=192.168.1.3)
我还想在每个虚拟机上设置邮件服务器,并根据域名路由传入邮件通信。例如,当我收到收件人的邮件时[电子邮件保护]当我收到带有收件人的邮件时,我想将通信转发到 192.168.1.2[电子邮件保护]我想将通信转发到192.168.1.3。
我该如何实现这一点?我在使用 nginx 时遇到了麻烦,我不确定这是否会起作用
答案1
邮件协议没有任何与 HTTP 的 Host 标头等效的内容,而虚拟主机和反向代理正是基于此。
任何“虚拟邮件托管”都基于一个简单的事实,你可以将域名整合到用户名中邮件用户。无法通过用户连接到的邮件服务器主机名(例如通过 SMTP 或 IMAP 或其他方式)来区分用户;除了用户名之外,协议中没有可以输入域名的地方。因此,反向代理需要知道用户名,即执行身份验证;但这不再只是反向代理了。
此外,我不知道有任何解决方案可以与邮件协议的 SNI 类似,因此所有邮件“虚拟主机”只能使用同一个托管服务器 SSL 证书。这意味着,除了证书中存在的(在 CN 或 SAN 字段中)之外,根本无法为不同的托管域使用不同的邮件服务器主机名。
对于 SMTP,可以有限地模仿反向代理。使用 Postfix 可以这样做:
- 设置一个“反向代理”系统,该系统将自己视为中继两个域的。为此,您需要将它们添加到
relay_domains
中的设置中main.cf
。当然,两个域的互联网发件人都必须定向到该系统(即所有域的 MX 都必须设置为此中继主机名)。
您最好为您的中继提供一种过滤无法投递的目的地的方法。换句话说,中继必须始终知道目标服务器上的实际邮箱列表。这是为了减少垃圾邮件负载和反向散射的可能性(这比您想象的要重要得多!)。例如,定期将终端服务器的邮箱数据库与其同步并relay_recipient_maps
在中继主机上进行配置。还记得我说过“不仅仅是反向代理”吗?
- 在此“反向代理”上设置传输映射,它将把每个域的邮件定向到适当的设置。这包括向文件中添加以下行
/etc/postfix/transport
:
domainA.com smtp:[192.168.1.2]
domainB.com smtp:[192.168.1.3]
方括号指示 Postfix 不进行 MX 查找并直接使用指定的地址;它只会连接到端口 25 来传递邮件。然后按如下方式指定此文件transport_maps
(main.cf
请参阅 Postfix 文档以了解如何正确执行此操作)
- 在目标主机上设置 MTA。它们的配置与通常一样,但您应将中继主机指定为受信任的,以便这些 MTA 的反垃圾邮件系统信任其 Received: 标头(您不得信任任何由不受您控制的系统添加的 Received: 标头)。