答案:症状
如果使用某种第三方测试对 Microsoft 简单邮件传输协议 (SMTP) 服务器的中继情况进行测试,SMTP 服务器可能看起来未能通过测试,Microsoft SMTP 产品可能看起来是对中继开放的,即使事实并非如此。
现有多个常用测试可用来测试 SMTP 服务器的中继情况。您可以使用第三方 Web 站点及工具,例如:http://www.abuse.net/relay.html
- 和 -
Microsoft 提供了第三方联系信息以便于您寻求技术支持。该联系信息如有更改,恕不另行通知。Microsoft 不保证此第三方联系信息的准确性。
开始,您的 SMTP 服务器看起来可能未能通过部分测试,这时,您的 Microsoft SMTP 产品可能看起来是对中继开放的。但是,在您进一步仔细检查了服务器后,将发现您的 Microsoft SMTP 产品并没有对中继开放。原因
SMTP 协议中的每个“收件人”或“发件人”地址均包含以下两个部分:本地部分(或邮箱)和域部分。如果没有指定域部分(换句话说,就是紧跟在 [@] 符号后面的部分),则会假定电子邮件是本地电子邮件。实际上,有些 Microsoft SMTP 产品会将本地域附上,原因是某些用户配置其 SMTP 客户端时,仅将用户名当作电子邮件地址。通过添加默认的本地域,Microsoft 服务器将最可能是默认值的设置添加了上去,这样就减少了支持费用。
发生上述情况的原因是,Microsoft SMTP 产品在接受将要传递的 SMTP 电子邮件之前,不执行目录查找。Microsoft SMTP 产品只检查收件人域,看它是不是一个本地域或显式允许的域。如果收件人域不是一个本地域或允许的域,则服务器将显示一条与下面类似的错误信息:550 5.7.1 Relaying prohibited阻止中继只需要一个条件,即证明“收件人”地址的域部分是本地域。一种选择是,检查邮件服务器的目录以了解收件人是否有效,但此操作不是必需的。如果邮件服务器接受了一个邮件,后来发现它无法传递该邮件,该邮件服务器必须生成一个未送达报告 (NDR)。(请参见 Request for Comments [RFC] 2821 文档的第 3.7 节和 RFC 1123 文档的第 5.2.7 节。)Microsoft SMTP 产品符合此要求。Microsoft SMTP 服务器似乎接受了要中继的邮件,但是后来该服务器并不传递该邮件并且生成一个 NDR。更多信息
如果您必须拥有在 SMTP 协议会话期间执行目录查找的能力,您可以编写一个 Windows 2000 SMTP 协议事件接收器。
有关其他信息,请参见下面的 MSDN 平台 SDK SMTP 服务器事件 Web 站点: 推荐的符合 RFC 的响应与下面的响应类似:550 5.1.1 user@northwindtraders.com...User unknownMicrosoft 选择不在 SMTP 协议会话期间执行目录查找,原因是:
- 如果您将 5xx 错误返给假冒的用户,则向您的服务器发送主动提供的大量商务电子邮件(垃圾邮件或 UCE)的用户即刻会发现哪些地址是真实的、哪些地址是假冒的。用户如果使用 SMTP 协议运行一个名称词典,就很容易获取一个有效电子邮件地址的列表。这也可能会给本地用户带来安全风险,因为用户名往往与电子邮件地址是一样的。
- 恶意用户可以使用“发件人”地址在未经授权的情况下访问系统(欺骗),然后使用受害者的服务器向目标收件人发送 NDR。这种攻击只能用攻击者能够发送的数据量攻击服务器。换句话说,如果恶意用户想对第三方发送 1 兆 (MB) 的数据,则必须使用他(或她)自己的 1 兆带宽把 1 兆的数据发送到 SMTP 服务器。通常情况下,这种恶意用户尝试发送 1 MB 的数据,但是仍会导致 Internet 上有几十或几百 MB 的数据攻击一个或一组受害者服务器。阻止发生这一情况最好的做法是,在整个 Internet 范围内验证“发件人”的地址。但是,还没有任何标准用于在整个 Internet 范围内验证“发件人”的地址;因此,应对这一情况的最好做法是查看邮件标头。
- 如果在 SMTP 协议会话期间执行了目录查找,则 SMTP 协议的运行速度可能大大减慢。在本文发布时,Microsoft 是在以下前提下运作的:SMTP 服务器应以尽可能快的速度运行,以避免 Internet 上或桌面 SMTP 客户端上的 SMTP 邮件发生阻塞。如果目录过载,则客户端可能会发现服务器运行速度过慢,而且会收到一条错误信息。在某些情况下,目录也可能不可用;或者,可能需要对特定的域进行中继,但是目录的副本可能不可用(例如,在 ISP 承载的环境中)。
关于中继的一般信息
一台 SMTP 客户端可以使用 SMTP 服务器将电子邮件转发到远程(即,非本地)域,这一情况叫做中继。中继本来不是坏事,因为 SMTP 就是为这一用途设计的(请参见 RFC 2821 文档的第 2.1 节和第 3.7 节)。
但是,如果对中继不加控制(不受控制的主机称作“开放中继”的主机),恶意用户可能使用中继来发送主动提供的大量商务电子邮件(垃圾邮件或 UCE)。通过将这些不请自来的电子邮件借助中间主机弹跳,恶意用户会让自己的身份真假难辨。这还会使资源绑定到中继主机上,使中继主机无法发送有效的电子邮件。特别是,大多数发送这种主动提供的电子邮件的用户无需使用自己的带宽即可将一封邮件发送给大量的收件人。中继测试 1
此为 SMTP 中继的标准测试。如果不是管理员特许或者 SMTP 客户端首先进行验证,SMTP 客户端不应以这种方式进行中继。>>> RSET<<< 250 2.0.0 Resetting>>> MAIL FROM:<spamtest@contoso.net><<< 250 2.1.0 spamtest@contoso.net....Sender OK>>> RCPT TO:<relaytest@contoso.net><<< 550 5.7.1 Unable to relay for relaytest@contoso.net中继测试 2
此测试与上一个测试基本上一样,只是发起人是本地用户而不是远程域的用户。因为“发件人”地址常被用于在未经授权的情况下访问系统(欺骗),所以任何服务器都不应被这种方法欺骗:>>> RSET<<< 250 2.0.0 Resetting>>> MAIL FROM:<spamtest><<< 250 2.1.0 spamtest@northwindtraders.com....Sender OK>>> RCPT TO:<relaytest@contoso.net><<< 550 5.7.1 Unable to relay for relaytest@contoso.net中继测试 3
此测试针对 NULL 或空白“发件人”信封地址。NDR 及其他通知会使用 NULL“发件人”信封地址。然而,如果“收件人”地址中的域不是本地域,通知仍然不会通过:>>> RSET<<< 250 2.0.0 Resetting>>> MAIL FROM:<><<< 250 2.1.0 <>....Sender OK>>> RCPT TO:<relaytest@contoso.net><<< 550 5.7.1 Unable to relay for relaytest@contoso.net中继测试 4
此测试与中继测试 2 一样,只是客户端已显式添加本地域。这不应骗过 SMTP 服务器:>>> RSET<<< 250 2.0.0 Resetting>>> MAIL FROM:<spamtest@northwindtraders.com><<< 250 2.1.0 spamtest@northwindtraders.com....Sender OK>>> RCPT TO:<relaytest@contoso.net><<< 550 5.7.1 Unable to relay for relaytest@contoso.net中继测试 5
此测试也与中继测试 2 一样,只是已添加服务器的本地 IP 地址,目的是尝试欺骗服务器。尽管此地址格式通常是可接受的,但服务器不应接受到远程域的中继。在尝试将服务器的“本地主机名”或域名称系统 (DNS) 名填入“发件人”地址中的各种其他测试中,服务器都不应被“发件人”地址欺骗:>>> RSET<<< 250 2.0.0 Resetting>>> MAIL FROM:<spamtest@[10.10.10.10]><<< 250 2.1.0 spamtest@[10.10.10.10]....Sender OK>>> RCPT TO:<relaytest@contoso.net><<< 550 5.7.1 Unable to relay for relaytest@contoso.net中继测试 6
此测试专用于旧式的基于 UNIX 的服务器,该服务器通过附加本地域并将 (@) 符号更改为百分号 (%) 来路由电子邮件。然后服务器才中继邮件。此 Microsoft 产品可接受该邮件,显示未能通过测试。因为百分号 (%) 在本地部分是个有效字符,此产品选择了接受该邮件并在目录查找失败时发出一个 NDR。对于这一类型的中继,Microsoft SMTP 产品没有漏洞,因为邮件没有转发,而是发出了一个 NDR:>>> RSET<<< 250 2.0.0 Resetting>>> MAIL FROM:<spamtest><<< 250 2.1.0 spamtest@northwindtraders.com....Sender OK>>> RCPT TO:<relaytest%contoso.net><<< 250 2.1.5 relaytest%contoso.net@northwindtraders.com中继测试 7
此测试是中继测试 6 的又一个变种。此 Microsoft 产品接受邮件并显示未能通过测试。因为引号符号 (") 在本地部分是个有效字符,此产品选择了接受该邮件并在目录查找失败时发出一个 NDR。对于这一类型的中继,Microsoft SMTP 产品没有漏洞,因为邮件没有转发,而是发出了一个 NDR:>>> mail from: <spamtest><<< 250 2.1.0 spamtest@northwindtraders....Sender OK>>> rcpt to: <"nobody@mail-contoso.org"><<< 250 2.1.5 "nobody@mail-contoso.org"@northwindtraders.com如果您的 SMTP 服务器未能通过这些测试中的一个或多个,特别是中继测试 6 和 7,这并不一定能说明该服务器是一个开放中继。有些系统(包括 Microsoft Exchange 和 Microsoft Windows 2000 SMTP)看起来能接受中继邮件,但是随后在内部拒绝邮件而不进行传递。但是,如果不发送一条真实的测试邮件,您无法真正确定某个服务器是否真的开放中继。
当您对 Exchange 2000 服务器进行中继测试 6 和测试 7 时,因为这两种测试都会针对无效收件人生成一条消息,所以在 Exchange System Manager 中指定的邮箱(具体指定位置是在默认 SMTP 虚拟服务器的属性中,在邮件选项卡上,在“将使用未解析的收件人的邮件全部转发到主机”框中)会收到一个与下例类似的 DNR:Your message did not reach some or all of the intended recipients. Subject:中继测试 6Sent:3/22/2002 5:47 PM The following recipient(s) could not be reached: relaytest%contoso.net@northwindtraders.com on 3/12/2002 12:30 PMThe e-mail account does not exist at the organization this message was sent to.Check the e-mail address, or contact the recipient directly to find out the correct address. <server.northwindtraders.com #5.1.1>- 或者 -Your message did not reach some or all of the intended recipients. Subject:中继测试 7Sent:3/13/2002 12:30 PM The following recipient(s) could not be reached: "nobody@mail-contoso.org"@northwindtraders.com on 3/13/2002 12:30 PMThe e-mail account does not exist at the organization this message was sent to.Check the e-mail address, or contact the recipient directly to find out the correct address.<server.northwindtraders.com #5.1.1>您可以使用这些 NDR 来验证这些邮件确实未被中继。
有关如何在运行 Exchange Server 5.5 时使服务器防范开放中继的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:196626 XFOR:Restricting Routing in the Internet Mail Service
如果您运行的是 Microsoft Exchange 2000,默认情况下,中继需要身份验证。有关其他信息,请参见 Exchange 2000 帮助。