如何利用qmail防止垃圾邮件

12/3/2006来源:Qmail人气:6308

. 简介
II. 本文对象
III. 防垃圾邮件策略的一般问题
IV. 防垃圾邮件的特殊问题
V. 必备的基础
VI. 一般观点
"垃圾邮件无法阻止"
"防垃圾邮件是用户的责任"
"防垃圾邮件是系统管理员的责任"
其他
VII. 用户的选择
使用第三方实时的黑名单列表
使用自己建立的黑名单列表
使用标记的邮件
VIII.系统管理员的选择
从网络层考虑,拒绝可疑的主机通过你的SMTP服务发送邮件
利用SMTP进程拒绝已知的垃圾邮件发件人
使用qmail-smtpd 拒绝信头或信封有问题的邮件

IX. Other Resources
X. History
XI. Comments/Feedback

I. 简介

本文从多种角度阐述了防垃圾邮件的意义,并提出一些可行的方法防止在您的网络中出现大量的垃圾邮件。

II.阅读对象

本文适用于:

UNIX 系统管理员
qmail管理员
系统设计人员
偶尔关心垃圾邮件问题的用户

III. 一般问题

一般来说,我们把垃圾邮件定义为那些不经允许就擅自发送的大量的商业邮件,也就是电子邮件宣传品。垃圾邮件一般很难防范,因为发送者们总是有许多好用的工具来发送他们的垃圾邮件,轻而易举,而你往往可能很难找到那些发送者。另一方面,垃圾邮件总是伪装成普通邮件的样子,除非你打开它知道他的内容,否则光从邮件头短短的信息里,很难知道它是否是垃圾邮件。没有什么技术可以完全自动的检测一份邮件是否是你所要的,还是垃圾邮件。但是,我们可以用一些方法,来尽可能的减少你邮件系统的垃圾邮件。

关于上述问题的精确详尽的解释,建议你阅读 IETF Anti Spam Recomendations 。 David E. Sorkin 先生撰写了一份文档,名叫" Technical and Legal ApPRoaches to Unsolicited Electronic Mail",不妨一读.

IV. 特殊问题

任何处理过或正在处理防垃圾邮件工作的人,都会对以下几个问题印象深刻:

有必要为了减少垃圾邮件的数量而耗费大量的时间和资源吗?
防止垃圾邮件是系统管理员的责任还是最终用户的责任?
对一封可能的垃圾邮件,是应该立即丢弃呢还是作上标记继续转发?
如果你或你的系统管理员配置系统时出现错误,导致垃圾邮件的问题,作为管理员是否要为此负责?
你是否因该接受那些看上去内容合法,但是发件人出现在黑名单的那些邮件?
你是否因该接受那些回复地址、信封、发信地址不合法的邮件?

V. 减少垃圾邮件的必备基础

不正确的使用.qmail-default文件往往导致垃圾邮件的问题。

不要因为偷懒而仅仅使用 .qmail-default 的缺省设置,它会认为qmail系统的所有mailbox名都是合法的,而不管该mailbox是否真的存在。这一点可能被人利用,导致垃圾邮件的增加。典型的如:"sales@domain.com", "webmaster@domain.com"等相似的邮件地址。

注意,你的 .qmail-default是一把双刃剑,正确的设置也可以用来有效的防御垃圾邮件--拒绝那些无效的邮件地址。


及时报告收到垃圾邮件的情况。

类似SpamCOP这样的服务能使事情更有效率。具体请看资源列表。


培训教育

培训你的用户、朋友和所有关心垃圾邮件问题的人,告诉他们为什么要防止垃圾邮件,他们必须做什么。垃圾邮件发送者之所以会成功,有部分原因就是最终用户不重视也不知道如何防范垃圾邮件。

确认你的邮件系统设置正确

你的所有的邮件系统都要有合法的主机名和ip地址(最好是这样)。使得其他的系统能够正常解析你的主机名和地址。这样,你的邮件收发器能够得到标准的信息,包括错误消息。这样你就可以根据你收到的消息来判断系统设置是否合意,是否有必要对某些地址做防范。总之,使一切标准化是件好事。

VI.关于处理垃圾邮件的一般观点。

一下是一些关于处理垃圾邮件的一般观点。我们在这里抛出这些观点,是为了让读者注意到防止垃圾邮件时需要深思的问题。你可以注意到,在这些截然不同的观点中,寻找一个皆大欢喜的解决垃圾邮件的方案是非常困难的。

观点一:垃圾邮件永远无法禁止

