SMTP 标语与多个 MX 记录不匹配

SMTP 标语与多个 MX 记录不匹配

我的直觉告诉我“这不是问题,而且从逻辑上讲无法真正解决”。我正在配置一个备份 ISP 连接,用于我们的现场 Exchange 邮件服务器。

这是我所设置的:

198.51.100.30 -> primary ISP
203.0.113.40 -> backup ISP

以下内容添加到我们的 example.com 域 DNS:

mail.example.com. A 198.51.100.30
mail2.example.com. A 203.0.113.40
example.com. MX 10 mail.example.com.
example.com. MX 20 mail2.example.com.

相关ISP添加的PTR:

198.51.100.30 mail.example.com
203.0.113.40 mail2.example.com

现在,我们的邮件服务器始终可以像横幅一样工作mail.example.com,一切正常,MXToolBox 很开心。但是,我该如何处理有关故障转移 MX 的横幅?显然,故障转移 PTRmail2.example.com会在 MXToolBox 中生成“反向 DNS 与 SMTP 横幅不匹配”。

我是不是根本不担心这个问题,还是我没有正确设置某些东西?

编辑:邮件服务器上安装的 SSL SAN 证书同时具有mail.example.commail2.example.com

答案1

最佳实践:拥有两台 MX 服务器

最好的选择是使用两台服务器,即配置另一台 Exchange(或者基于开源的 SMTP 服务器,例如 Postfix)作为备份/辅助 MX 服务器。在大多数情况下,服务器本身可能比 Internet 连接导致更多的停机时间。由于横幅不匹配只是出站邮件的问题,因此该服务器完全可以满足mail2.example.com您当前的配置。

具有两个 Internet 连接的单个服务器

出站邮件配置

第二种方法是将两个连接配置为相同的主机名,因为实际上它们是具有不同 IP 地址和路由的同一主机。这可以通过轮询 DNS配置 + 匹配的 PTR 记录和 SMTP 横幅例如

mail.example.com. A 198.51.100.30
mail.example.com. A 203.0.113.40
40.113.0.203.in-addr.arpa. PTR mail.example.com.
30.100.51.198.in-addr.arpa. PTR mail.example.com.

不要忘记添加 SPF 记录以允许两个 IP 地址发送邮件,例如

example.com. IN TXT "v=spf1 +ip4:198.51.100.30/32 +ip4:203.0.113.40/32 -all"

入站邮件配置

如果您希望在接收邮件时优先使用第一 ISP 而不是第二 ISP(例如,如果它具有更好的带宽),您可以将 MX 配置与此分开,例如通过添加

mx1.example.com. A 198.51.100.30
mx2.example.com. A 203.0.113.40
example.com. MX 10 mx1.example.com.
example.com. MX 20 mx2.example.com.

横幅不匹配对于入站邮件来说不是问题,所以这完全没问题。

证书

为了使证书在两种配置下都有效,现在应该为所有mail.example.commx1.example.com和都拥有 SAN mx2.example.com。通常这并不重要,因为邮件服务器证书很少真正得到验证,而且大多数邮件系统仍然允许回退到未加密的连接。

不再基于 CA 证书验证,基于 DNS 的命名实体身份验证(丹麦,RFC 6698) 是一种建议的替代方案,也允许验证自签名证书。为了向后兼容,无法将 SMTP 服务器配置为仅允许加密连接,这为可以通过 TLS 建立的连接留下了 MitM 攻击的漏洞。使用 DANE,可以声明应使用 TLS 进行连接,并且只应允许在 DNS 区域中发布的证书。

答案2

您只需要担心当使用 mail2 发送外发邮件时横幅名称是什么。在这种情况下,它仍然应该与它正在使用的 IP 的反向 DNS 匹配。剩下唯一需要检查的是,任何 SSL 证书中是否使用了正确的名称(每个服务器的所有 3 个名称都需要匹配 - 横幅/helo 名称、SSL 证书中的名称和反向查找)以及备份服务器是否列在任何 SPF 记录中,等等。就此而言,我的 SPF 记录仅列出“此域的所有 MX”。

是的,据我所知,根据您所发布的内容,您应该可以开始了。

答案3

您的直觉是正确的,这不是一个真正的问题,因为有两点:

  1. MX 记录控制您希望在哪里接收电子邮件。
    您的备份 MX 记录不用于发送邮件,仅用于接收传入邮件。

接收电子邮件很容易:尽管某些发件人可能会对 TLS 证书的内容进行更严格的检查,以实现向后兼容,但几乎所有发件人都会简单地将邮件发送到您的 MX 记录,只要有东西在侦听 TCP 端口 25、正确响应 SMTP 协议消息并返回“250接受邮件并发送给您后,会收到“请求的邮件操作已成功完成”的响应。

(只有可靠地发送电子邮件才需要更加仔细的配置和遵守协议。)

  1. 传入 SMTP 服务器根本不需要表明自己身份。它只需接受想要接收的消息并拒绝不想接收的消息。(只有发件人需要表明自己身份。)

