配置Sendmail服务器以防治垃圾邮件

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

本文介绍了一些在linux中广泛使用的防垃圾邮件技术,同时也介绍了通过配置邮件传送代理服务器Sendmail来抑制垃圾邮件的具体方法。

随着Internet的发展,电子邮件作为一种通信方式 逐渐普及。当前电子邮件的用户已经从科学和教育行业发展到了普通家庭中的用户,电子邮件传递的信息也从普通文本信息发展到包含声音、图像在内的多媒体信息。电子邮件的廉价和操作简便在给人们带来巨大便利的同时,也诱使有些人将之作为大量散发自己信息的工具,最终导致了互联网世界中垃圾邮件的泛滥。垃圾邮件问题已经极大地消耗了网络资源,并给人们带来了极大的不便。据中国互联网协会(ISC)2005年第一次反垃圾邮件状况调查显示,中国邮件用户2005年4月平均每人每天收到邮件16.8封,占收到邮件总数的60.87%。

垃圾电子邮件已成为人们最头疼的问题之一。在Windows操作系统中也许用户已经尝够了垃圾邮件带来的苦头,在Linux操作系统平台中也很难避免垃圾电子邮件给我们带来的骚扰,反击和过滤垃圾电子邮件是一件很重要的工作。

垃圾邮件防治策略

总体说来,抑制垃圾邮件,有如下几种方法:

1.SMTP用户认证

这是目前最常见、最简单并且十分有效的方法。在邮件传送代理(Mail Transport Agent,MTA)上对来自本地网络以外的互联网的发信用户进行SMTP认证,仅允许通过认证的用户进行远程转发。这样既能够有效避免邮件传送代理服务器为垃圾邮件发送者所利用,又为出差在外或在家工作的员工提供了便利。如果不采取SMTP认证,则在不牺牲安全的前提下,设立面向互联网的Web邮件网关也是可行的。

此外,如果SMTP服务和POP3服务集成在同一服务器上,在用户试图发信之前对其进行POP3访问验证就是一种更加安全的方法。目前,新浪等大型网站都相继采用了该功能,使得这些大型服务商的服务器被利用来发送垃圾邮件的概率大大降低。当前支持这种认证方式的邮件客户端程序比较出色的是Foxmail

2.逆向DNS解析

无论哪一种认证,其目的都是避免邮件传送代理服务器被垃圾邮件发送者所利用,但对于发送到本地的垃圾邮件仍然无可奈何。要解决这个问题,最简单有效的方法是对发送者的ip地址进行逆向名字解析,即通过DNS查询来判断发送者的IP与其声称的名字是否一致。例如,其声称的名字为pc.sina.com,而其连接地址为120.20.96.68,与其DNS记录不符,则予以拒收。这种方法可以有效过滤掉来自动态IP的垃圾邮件,对于某些使用动态域名的发送者,也可以根据实际情况进行屏蔽。

但是上面这种方法对于借助Open Relay的垃圾邮件依然无效。对此,更进一步的技术是假设合法的用户只使用本域具有合法互联网名称的邮件传送代理服务器发送电子邮件。需要指出的是,逆向名字解析需要进行大量的DNS查询。这样,在网络中将会出现大量的UDP数据包。

3.黑名单过滤

黑名单服务是基于用户投诉和采样积累而建立的、由域名或IP组成的数据库,最著名的是RBL、DCC和Razor等。这些数据库保存了频繁发送垃圾邮件的主机名字或IP地址,供MTA进行实时查询以决定是否拒收相应的邮件。简单地说,即数据库中保存的IP地址或者域名都应该是非法的,都应该被阻断。

但是,目前各种黑名单数据库难以保证其正确性和及时性,一般该名单的形成需要一段时间的积累。例如,曾经一段时期,北美的RBL和DCC包含了我国大量的主机名字和IP地址,其中有些是早期的Open Relay造成的,有些则是由于误报造成的。但这些迟迟得不到纠正,在一定程度上阻碍了我国与北美地区的邮件联系,也妨碍了我国的用户使用这些黑名单服务。

4.白名单过滤

白名单过滤是相对于上述的黑名单过滤来说的。它建立的数据库的内容和黑名单的一样,但是其性质是:库中存在的都是合法的,不应该被阻断。同样,该过滤方法存在的缺点与黑名单类似,也是更新和维护难以达到实时,一些正常的、不为系统白名单所收集的邮件有可能被阻断。从应用的角度来说,在小范围内使用白名单是比较成功的,可以通过在企业或者是公司的网关处通过一段时间内获取由内部发出的邮件的相关信息的办法来生成白名单。