持有这种观点的人认为:要想精确地鉴别一封email是否是垃圾邮件是几乎不可能的,即使你知道谁是垃圾邮件的制造者,你也很难追究他的法律责任。防止垃圾邮件是一件耗时耗力的事,而且可能导致正常邮件的丢失。

这一类用户通常无法忍受因为拒绝垃圾邮件而导致正常邮件丢失的事情发生。

观点二:防止垃圾邮件是最终用户的责任。

这种观点的持有者往往是系统管理员。他们认为既然鉴别垃圾邮件是如此之困难,就应该由最终用户来决定是否拒绝某些可疑的垃圾邮件。由于在邮件系统范畴下拒绝一封邮件可能会导致用户的信赖危机,因此系统管理员理所当然的把拒绝垃圾邮件的任务交给最终用户。让他们来决定什么地方的邮件应该被退回,什么邮件应该接受。而且,他们觉得有的用户可能乐意收到某些商业邮件列表,那么决定邮件生死的大事还是有别人来完成吧。

这一类用户认为,用户有责任为拒绝垃圾邮件的行为负责,即便因此丢失邮件,也纯粹是用户的个人行为。

观点三:“拒绝垃圾邮件是系统管理员的责任”

持有这种观点的人认为:既然垃圾邮件先要经过邮件系统,又有那么多得现成工具来防止垃圾邮件,那么,这么重要的事情理所当然应该由我们的邮件系统管理员来负责。往往许多执行系统管理行为的用户(不是指邮件系统管理员)和终用户在经历了无休止的垃圾邮件骚扰后,对这样的事情已经无能为力,特别是那些极讨厌垃圾邮件的系统管理员来说,他们已经忍无可忍,在经历了长期的痛苦后,开始抱怨起他们的邮件系统管理员来。

对于那些粗心大意的系统管理员(他们因不正确配置系统导致很容易被用来发送垃圾邮件),这样的观点显然有作用。最常见得就是:“open relay”问题,这种不负责任的设置可以使任何人轻易使用你的邮件系统来发送垃圾邮件,这种配置不当的管理有时导致垃圾邮件泛滥,因而,系统管理员显然有责任修改配置以使系统能够抵御垃圾邮件。

持有这种观点得人为了降低垃圾邮件的数量,甚至可以忍受部分正常邮件的丢失。对于系统管理员的小错误引起的正常邮件拒绝接受,他们还是能够接受。

其他观点

除了上述的几类观点之外,还有一些特殊的观点:

有的人认为,应该拒绝所有出现在各种黑名单列表里的发信人的邮件。但有另外一些人则认为,这些黑名单也未必总是准确公平,因为他们内含了各自的评判标准,完全依赖第三方的黑名单可能导致大量的合法邮件被拒绝接收。甚至更极端的用户则彻底反对第三方的黑名单列表,因为他们认为制造和维护黑名单列表的人在观点上有偏见,不公平。

还有的人认为,如果一封邮件没有的包含合法的格式,都应该被视作垃圾邮件,或者至少把它当作潜在的垃圾邮件来处理。常见的情况是,邮件没有合法的“From”地址或者信封格式有问题。如果对这种信件做回复的话会导致回复被退回。因为种种原因,许多垃圾信件都会有这种情况,因此,他们认为应该把这类的信件都按照垃圾邮件处理。而反对者认为,往往有很多原因导致正常邮件的格式有问题,因而不能一概而论。

VII. 用户的选择

这个部分主要讨论最终用户在防治垃圾邮件时的选择。阅读这段文章的前提是,用户具备邮件客户软件的配置知识(比如Outlook)并且有修改软件配置的需要。如果对任何一点感到疑惑的话,请询问你的系统管理员以寻求帮助。

从防治垃圾邮件的观点看来,最终用户的选择是有限的。比如,当一封邮件到达客户端时,通常认为邮件投递系统已经接受这个地址的邮件了,因此这时就需要最终用户来过滤这个邮件。可别小看过滤邮件的功能(有的时候又叫做基于规则的投递策略),它可是一个很强大的工具,不仅在防治垃圾邮件上有很大用处,在其他许多领域也有用武之地。比如我们在outlook中用到的“邮件规则”,可以实现指定邮件的转移、转发等自动化工作。在多数情况下,这是最终用户的最好选择。

UNIX平台下最广为人之的过滤工具就是procmail,看过《大教堂与集市》一文的人都知道,该文的作者就是procmail的作者。这个软件确实不错,它使用一种基于“处方”的脚本来处理邮件的转发、路由、拒绝等工作,具体的标准可以由你自己制定,非常灵活方便。其他平台下也有大量的邮件工具,并提供丰富的过滤功能,具体的使用依赖于你的操作系统和使用习惯。比较优秀的有:最新版本的Eudora, Outlook, Netscape Mail等等。

