您可以使用访问控制映射来阻止别人通过您的 Messaging Server 系统中继 SMTP 邮件。例如,您可以阻止别人使用您的邮件系统向成百上千的 Internet 邮箱中继垃圾邮件。
默认情况下,Messaging Server 将阻止所有 SMTP 中继活动,包括本地 POP 和 IMAP 用户的中继。
阻止未经授权的中继但允许合法本地用户进行中继,这需要配置 Messaging Server 以使其知道如何区分这两类用户。例如,使用 POP 或 IMAP 的本地用户依赖于 Messaging Server 充当 SMTP 中继。
要阻止 SMTP 中继,您必须能够:
区分内部邮件和外部邮件
要启用由内部主机和客户机来进行 SMTP 中继,则必须将“内部”IP 地址或子网添加到 INTERNAL_IP 映射表。
为了阻止邮件中继活动,MTA 必须首先能够区分源自您的站点的内部邮件和源自 Internet 并通过您的系统传送回 Internet 的外部邮件。您要允许的是前一类邮件,要阻止的是后一类邮件。在入站 SMTP 通道(通常为 tcp_local 通道)上使用 switchchannel 关键字(默认设置)可以实现此区分。
switchchannel 关键字通过使 SMTP 服务器查找与外来 SMTP 连接关联的实际 IP 地址来进行工作。Messaging Server 将该 IP 地址和重写规则结合使用,以区分源自域内的 SMTP 连接和来自域外的连接。然后,此信息可用于在内部和外部通信之间分离邮件通信。
下面所述的 MTA 配置为默认设置,以便服务器可以区分内部和外部邮件通信。
在配置文件中,紧接本地通道之前,是带有 noswitchchannel 关键字的 defaults 通道:
! final rewrite rules defaults noswitchchannel ! Local store ims-ms ... |
外来 TCP/IP 通道指定了 switchchannel 和 remotehost 关键字,例如:
tcp_local smtp single_sys mx switchchannel remotehost TCP-DAEMON |
在外来 TCP/IP 通道定义之后,是一个具有不同名称的类似通道,例如:
tcp_intranet smtp single_sys mx allowswitchchannel routelocal tcp_intranet-daemon |
向通道重写地址时,routelocal 通道关键字会使 MTA 尝试将通过此通道的地址中的所有明确路由“短路”,从而阻止通过明确源路由的地址在内部 SMTP 主机间以循环方式进行的可能的中继尝试。
使用以上配置设置,域内生成的 SMTP 邮件将通过 tcp_intranet 通道进入。所有其他 SMTP 邮件将通过 tcp_local 通道进入。邮件将基于其进入的通道被区分为内部邮件和外部邮件。
这是如何起作用的?答案就是 switchchannel 关键字。该关键字被应用于 tcp_local 通道。邮件进入 SMTP 服务器时,该关键字使服务器查看与外来连接关联的源 IP 地址。服务器尝试对外来连接的真实 IP 地址进行反向指向信封重写,查找关联的通道。如果源 IP 地址匹配 INTERNAL_IP 映射表中的 IP 地址或子网,则调用该映射表的重写规则会将地址重写到 tcp_intranet 通道。
由于 tcp_intranet 通道标有 allowswitchchannel 关键字,因此邮件将被切换到 tcp_intranet 通道,并从该通道进入。如果邮件从其 IP 地址不在 INTERNAL_IP 映射表中的某个系统进入,则反向信封重写可能会重写到 tcp_local,也可能会重写到某些其他通道。但是,它不会重写到 tcp_intranet 通道,并且由于默认情况下,其他所有通道均被标记为 noswitchchannel,因此邮件也不会切换到其他通道,而是保留在 tcp_local 通道中。
请注意,使用字符串 "tcp_local" 的所有映射表或转换文件条目可能都需要根据用法更改为 "tcp_*" 或 "tcp_intranet"。
您的站点可能具有不属于您的物理网络的“本地”客户机用户。当这些用户提交邮件时,邮件提交将从外部 IP 地址进入—例如,任意 Internet 服务提供商。如果您的用户使用可以执行 SASL 验证的邮件客户机,则可以将他们已验证的连接与任意其他外部连接区分开。然后您可以允许已验证的提交,同时拒绝未验证的中继提交尝试。在入站 SMTP 通道(通常为 tcp_local 通道)中使用 saslswitchchannel 关键字,可以区分已验证的和未验证的连接。
saslswitchchannel 关键字使用变量来指定要切换到的通道;如果 SMTP 发件人验证成功,则他们提交的邮件会被视为进入指定的切换通道。
在配置文件中,添加带有独特名称的新 TCP/IP 通道定义,例如:
tcp_auth smtp single_sys mx mustsaslserver noswitchchannel TCP-INTERNAL
此通道应不允许常规通道切换(即,此通道上应具有先前默认行中明确或隐含指定的 noswitchchannel)。此通道上应具有 mustsaslserver。
修改 tcp_local 通道,在其中添加 maysaslserver 和 saslswitchchannel tcp_auth,如以下示例所示:
tcp_local smtp mx single_sys maysaslserver saslswitchchannel \ tcp_auth switchchannel |TCP-DAEMON |
使用此配置,那些可以使用本地密码进行验证的用户所发送的 SMTP 邮件将进入 tcp_auth 通道。从内部主机发送的未验证的 SMTP 邮件仍将进入 tcp_internal。所有其他 SMTP 邮件将进入 tcp_local。
现在要讨论此示例的要点:阻止未经授权的人员通过您的系统中继 SMTP 邮件。首先,请记住您要允许本地用户中继 SMTP 邮件。例如,POP 和 IMAP 用户依赖使用 Messaging Server 来发送其邮件。请注意,本地用户可能在物理上是本地(在这种情况下,其邮件从内部 IP 地址进入);也可能在物理上是远程,但可以将自身验证为本地用户。
您要阻止外部 Internet 上的任意人员使用您的服务器作为中继。使用以下各节所述的配置,您可以区分此类用户并正确地进行阻止。特别是,您要阻止邮件进入 tcp_local 通道和从同一通道返回。您可以使用 ORIG_SEND_ACCESS 映射表实现此目的。
通过 ORIG_SEND_ACCESS 映射表,可根据源通道和目标通道阻止通信。在此例中,将阻止来自 tcp_local 通道和返回该通道的通信。这可以通过以下 ORIG_SEND_ACCESS 映射表实现:
ORIG_SEND_ACCESS tcp_local|*|tcp_local|* $NRelaying$ not$ permitted
在此示例中,条目声明邮件不能进入 tcp_local 通道并从该通道直接返回。即,此条目不允许外部邮件进入您的 SMTP 服务器,并不允许外部邮件直接中继回 Internet。
使用 ORIG_SEND_ACCESS 映射表而非 SEND_ACCESS 映射表,以便阻止不会应用于最初匹配 ims-ms 通道的地址(但其可通过别名或邮件列表定义扩展回外部地址)。使用 SEND_ACCESS 映射表,需要很长的长度,才能允许外部人员发送到可扩展回外部用户的邮件列表,或发送到可将其邮件转发回外部地址的用户。
在 Messaging Server 中,有多种不同的方法可以确保所接受的要传送或转发的所有邮件均来自具有有效 DNS 名称的地址。最简单的方法是将 mailfromdnsverify 通道关键字放在 tcp_local 通道上。
Messaging Server 还提供了 dns_verify 程序,它使您可以使用 ORIG_MAIL_ACCESS 中的以下规则,确保接受的要传送和转发的所有邮件均来自具有有效 DNS 名称的地址:
ORIG_MAIL_ACCESS TCP|*|*|*|*|SMTP|MAIL|*|*@*|*|* \ $[msg_svr_base/lib/dns_verify.so, \ dns_verify,$6|$$y|$$NInvalid$ host:$ $$6$ -$ %e]
从句法上来说,以上示例中的换行符在此类映射条目中很显著。反斜杠字符是一种合法地继续到下一行的方法。
dns_verify 映像也可用于根据 RBL(Realtime Blackhole List,实时黑洞名单)、MAPS(Mail Abuse Prevention System,邮件滥用防止系统)、DUL(Dial-up User List,拨号用户列表 )或 ORBS(Open Relay Behavior-modification System,开放中继修改系统)列表检查外来连接,作为保护系统免受 UBE 影响的另一种尝试。使用新的 mailfromdnsverify 关键字,还可以使用一种单独的“更易于配置”的方法进行这样的检查,而不必执行 dns_verify 调用。这种更简单的方法是使用 dispatcher.cnf 文件中的 DNS_VERIFY_DOMAIN 选项。例如,在 [SERVICE=SMTP] 部分中,将选项的实例设置为要检查的各个列表:
[SERVICE=SMTP] PORT=25 ! ...rest of normal options... DNS_VERIFY_DOMAIN=rbl.maps.vix.com DNS_VERIFY_DOMAIN=dul.maps.vix.com! ...etc... |
在这种情况下,邮件在 SMTP 级别被拒绝(即,邮件在 SMTP 对话期间被拒绝),因此永远不会被发送到 MTA。这种简单方法的缺点在于,它将对所有正常的外来 SMTP 邮件(包括那些来自内部用户的邮件)执行检查。这种方法效率较低,并且在 Internet 连接性降低的情况下可能会发生问题。另一种方法是从 PORT_ACCESS 映射表或 ORIG_MAIL_ACCESS 映射表调用 dns_verify。在 PORT_ACCESS 映射表中,您可以使初始条目不检查本地内部 IP 地址或邮件提交者,而使较后的条目对其他所有人员执行所需的检查。或者,在 ORIG_MAIL_ACCESS 映射表中,如果只将检查应用于从 tcp_local 通道进入的邮件,则对于来自内部系统/客户机的邮件将跳过检查。使用了指向 dns_verify 的条目的示例,如下所示。
PORT_ACCESS ! Allow internal connections in unconditionally *|*|*|*|* $C$|INTERNAL_IP;$3|$Y$E ! Check other connections against RBL list TCP|*|25|*|* \ $C$[msg_svr_base/lib/dns_verify.so,\ dns_verify_domain_port,$1,rbl.maps.vix.com.]EXTERNAL$E ORIG_MAIL_ACCESS TCP|*|25|*|*|SMTP|*|tcp_local|*@*|*|* \ $C$[msg_svr_base/lib/dns_verify.so,\ dns_verify_domain,$1,rbl.maps.vix.com.]$E
dns_verify 程序支持基于 DNS 的数据库,该数据库用于确定可能发送未经许可的批量邮件的外来 SMTP 连接。某些公用 DNS 数据库不包含通常用于此用途的 TXT 记录。而是,他们只包含 A 记录。
在典型设置中,DNS 中针对特定 IP 地址找到的 TXT 记录包含一个在拒绝邮件时可返回 SMTP 客户机的错误消息。但是,如果未找到 TXT 记录,而是找到 A 记录,则 Messaging Server 5.2 之前的 dns_verify 版本将返回消息 "No error text available"
dns_verify 目前支持在无可用 TXT 记录时指定使用默认文本的选项。例如,以下 PORT_ACCESS 映射表显示了如何启用此选项:
PORT_ACCESS *|*|*|*|* $C$|INTERNAL_IP;$3|$Y$E \ TCP|*|25|*|* \ $C$[<msg_svr_base/lib/dns_verify.so \ ,dns_verify_domain_port,$1,dnsblock.siroe.com,Your$ host$ ($1)$ \ found$ on$ dnsblock$ list]$E * $YEXTERNAL
在此示例中,如果在对域 dnsblock.siroe.com 的查询中找到了远程系统,但没有可用的 TXT 记录,则系统将返回以下消息 "Your host a.b.c.d found on dnsblock list"