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