使用第三方的黑名单列表

procmail可以方便的让你使用第三方的黑名单列表。通过设置你的 .procmailrc 文件,使用 tblcheck和origip.pl程序,你可以对你任何想要处理的邮件做操作。以下是一个 .procmailrc 文件的简单范本,我们也把它称为“处方”。


MAILDIR=$HOME/mail
SPAMFOLDER=$MAILDIR/junkmail
LOGFILE=$MAILDIR/log

:0h
TCPREMOTEIP=| origip.pl
LOG="Remote IP: "$TCPREMOTEIP""

:0
* !^From.*myfriend@domain.com
* ! ? if [ -n "$TCPREMOTEIP" ];
then /usr/local/bin/rblcheck -q "$TCPREMOTEIP"; fi
{
LOGABSTRACT=all
LOG="Filter: RBL-filtered address: "$TCPREMOTEIP""
:0:
$SPAMFOLDER
}


上面的这个处方可以过滤任何出现在ORBS (Open Relay Blocking System), RBL (Realtime Blackhole list)和 DUL (Dial-up User List)列表里的邮件。


使用你自己的黑名单列表

有好几种方法来设置你的procmail,使之能够通过一个本地的黑名单文件来防御潜在的垃圾邮件,又能保证合法邮件顺利进入你的邮件系统。

这里,有一个很好的工具--SpamBouncer。它是一个procmail的扩展工具,很适合新手使用。你只要简单的按照软件的提示,就可以按照需要轻易完成本地黑名单列表的设置。

使用标记的邮件和特殊专有的电子邮件地址,你可以使用多种方法来标记邮件。

Tagged messages can mean several different things.
标记邮件意味着几件需要注意的事情。

一种比较有争议的作法是,用户在使用邮件投递服务器之前,必须先发送一份邮件到服务器,经过服务器的地址认证之后,该用户就可以使用这台服务器继续发送他的邮件了。这种方法在用户的发送地址有效期内是比较方便的,特别对于一些漫游用户,既能保障安全又不会太过麻烦。

如果是在黑名单上的地址发送邮件,就需要通过特殊的密码段,确保服务器不会将你的邮件当作垃圾邮件丢弃。如果代发邮件来自一些新闻组站点,那就在你的代发邮件中使用过期属性,以保证邮件投递能够正常执行。


以下是一些资源链接:

SpamBouncer has a mechanism for tagged messenging
Thomas Erskine wrote tms (Tagged Message Sender), which also does this.
Jason R. Mastaler has taken tms and extended the project into Tagged Message Delivery Agent.
Brett Randall has developed an avoidance technique especially for users participating in usenet and mailing list discussions.

VIII. qmail系统管理员的选择

这个部分的章节主要讨论系统管理员如何在系统范围内有效的阻止垃圾邮件现象。首先必须注意的是,你先要考虑前面提出的几类问题,并且心里有数,有把握解决。因为你的任何一个改动系统的行为,都有可能导致正常用户的收发邮件失效。

拒绝来自非法DNS服务器的SMTP请求

在诸如FreeBSD或者linux这样的类UNIX系统中,都包含了某些公用标准以阻止那些不符合网络协议的数据通过主机。典型的就是“基于主机名字访问控制”了。而这个机制主要是通过著名的tcp_wrapper包实现的。在某些情况下,DNS没有正确地配置,导致主机名被不正确的绑定在ip地址上,而这样的主机名在系统中却被认为是非法的。如果你是不幸的用户,使用了这样的主机发送邮件,就会被误认为是垃圾邮件而丢弃。

假如你是用inetd服务进程在freebsd里进行操作,并且你的 /etc/hosts.allow 含有这样的东东:

ALL : PARANOID : RFC931 20 : deny

你也可以使用ucspi-tcp软件包中的的tcpserver(推荐使用这种方法代替inetd处理邮件发送),如下:

tcpserver -p -v -x/etc/tcp.smtp.cdb -u1007 -g1007 0 25
qmail-smtpd 2>%26amp;1

使用你的SMTP守护进程拒绝已知的垃圾邮件
Using your SMTP daemon to reject "known" spammers

在 ucspi-tcp 包中有一个tblsmtpd工具,可以和包括qmail-smtpd这样的标准SMTP服务器一同使用。
package there is the rblsmtpd package, an alternative to the usual qmail-smtpd, and works with any SMTP server that runs under tcpserver.