据我所知只有实际SMTP 响应返回代码编号几乎所有服务器消息中的 SMTP 服务器响应代码后面的文本都与协议本身相关。SMTP 服务器响应代码后面的文本不仅在横幅消息中,而且在错误和大多数其他消息中也仅对调试目的/人机交互有用,与 SMTP 协议角度完全无关(并且大部分被忽略)。请注意,这仅适用于服务器消息,为了打击垃圾邮件,SMTP 服务器本身对从客户端/其他邮件服务器接收消息的要求要严格得多。

RFC 5321

SMTP 服务器实现可在 220 代码后的连接问候回复中包含其软件和版本信息的标识,这种做法可以更有效地隔离和修复任何问题。实现可以为 SMTP 服务器提供规定,以禁用引起安全问题的软件和版本公告

答案4

在您的情况下配置 Postfix 的方法之一是在 master.conf 中定义两个传出的 smtp 传输接口:

mail.example.com-out  unix -       -       n       -       -       smtp
   -o smtp_bind_address=198.51.100.30
   -o smtp_helo_name=mail.example.com
   -o syslog_name=postfix-mail.example.com

mail2.example.com-out  unix -       -       n       -       -       smtp
   -o smtp_bind_address=203.0.113.40
   -o smtp_helo_name=mail2.example.com
   -o syslog_name=postfix-mail2.example.com

然后在 main.cf 中定义“default_transport”参数:

default_transport = mail.example.com-out

最后,创建一个 shell 脚本,通过 cronjob 定期检查您的 ISP 连接并动态切换 Postfix 传输。下面是此类 bash 脚本的示例(假设您的两个 ISP 连接到 eth0 和 eth1 接口。或者,使用 -S 开关来定义源 IP 地址:ping -S 198.51.100.30 -c 2 $SERVERIP... - 具体方式取决于您对两个网关接口/路由表的配置),它应该在 root 下运行:

#!/bin/bash
SERVERIP=8.8.8.8

ping -I eth0 -c 2 $SERVERIP > /dev/null 2>&1
if [ $? -ne 0 ]
then
    echo "ISP1 is down"
    ping -I eth1 -c 2 $SERVERIP > /dev/null 2>&1
    if [ $? -ne 0 ]
        echo "ISP2 is also down"
    else
        echo "Switching to ISP2"  
        sed -i 's/mail.example.com-out/mail2.example.com-out/g' /etc/postfix/main.cf
        systemctl reload postfix
    fi  
else
   echo "ISP1 reachable"
   if grep -q 'mail2.example.com-out' /etc/postfix/main.cf; then
      echo "Switching back to ISP1"
      sed -i 's/mail2.example.com-out/mail.example.com-out/g' /etc/postfix/main.cf
      systemctl reload postfix
   fi
fi

Root 的 crontab(在 root 下运行‘crontab -e’进行编辑)示例每 2 分钟运行一次脚本:

*/2 * * * * /path/to/your/script.sh 2>&1 | ts | tee -a /var/log/check_postfix_transport.log

理由:

SMTP 横幅仅针对从 smtp 客户端接收传入连接的 smtp 守护程序(服务器)定义。使用 SMTP 横幅,服务器在会话启动期间向连接客户端标识自己。但是,这是可选的。

RFC 5321

3.1 会话发起

当客户端打开与服务器的连接时,SMTP 会话就会启动,并且服务器以开场白回应。

邮件传输协议服务器实施可能包括鉴别在回复之后的连接问候语中,220代码。

客户端(例如,想要向传入服务器发送电子邮件的另一台服务器)从不向接收服务器发送 SMTP 横幅。发送给服务器的是 EHLO/HELO 主机名,服务器会根据该主机名检查垃圾邮件等 PTR 不匹配情况。

RFC 5321

3.2 客户端启动

一旦服务器已发送欢迎信息并且客户端已经收到,客户通常会发送埃希氏藻毒素命令到服务器,表明客户端的身份。

根据 EHLO/HELO,服务器可以检查 PTR(如果 SMTP 发送方的 IP 解析回其主机名)和/或 spf,并最终决定是否真的要接收或中继来自 SMTP 客户端的电子邮件消息。

基于此,您通常应该做的是关注您的 SMTP 服务器在想要向其他服务器发送电子邮件时(并在这些连接期间充当 SMTP 客户端)发送到其他服务器的 EHLO 命令。您应该确保您的 SMTP 服务器使用正确的源 IP 地址并发送正确的 EHLO 主机名,该主机名解析回用于连接的 IP。并且您可能基本上忽略 SMTP 横幅,因为它是关于接收电子邮件,而不是发送。

我猜想 mxtoolbox 也混淆了 SMTP 反向 DNS 不匹配和 SMTP 横幅不匹配,并毫无理由地检查后者,并且其关于 SMTP 横幅的措辞部分不正确。SMTP rDNS 不匹配很重要,SMTP 横幅不匹配则不重要。同样,SMTP 横幅由接收服务器发送(这就是为什么它在 Postfix 的“smtpd_banner”参数中定义,而不是在“smtp_banner”中定义),而不是由发送/中继客户端发送。因此它与垃圾邮件等无关。

从这个意义上来说,SMTP 标语的作用与证书识别接收服务器的作用相同,尽管没有第三方信任链。

相关内容