5.内容过滤

即使使用了前面诸多环节中的技术,仍然会有相当一部分垃圾邮件漏网。对此种情况,目前最有效、最根本的方法是基于邮件标题或正文的内容过滤。其中比较简单的方法是,结合内容扫描引擎,根据垃圾邮件的常用标题语、垃圾邮件受益者的姓名、电话号码、Web地址等信息进行过滤。

更加复杂但同时更具智能性的方法是,基于贝叶斯概率理论的统计方法、支持向量机(SVM)方法、人工神经网络、Winnow等方法所进行的内容过滤,这些方法的理论基础是通过对大量垃圾邮件中常见关键词等采用上述方法进行机器学习后分析后得出其分布的统计模型,并由此推算目标邮件是垃圾邮件的可能性。这些方法具有一定的自适应、自学习能力,目前已经得到了广泛的应用。最有名的垃圾邮件内容过滤是Spamassassin,它使用Perl语言实现,集成了以上两种过滤方法,可以与当前各种主流的MTA集成使用。内容过滤是以上所有各种方法中耗费计算资源最多、最有效的办法,在邮件流量较大的场合,需要配合高性能服务器使用。

Sendmail是Red Hat Linux以及大多数类Unix操作系统的邮件传送代理,因此它是目前配置最广泛的邮件服务器,图1是Sendmail功能示意图。下面以Red Hat Linux使用的Sendmail为例,介绍应对垃圾邮件的几种具体方法。  

安装与启动Sendmail

Sendmail邮件服务器有两种安装方式:RPM包安装方式以及源代码安装方式。前者安装起来更为简单,并且Red Hat Linux的发行安装光盘中一般也附带了该安装包,下面分别对这两种安装方式的步骤进行介绍。

1..RPM包安装方式

首先检测系统是否已经安装该RPM包:

#rpm -qa |grep sendmail

如果没有安装,则将Red Hat Linux的第一张安装光盘放入光驱并挂接:

#mount /mnt/cdrom //挂接光盘

#cd /mnt/cdrom/RedHat/RPMS //进入RPMS目录

#rpm -ivh sendmail-8.12.8-4.i386.rpm //安装可执行文件

//安装生成Sendmail配置文件的m4工具包

#rpm -ivh m4-1.4.1-13.i386.rpm

插入Red Hat Linux的第三张安装光盘,安装如下软件包:

#mount /mnt/cdrom

#cd /mnt/cdrom/RedHat/RPMS

#rpm -ivh sendmail-cf-8.12.8-4.i386.rpm

#rpm -ivh sendmail-doc-8.12.8-4.i386.rpm

2.源码安装方式

首先取得最新版本的源代码,可以从http://www.sendmail.org/或ftp://ftp.sendmail.org/pub/sendmail/两个网站取得。

然后,将其存放在/usr/local目录下。并执行以下命令,解压缩:

#cd /usr/local

#tar -zxvf sendmail-8.13.4.tar.gz

这样就会在/home目录下建立一个sendmail-8.13.4目录:

/usr/local/sendmail-8.13.4/README

/usr/local/sendmail-8.13.4/src

/usr/local/sendmail-8.13.4/cf

/usr/local/sendmail-8.13.4/doc

接下来需要编译源代码。由于Sendmail自己带了一个编译程序Build,所以不用make命令:

#cd /usr/local/sendmail-8.13.4/src

#./Build install

安装好了该软件以后,可以使用以下命令来确认sendmail是否已经启动:

#pstree |grep sendmail

如果启动了Sendmail,那么这个命令将显示出其相关信息。否则将没有任何提示地回到命令行。如果没有启动,用户可以手动启动。如下面命令所示:

#service sendmail start

配置Sendmail抑制垃圾邮件

1.关闭Sendmail的Relay功能

所谓Relay功能就是指别人能用这台SMTP邮件服务器给任何人发信,这样别有用心的垃圾发送者就可以使用这台邮件服务器大量发送垃圾邮件,而最后别人投诉的不是垃圾发送者,而是这台服务器,因此必须关闭Relay。具体的方法就是,到Linux服务器的/etc/mail目录编辑access文件,去掉“*relay”之类的设置,只留“localhost relay”和“127.0.0.1 relay”两条即可。注意,修改access文件后还要使用命令使修改生效:makemap hash access.db < access。

2.在Sendmail中添加RBL功能

RBL(Realtime Blackhole List)是实时黑名单。

