为什么 sendmail 会在 To: 标头中为非收件人的域调用 dns_getcanonname?

为什么 sendmail 会在 To: 标头中为非收件人的域调用 dns_getcanonname?

我们注意到 sendmail 配置中偶尔会出现一个可重复的问题。这种情况是我们从互联网收到一封邮件,邮件中有一个收件人:列表中的用户,而收件人:列表中的另一个用户的域存在 DNS 问题。在这种情况下,sendmail 会在错误地址上收到 DNS 错误,并以“主机名查找失败”退出,因此邮件会在我们的队列中停留几天,并且永远不会传递给我们系统上的收件人。

例如,如果我发送一条包含以下收件人:行的消息:

  To: [email protected], [email protected]

swcp.com 是此服务器处理的本地域,而“cheeks”具有指向“cheeks@ebi2”的本地别名。lovelacesandia.com 是一个存在问题的非本地域(目前对其的所有查询都会导致 SERVFAIL)。原始邮件发送者可能已将此邮件的副本滞留在他们自己的队列中,因为他们也无法访问 lovelacesandia.com。滞留在我队列中的邮件副本只有一个收件人:

RPFDA:cheeks@ebi2

以下是“sendmail -v -d8-9.5 -qRcheeks”的输出

Running /var/spool/mqueue/t7QHX1uB080255 (sequence 1 of 1)
host_map_lookup(swcp.com) => dns_getcanonname(swcp.com, trymx=1)
dns_getcanonname: trying swcp.com. (AAAA)
dns_getcanonname: trying swcp.com. (A)
dns_getcanonname: swcp.com
FOUND swcp.com
host_map_lookup(swcp.com) => CACHE swcp.com
host_map_lookup(ebi2) => dns_getcanonname(ebi2, trymx=1)
dns_getcanonname: trying ebi2.swcp.com (AAAA)
dns_getcanonname: trying ebi2.swcp.com (A)
dns_getcanonname: ebi2.swcp.com
FOUND ebi2.swcp.com
host_map_lookup(swcp.com) => CACHE swcp.com
getmxrr([ebi2.swcp.com], droplocalhost=1)
dns_getcanonname(ebi2.swcp.com, trymx=0)
dns_getcanonname: trying ebi2.swcp.com. (AAAA)
dns_getcanonname: trying ebi2.swcp.com. (A)
dns_getcanonname: ebi2.swcp.com
cheeks@ebi2... Connecting to ebi2.swcp.com. via smtp...
220 ebi2.swcp.com ESMTP Sendmail 8.15.1/8.14.9; Wed, 26 Aug 2015 11:44:59 -0600 (MDT)
>>> EHLO ame1.swcp.com
250-ebi2.swcp.com Hello ame1.swcp.com [216.184.2.118], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE 100000000
250-DSN
250-ETRN
250-STARTTLS
250-DELIVERBY
250 HELP
>>> STARTTLS
220 2.0.0 Ready to start TLS
>>> EHLO ame1.swcp.com
250-ebi2.swcp.com Hello ame1.swcp.com [216.184.2.118], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE 100000000
250-DSN
250-ETRN
250-AUTH PLAIN LOGIN
250-DELIVERBY
250 HELP
>>> MAIL From:<[email protected]> SIZE=1672
250 2.1.0 <[email protected]>... Sender ok
host_map_lookup(ebi2.swcp.com) => dns_getcanonname(ebi2.swcp.com, trymx=1)
dns_getcanonname: trying ebi2.swcp.com. (AAAA)
dns_getcanonname: trying ebi2.swcp.com. (A)
dns_getcanonname: ebi2.swcp.com
FOUND ebi2.swcp.com
>>> RCPT To:<[email protected]>
>>> DATA
250 2.1.5 <[email protected]>... Recipient ok
354 Enter mail, end with "." on a line by itself
host_map_lookup(swcp.com) => CACHE swcp.com
host_map_lookup(swcp.com) => CACHE swcp.com
host_map_lookup(lovelacesandia.com) => dns_getcanonname(lovelacesandia.com, trymx=1)
dns_getcanonname: trying lovelacesandia.com. (AAAA)
dns_getcanonname: trying lovelacesandia.com. (A)
dns_getcanonname: trying lovelacesandia.com. (MX)
dns_getcanonname: trying lovelacesandia.com.swcp.com (AAAA)
FAIL (2)
lovelacesandia.com: Name server timeout
timeout writing message to ebi2.swcp.com.
cheeks@ebi2... Deferred: Name server: ebi2.swcp.com.: host name lookup failure
Closing connection to ebi2.swcp.com.

这是 FreeBSD 10.1 上的 Sendmail 8.15.1 的情况。我怀疑这种情况已经存在很长时间了,但我们最近才诊断出来。符合这种情况的大多数邮件都是垃圾邮件,所以没人在意。但偶尔有人向一大群人发送邮件(不使用密件抄送),其中一个地址就坏了。

如果我们尝试向虚假地址投递邮件,我就能理解为什么会出现问题。但我不明白的是,为什么我的 sendmail 会关心标题 To: 中的虚假地址,而我们不会尝试向该地址投递邮件。

我们有以下我认为可能涉及的特征:

FEATURE(blacklist_recipients)
FEATURE(`delay_checks', `friend', `n')

我已对它们进行了移除测试,并得到了相同的结果。

如果有人知道是什么原因导致这种情况,或者如何缓解这种情况,我将不胜感激。谢谢,

标记

答案1

和一些真实测试实验中,sendmail 不会触碰邮件头收件人;但是,在您的情况下,坏域肯定是收件人,否则地址将不会通过查找程序运行?由于 sendmail 将暂时使任何发往​​返回的域的邮件失败SERVFAIL,因此 milter 无论如何都是您的最佳选择;配置 milter-regex 是一种选择:

dnl for sendmail.mc
INPUT_MAIL_FILTER(`milter-regex', `S=unix:/var/spool/milter-regex/sock, T=S:30s;R:2m')dnl

当该守护进程运行并使用该套接字文件时,milter-regex.conf如下所示:

discard
envrcpt /@lovelacesandia\.com>/i

一个复杂的因素是,如果这些消息被直接传递给sendmail二进制文件作为邮件提交代理,在这种情况下,submit.cf需要改变配置来调用邮件过滤器,或者指示不进行域查找,而是将所有内容集中到主邮件传输代理,然后主邮件传输代理可以在必要时进行丢弃。

答案2

我也被这个问题困扰过。

经过一段时间的搜索,一个可能的解决方法是使用此代码片段sendmail.mc

FEATURE(`nocanonify', `canonify_hosts')
CANONIFY_DOMAIN(`$=m')

这可能会有副作用,如文档中所述,而且我不确定这是否是解决问题的最佳方法。但目前它是有效的。

相关内容