如果你使用了 Life With Qmail这篇著名的文章来指导你的安装的话,你会有类似下面的教本代码。脚本位于:
/var/qmail/supervise/qmail-smtpd/run
内容:

#!/bin/sh
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`

exec /usr/local/bin/softlimit -m 2000000
/usr/local/bin/tcpserver -v -p -x /etc/tcp.smtp.cdb -c "$MAXSMTPD"
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp
/usr/local/bin/rblsmtpd /var/qmail/bin/qmail-smtpd 2>%26amp;1

需要注意的是,上面的脚本是用了更新版本的rblsmtpd,如果使用的是早期的qmail就必须也采用匹配版本的服务工具包。当然,升级你的软件包是值得的。

如果你仍在使用inetd守护进程,你也可以使用qmail在这样的环境下有效的进行垃圾邮件控制;或者你需要用SmallWorks的RBL软件来升级tcp_wrappers 。

如果你想在RBL里面使用ORBS数据库(或者其他可通过DNS访问的数据库),你可以打开 "-r" 开关来加入新的数据库:

rblsmtpd -rrelays.orbs.org -rrbl.maps.vix.com

Mike Silbersack 说 "如果你想要使用 *.mail-abuse.org 的漏洞列表, 你需要升级你的rblsmtpd,使他运行在具有A记录的域名上。"

使用qmail-smtpd拒绝带有非法信封和"From"头部的邮件
Using qmail-smtpd to reject mail with invalid envelope or From headers

这方面的解决方案仍然模糊不清,作为作者,他非常希望读者们能够贡献他们的经验和技能来改善推荐的方案。

有不少qmail补丁,宣称能够给出拒绝非法信封和"From"邮件还有可疑垃圾邮件的解决方案(比如,信封是空的或者主机没有合法的DNS)。注意到,这些补丁并不是qmail官方站点认可的标准件。

Nagy Balazs 写了一个补丁程序,可以识别出发送信封中的非法DNS域名。这样可以避免你收到一些无法回复的信件。

Erwin Hoffman 写了一个qmail-smtpd的补丁程序SPAMCONTROL,能够改进qmail的过滤能力并与RFC 2505兼容。他和 Noel Mistula 还写了一些脚本用来过滤附件和邮件主题(同样的是你也可以用procmail处理)。flame.org 站点的人们也写了补丁来处理邮件头的回退和标记功能。

Will Harris 写了一个补丁程序,使用新的控制文件,借助Perl表达式可以检查信封发送者的合法性。

Mark Delany 为qmail 1.01写的补丁也能通过检查发送者的信封匹配规则,接受和拒绝相应的邮件。

Jonathan McDowell 的 X-Spam-Warning 邮件头补丁程序可以在邮件头添加必要的告警信息,规则可以从PRBS、rss、RBL和DUL等库里匹配无须额外的程序。这也是所谓标记邮件的通常做法。那样,你的用户就可以自由选择如何标记邮件了。

Jay Soffian 也写了同样的程序,但是使用的是现有的QMAILQUEUE 补丁而不是去修改qmail的源代码。

Chris Johnson 的程序允许你通过日志记录投递信息,用于滥发邮件的分析。

不过也要注意的是,如果不慎的系统配置错误,回导致形如 "user%hosta@hostb" 邮件地址被邮件服务器的投递程序拒绝。具体信息请到 qmail.faqts 查看。

其实,很难非常有效的禁止你的系统用户通过邮件服务器向外滥发邮件。虽然有不少的方法可以让你的用户很难创建并向外发送垃圾邮件。这一点往往被系统管里员忽略,他们的精力都放在如何防范接受垃圾邮件的末枝细节上了。别忘了,只有防范和控制一起努力,才能够真正减少网络上大量的垃圾邮件。

Chris Johnson has written a patch for qmail called tarpit. Tarpitting is "the practice of inserting a small sleep in an SMTP session for each RCPT TO after some set number of RCPT TOs." This discourages a user from using a given system as a relay.

IX. 其他资源

实时的第三方漏洞解决方案。

ORBS
MAPS Realtime Blocking List
MAPS Dial-Up User List
RBLCheck script

第三方垃圾邮件通告服务

SpamCop
Abuse.net
More Links from abuse.net


通用邮件相关工具

qmail -
anti-spam section
ucspi-tcp - includes :
tcpserver
rblsmtpd
Procmail-
RBLCheck script
SpamBouncer
Tagged Message Sender (TMS)
tcp_wrappers
,