只要在Sendmail中加入RBL认证功能,就会使邮件服务器在每次收信时都自动到RBL服务器上去查实,如果信件来源于黑名单,则Sendmail会拒收邮件,从而使单位的用户少受垃圾邮件之苦。在Sendmail中添加RBL认证,需要对sendmail.mc添加以下内容:FEATURE(`dnsbl',`relays.ordb.org',`″Email blocked using ORDB.org - see ″')。

最后执行“m4 sendmail.mc>sendmail.cf”和“service sendmail restart”两条命令,使有关Sendmail的修改生效。

3.使用access数据库

访问数据库定义了什么主机或者IP地址可以访问本地邮件服务器和它们是哪种类型的访问。主机可能会列出OK、REJECT、RELAY或者简单的通过Sendmail的出错处理程序检测一个给定的邮件错误。主机默认列出OK,允许传送邮件到主机,只要邮件的最后目的地是本地主机。列出REJECT将拒绝所有的邮件连接。如果带有RELAY选项的主机将被允许通过这个邮件服务器发送邮件到任何地方。

/etc/mail/access.db是一个散列表数据库,是使用/etc/mail/access文件产生的,该文件为纯文本文件,其格式是“地址 操作”。

下面给出使用上述地址和操作字段,修改/etc/mail/access文件,从而生成/etc/mail/access.db数据库的操作步骤:

首先,使用vi编辑/etc/mail/access文件。

#vi /etc/mail/access

然后,添加如下内容。

samsung.com RELAY //允许samsung.com的域内所有主机使用服务器转发邮件

10.0.6.134 RELAY //允许IP地址为10.0.6.134的主机使用服务器转发邮件

192.168.10 RELAY //允许192.168.10网段内的主机使用服务器转发邮件

info.com REJECT //拒绝info.com的域内所有主机使用服务器

最后,存盘退出,并且使用makmap命令生成/etc/mail/access.db数据库即可。

#cd /etc/mail

#makemap hash access.db 4.打开Sendmail的SMTP认证功能

虽然可以在Sendmail中使用上述的access数据库来管理用户,使其合法地使用SMTP服务器进行邮件的传递。但是,由于用户的不断增多,以及很多用户都是在一个网段里面,如果单单依靠上述的access数据库很难有效地管理SMTP服务器的使用,那样会使得access数据库规模增大,管理混乱,从而造成效率降低,甚至出错。所以,非常有必要使用Red Hat Linux下自带的身份认证程序库,配合Sendmail服务器一起使用,对使用SMTP服务的用户进行身份认证,从而保证该服务的合法使用。

使用前要下载sasl库,该函数库提供了安全认证所需函数,下载地址是“ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/”,目前网上最新版本为cyrus-sasl-2.1.21.tar.gz。下面介绍使用该身份认证程序库配置带认证的sendmail的步骤:

首先检查系统是否已经安装了sasl相关的RPM包。

#rpm -a |grep sasl

一般系统都会默认安装,如果没有,则需要使用如下命令安装四个工具包:

#rpm -ivh cyrus-sasl-md5-2.1.10-4

#rpm-ivh cyrus-sasl-2.1.10-4

#rpm-ivh cyrus-sasl-plain-2.1.10-4

#rpm -ivh cyrus-sasl-devel-2.1.10-4

或者通过使用下载下来的源代码安装包,进行如下安装:

#cp cyrus-sasl-2.1.21.tar.gz /usr/local

#gzip cyrus-sasl-2.1.21.tar.gz

#tar -xvf cyrus-sasl-2.1.21.tar

#cd cyrus-sasl-2.1.21

#./configure -PRefix=/usr --enable-login --with-pwcheck --with-digest

#make

#make install

然后,查看sendmail与认证相关的配置。

#cat /usr/lib/sasl/Sendmail.conf

pwcheck_metod:pam

接着,需要编辑sendmail.mc,修改和认证相关的配置内容,删除每行的dnl即可。

#cd /etc/mail

#vi sendmail.mc

取消如下的几行注释:

//TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

//define(`confAUTH_

MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

再接着,使用m4命令生成cf文件。

#m4 sendmail.mc > sendmail.cf

然后,重新启动sendmail服务器。

#service sendmail restart

最后,测试sasl。

#sendmail -d0.1 -bv root | grep SASL

NETUNIX NEWDB NIS PIPELINING SASL SCANF STARTTLS TCPWRAPPERS

通过上述六个步骤的配置工作后,就成功地完成了对带SMTP认证的Sendmail邮件服务器的配置。

,