我正在尝试在一个 IP 地址上托管两个独立的域。我希望能够从 STARTTLS 命令中确定请求了哪个证书,并根据域转发到不同的邮件服务器。
从 RFC 来看这似乎是不可能的,但是有没有其他方法可以在单个 IP 地址上实现这样的事情?
答案1
不,SMTP 旨在在电子邮件中跟踪整个电子邮件通信路径,并且每个连接都会终止并中继电子邮件,您应该使用传输图(用于 postfix)通过电子邮件地址而不是 MTA 主机名来控制目的地。
如果您在本地接收两个域的电子邮件,那么您的电子邮件服务器应该处理该问题,如果此单个 IP 在内部将电子邮件转发到另外两个服务器,那么传输图就是您在后缀服务器方面所寻找的。
如果这是出站服务器中继(SMTPS),您将需要在此服务器上处理两个域的身份验证,因为您无法像使用 nginx/haproxy 和 SNI 那样进行“代理”。
答案2
根据文档,Postfix 在命令后的 TLS 握手中发送 SNI 信息STARTTLS
,至少在 DNS 中发布 TLSA 记录的情况下是这样:
当为远程 SMTP 服务器获取可用的 TLSA 记录时,Postfix SMTP 客户端会在其 SSL 客户端问候消息中发送 SNI TLS 扩展。这可能有助于远程 SMTP 服务器履行其承诺,提供与其 TLSA 记录相匹配的证书。
我不确定这是否足够,但它表明 SNI 可以而且应该与之一起使用STARTTLS
;如果一些发送者没有这样做,我会认为他们有问题。
更远,此 IETF 草案指定应使用 SNI:
客户端在其服务器证书身份检查中使用 SRV 查询的 DNSSEC 验证状态。(TLSA 验证状态不会影响服务器证书身份检查。)它应在相关应用程序协议中使用服务器名称指示扩展 (TLS SNI) 或其功能等效项...
答案3
您不需要 SNI。大多数 MTA 支持基于域的路由。例如Postfix 有一个传输图。你可以制作类似这样的地图:
foo.com smtp:[mail.foo.com]
bar.com smtp:[mail.bar.com]