Red Hat Enterprise Linux 5.0服务器构建与故障排除
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第6章 电子邮件服务器的安装和故障排除

本章要点

● 电子邮件(E-mail)系统的组成及其相关协议。

● 电子邮件服务器的工作原理。

● Sendmail服务器安装和故障排除。

● 安装Postfix服务器。

电子邮件诞生于20世纪70年代初,它随着Internet应用的发展逐步成熟。除文字信息外,还可以传送声音、图片、图像及动画等多媒体信息。时至今日,电子邮件已成为人们喜爱的通信方式,并逐渐成为企事业单位加强信息交流和客户关系管理的重要手段。电子邮件更为我国的网民们带来了前所未有的便利。

在我国,电子邮件的应用迅速发展,免费邮箱注册的人数大幅飙升。同时,早期邮件系统所暴露的缺陷日益突出。随着用户数目的增加,系统性能急剧下降,系统不能方便地扩充,百万级的容量无法实现。在复杂的环境中,邮件队列不够健壮。导致系统不稳定,甚至丢失邮件;系统没有足够强的反垃圾邮件能力,导致垃圾邮件横行。系统结构不能适应当今的需求,安全性不高导致商业机密泄露;系统缺乏本地化,界面不友好。安装使用不方便,处理多字节(如中文)时经常出现问题,各种编码之间的转换比较困难等都是邮件系统存在的问题。打造一个适合内外信息交换的平台,以便于实现自主管理,使得员工和客户间便捷地沟通、交流与协作,因此如何选择一个好的邮件系统建立一个功能强大且性能稳定的邮件服务器成为企业关注的问题。

6.1 电子邮件系统的组成和相关协议

一个完整的邮件系统除了底层操作系统以外,还包括邮件传输代理(Mail Transfer Agent,MTA)、邮件分发代理(Mail Delivery Agent,MDA)和邮件用户代理(Mail User Agent,MUA)3个功能部分,如图6-1所示。

图6-1 邮件系统的功能结构图

邮件系统是一个比较复杂的过程,本节从邮件系统的几个功能模块入手剖析整个邮件系统的构架。

6.1.1 操作系统

操作系统作为整个邮件系统服务器的底层支持,其安全性至关重要。在这个方面,UNIX类操作系统先天足够安全且健壮。至于在具体应用中选择UNIX、BSD或Linux操作系统,可以根据具体情况处理。

6.1.2 邮件传输代理MTA

MTA是负责处理所有接收和发送邮件的程序,对于每一个外发的邮件,它决定接收方的目的地。如果目的地是本地主机,那么MTA将把邮件直接发送到本地邮箱,或者交给本地的MDA投递;如果目的地是远程主机,那么MTA必须先和远程主机通信。得到远程主机的许可后建立通信链路,使用简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)传递邮件。UNIX环境下可供选择的MTA程序很多,通过Internet的检验并被广泛使用的有Sendmail、Postfix及Qmail等。

1.Sendmail

Sendmail是使用最广泛的MTA程序之一,它是EricAllman于1979年在伯克利大学时所写,其成长一直伴随着UNIX的发展,是目前最古老的MTA程序。Sendmail的流行来源于其通用性,它的很多标准特性现在已经成为邮件系统的标配,例如虚拟域、转发、用户别名、邮件列表及伪装等。

然而,Sendmail也存在一些明显的不足。由于当初Internet刚刚起步,黑客也相对稀少,因而Sendmail的设计对安全性考虑很少。在大多数系统中都是以root权限运行,而且程序设计本身Bug较多,很容易被黑客利用,对系统安全造成严重影响。此外,由于早期用户数量和邮件数量都相对要小,Sendmail的系统结构并不适合较大的负载;否则需要进行复杂的调整。另外,Sendmail的配置保存在单一文件中,并且使用了自定义的宏和正则表达式。使得文件冗长晦涩、不易理解,被认为是对系统管理员的一大挑战。

由于这些缺陷,所以Sendmail一直被后门问题和安全漏洞所困扰。很明显,老的Sendmail已经不能适应新的应用环境。在经过多次程序修补后,EricAllman决定重新改写Sendmail。新版本的Sendmail不仅去除了绝大部分的漏洞,还增加了很多新功能,如垃圾邮件控制等。

为简化Sendmail配置文件的创建,Sendmail使用了m4宏预处理器。通过使用宏代换简化配置,为了保证Sendmail的安全,EricAllman在配置文件权限、执行角色权限和受信应用控制等方面做了大量的工作。但遗憾的是,由于Sendmail先天设计存在的问题,改版后的MTA仍有可能被侵入,所以仍然存在安全问题。加上它被设计为每隔一段时间才查看一次邮件队列,因此收发邮件的性能较低。

2.Postfix

Postfix是近来出现的另一个优秀的MTA程序,其设计吸取了前辈的优点,如Sendmail的丰富功能特点、Qmail的快速队列机制,以及Maildir的存储结构和独立的模块设计等。但是它的起步时间较短,随着在Internet上的广泛应用和检验正在不断成熟。

Postfix的主要特点是快速、安全、易于管理,同时尽量保持与Sendmail良好的兼容性。它同样采用模块化的设计,只需要一个真实用户来运行所有的模块。Postfix在系统安全方面考虑得很多,它的所有模块都以较低的权限运行,彼此分离。不需要setuid程序,甚至可以运行在安全程度很高的chroot环境中。即使被入侵破坏了某一个Postfix模块,也不能完全控制邮件服务器。Postfix最大的优点是配置上的简便性,它既不使用一个庞大复杂的配置文件,也不使用多个小的配置文件。

Postfix的配置主要使用main.cf和master.cf两个文本文件,使用中心化的配置文件和容易理解的配置指令。Postfix和Sendmail的兼容性非常好,甚至可以直接使用Sendmail的配置文件,这为想从Sendmail转换到Postfix的用户提供了便利。需要注意的是,Postfix是IBM资助下的开源软件,它遵循IBM的开放源代码许可证。用户可以自由地分发该软件进行二次开发,唯一的限制是必须将修改反馈给IBM公司。IBM的版权声明中表示,它可以随时取消用户使用和发布Postfix的权力。对于想要实现商业应用的企业,则需要密切关注相应的信息。

3.Qmail

Qmail是另一个UNIX系统下的MTA程序,它被专门设计用来替换现有安全性和性能都不太令人满意的Sendmail。其主要特点是安全、可靠和高效,并且设置简单;速度很快。经过Internet的长期检验,至今尚未发现任何安全漏洞,被公认为是安全的MTA程序。Qmail具有以下安全和可靠特性。

(1)采用标准的UNIX模块化设计方法重建整个系统构架,它由若干个模块化的小程序组成。并由若干个独立账户执行,每项功能都由一个独立的程序运行。每个独立程序由一个独立账户执行,而且不需要任何shell支持。

(2)完全没有使用特权的用户账号,只使用多个普通低级用户账号(无shell)将邮件处理过程分为多个进程分别执行。避免了直接以root用户身份运行后台程序,同时还禁止对特权用户(包括root及deamon等)直接发信。Qmail可以使用虚拟邮件用户收发信件,避免了系统用户的越权隐患。Qmail系统中只有必要的程序才是setuid程序,以减少安全隐患。迄今为止,拥有setuid的程序还未发现任何代码漏洞。

(3)Qmail的SMTP会话实时过滤技术(RBL实时处理机制)和SASL认证机制在与SMTP客户端或服务器交互时,实时地检测发信主机的IP及过滤邮件内容,并查杀病毒。一旦发现有问题立即拒收,将病毒或垃圾邮件直接丢弃在进入队列之前,从而极大地保护了用户的邮箱安全,降低了垃圾邮件的数量。同时有效地缩短了邮件服务器的响应时间,更大程度地提高了性能和安全防御能力。

Qmail使用先进、快速的信息队列及子目录循环来存储邮件消息,并且使用了比Mailbox更安全可靠的Maildir目录结构,以及经典的管道投递机制,从而具有极强的抗邮件风暴及抗DDoS攻击的能力。即使遭遇攻击也仅仅是降低邮件处理速度,而不会瘫痪甚至崩溃。在突然断电的状态下,仍能保存用户的信息而不丢失,并能保证系统稳定运行。

Qmail使用详细的信息递送日志,提供更多信息供管理员分析。它可以对同一个客户单位时间内连续发送的邮件数目或并发连接数目进行统计,一旦超出阈值,则应用防火墙规则拒绝为该客户提供服务或暂停正常响应,从而极大地降低了被DDoS攻击或由于客户大量发送垃圾邮件导致系统变慢或停止服务的可能性,有效杜绝了垃圾邮件攻击者或成为垃圾邮件被攻击对象。利用邮件服务器上已经存在的日志文件进行分析,可以自动智能化地将这些IP添加在“短时间内发送大量垃圾包的主机IP”中,从IP链路上杜绝传输。

Qmail并不遵循GPL版权发布,但是仍然与其他开源软件一样可以被自由下载、修改和使用。注意,为了保证Qmail的纯洁性,如果要公开发布自行修改的Qmail,必须经过作者同意。

以上3种MTA程序的性能对比如表6-1所示。

表6-1 Sendmail与Postfix、Qmail的对比

另外Linux下的邮件传输代理还包括Exim、Zmailer、theSunInternetMailServer(SIMS)和MDSwitch等其他商业版本,本章主要介绍Sendmail与Postfix。

6.1.3 邮件分发代理MDA

邮件分发代理MDA(Mail Delivery Agent)的主要功能就是将MTA接收的信件依照信件的流向(送到哪里)将该信件放置到本机账户下的邮件文件中(收件箱),或者再经由MTA将信件送到下个MTA。如果信件的流向是到本机,这个邮件代理的功能就不只是将由MTA传来的邮件放置到每个用户的收件箱,它还具有邮件过滤(filtering)与其他相关功能。

UNIX下常用的MDA软件包括Binmail、Procmail和Maildrop,除了具有本地投递的功能外,它们还增加了邮件过滤、黑白名单、自动分类和处理等功能,即能够根据用户要求对邮件头和邮件体的内容进行过滤,防止通过电子邮件传播病毒,并且帮助用户阻挡广告和宣传类的垃圾邮件,防止通过邮件对系统进行恶意攻击,帮助管理用户接收邮件。Binmail的系统命令为/bin/mail,该MDA程序简单。不需要进行配置,因而不能完全满足用户的需要;Procmail使用了类似于“处方”的用户配置文件,通过定制正则表达式实现邮件的分发。其缺点是不支持Maildir邮箱格式,并且编程语法太复杂,不易掌握和使用。与Procmail相比,Maildrop更新一些。除了支持传统邮箱格式,它还支持Qmail的Maildir邮件存储格式。并且其编程语言简单易懂,容易上手。因此,推荐使用Maildrop来实现邮件的分发功能。

6.1.4 邮件用户代理MUA

邮件用户代理MUA(Mail User Agent)的主要功能是接收邮件主机的电子邮件,并提供用户浏览与编写邮件的功能。邮件需要代理是由于通常客户端的计算机无法直接寄信,所以需要通过MUA传递信件。不论是送信还是收信,客户端用户都需要通过各个操作系统提供的MUA才能够使用邮件系统。Windows中的OutLook Express、Netscape中的mail功能与KDE中的Kmail都是MUA。

邮件用户代理MUA有基于客户端的,也有基于Web服务器的。无论是Windows下的Outlook和Foxmail,还是Linux下基于终端命令行的mail工具、图形文本终端pine、图形界面下的Kmail和Eudora等都是优秀的MUA软件。随着Internet的普及,越来越多的人喜欢使用基于浏览器的MUA程序。可以随时随地跨平台收发邮件,典型的代表有SqWebMail、OpenWebMail和iGENUS等。这些软件除了都支持流行的POP3和IMAP协议,还具有功能丰富、安全稳定和简单易用的特点。

6.1.5 电子邮件服务器协议及其相关命令

在邮件系统的组件之间发生的通信是由一系列标准和协议定义的,这些标准文件由Internet工程任务组(The Internet Engineering Task Force,IETF)维护并作为请求注解(Request For Comments,RFC)文档发布,RFC文档包含许多解释某一技术或协议的文件。

1.SMTP(Simple Message Transfer Protocol,简单邮件传输协议)

SMTP工作在TCP/IP层次的应用层,它采用Client/Server工作模式。默认使用TCP 25端口,提供可靠的邮件发送服务。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。

SMTP独立于特定的传输子系统,并且只需要可靠有序的数据流信道支持。它的重要特性之一是能跨越网络传输邮件,即“SMTP邮件中继”。通常,一个网络可以由公用Internet上TCP可相互访问的主机、防火墙分隔的TCP/IP网络上TCP可相互访问的主机,以及其他LAN/WAN中的主机利用非TCP协议组成。使用SMTP可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其他网络之间的邮件传输。在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关,域名服务系统(DNS)的邮件交换服务器可以用来识别出传输邮件的下一个IP地址。

SMTP的工作流程和原理如下。

(1)客户端使用TCP连接SMTP服务器的25端口。

(2)客户端发送HELO报文将自己的域地址告诉SMTP服务器。

(3)SMTP服务器接收连接请求,向客户端发送请求账号密码的报文。

(4)客户端向SMTP服务器传送账号和密码,如果验证成功,SMTP服务器向客户端发送一个OK命令,表示可以开始报文传输。

(5)客户端使用MAIL命令将邮件发送者的名称发送给SMTP服务器。

(6)SMTP服务器发送OK命令做出响应。

(7)客户端使用RCPT命令发送邮件接收者地址,如果SMTP服务器能识别这个地址,向客户端发送OK命令;否则拒绝这个请求。

(8)收到SMTP服务器的OK命令后,客户端使用DATA命令发送邮件的数据;

(9)客户端发送QUIT命令终止连接。

以上整个过程由发件方控制,有时需要确认多回。SMTP的工作流程如图6-2所示。

图6-2 SMTP的工作流程

基本SMTP命令如表6-2所示。

表6-2 基本SMTP命令

当发送MTA向接收MTA发送SMTP命令时,接收MTA返回特定的状态码使发送者了解命令是否正确执行。这些状态码按状态分组,其中第1位表示组含义(5 X X表示失败,4 X X表示临时问题,1 X X~3 X X表示成功),编码描述如下。

(1)211:帮助返回系统状态。

(2)214:帮助信息。

(3)220:服务准备就绪。

(4)221:关闭连接。

(5)250:请求操作就绪。

(6)251:用户不在本地,转寄到<Path>。

(7)354:开始邮件输入551,非本地用户。

(8)421:服务不可用552中止,存储空间不足。

(9)450:操作未执行,邮箱忙。

(10)451:操作中止,本地错误。

(11)452:操作未执行,存储空间不足。

(12)500:命令不可识别或语法错。

(13)501:参数语法错。

(14)502:命令不支持。

(15)503:命令顺序错。

(16)504:命令参数不支持。

(17)550:操作未执行,邮箱不可用。

(18)553:操作未执行,邮箱名不正确。

(19)554:传输失败。

与X.400(由ITU于1984年制定并于1988年修改,它是复杂且健壮的电子邮件协议。然而正是由于其复杂性,因此目前缺少厂家支持,所以远不如SMTP普及)相比,SMTP有许多优势,也有不足。

其优势如下。

(1)SMTP十分流行。

(2)许多厂商的平台都支持SMTP。

(3)SMTP便于实现、易于管理。

(4)SMTP地址方案简单。

其不足之处如下。

(1)功能不足。

(2)安全机制不如X.400。

(3)简单性限制了其使用。

2.POP3(Post Office Protocol 3,第3版邮局协议)

POP3工作在TCP/IP层次的应用层。它采用Client/Server工作模式。默认使用TCP 110端口,提供可靠的邮件接收服务。

POP3是检索电子邮件的标准协议,用于控制POP3电子邮件客户端和存储电子邮件的服务器之间的连接,POP3服务使用POP3协议将电子邮件从邮件服务器检索到POP3电子邮件客户端。该协议针对电子邮件服务器与电子邮件客户端之间的连接具有3种处理状态,即身份验证、事务处理和更新状态。

在身份验证状态下,连接到服务器的POP3电子邮件客户端必须先接受身份验证,然后才能检索电子邮件。如果电子邮件客户端提供的用户名和密码与服务器上的匹配,则用户通过身份验证,然后进入事务处理状态;如果不匹配,用户会收到错误消息,不允许连接和检索电子邮件。为防止对邮件存储区的破坏,客户端通过身份验证后,POP3服务会锁定用户的邮箱。用户通过身份验证后,由于邮箱已被锁定,所以除非该连接被终止;否则不能下载提交到邮箱的新电子邮件。同样,每次只允许一个客户端连接到邮箱,其他连接邮箱的请求都会被拒绝。

在事务处理状态下,客户端发送POP3命令,同时服务器会根据POP3协议接收命令并做出响应。如果服务器接收的任一客户端请求不符合POP3协议,就会被忽略并返回错误消息。

更新状态关闭客户端与服务器之间的连接,这是客户端发送的最后命令。连接关闭后,邮件存储区会更新,以反映用户连接到邮件服务器后的变化情况。例如,除非用户的电子邮件客户端配置成执行其他操作;否则在用户成功检索电子邮件后已检索的电子邮件将被标记成删除,然后从邮件存储区中删除。

POP3的工作流程和原理如下。

(1)客户端使用TCP协议连接邮件服务器的110端口。

(2)客户端使用USER命令将邮箱的账号传给POP3服务器。

(3)客户端使用PASS命令将邮箱的密码传给POP3服务器。

(4)完成用户认证后,客户端使用STAT命令请求服务器返回邮箱的统计资料。

(5)客户端使用LIST命令列出服务器中的邮件数量。

(6)客户端使用RETR命令接收邮件,接收一封后便使用DELE命令将邮件服务器中的邮件置为删除状态。

(7)客户端发送QUIT命令,邮件服务器将置为删除标志的邮件删除,连接结束。

基本POP3命令如表6-3所示。

表6-3 基本POP3命令

3.IMAP(Internet Mail Access Protocol Internet邮件访问协议)

IMAP于1986年在斯坦福大学被提出,1987年实现了IMAP2。目前最高版本为IMAP4,并于1994年被接受为Internet标准。IMAP4在RFC2060中描述,它使用TCP端口143。

IMAP是一个开放的标准,被设计为POP的超集。而POP是个地位牢固的开放邮件标准,有关IMAP4标准的详细信息请参见华盛顿大学的IMAP主页www.washington.edu/imap/。

尽管在日常使用中,IMAP的特性及对它的支持还没有压倒POP3。但其发展趋势已经显而易见,主要的产品厂商都计划支持IMAP4。

POP3是个存储转发的信息交换系统,POP3邮件服务器把消息发送给客户,并不在服务器上保存副本。而IMAP4是个客户端/服务器模式的应用,无论是POP3还是IMAP4,进来的邮件都存储在中央的邮件服务器上。用户使用遵循协议的邮件客户软件来连接到邮件服务器上,先进行身份验证,验证登录名和口令。然后用户才获得访问邮箱的权利,但是二者的共性仅限于此。

与POP3不同,IMAP4能以3种模式或者说消息传送范式来与客户交互,即在线、离线和断连方式。

(1)在线方式:邮件保留在Mail服务器,客户端可以对其进行管理,使用方式与WebMail相类似。

(2)离线方式:邮件保留在Mail服务器,客户端可以对其进行管理,与POP协议一样。

(3)断连方式:邮件的一部分在Mail服务器,一部分在客户端,与一些成熟的组件包应用(如LotusNotes/Domino)的方式类似。

在离线方式中,客户软件把邮箱存储在本地硬盘上以执行读取和撰写信息的操作。当需要发送和接收消息时,用户才连接服务器。对于那些长期奔波且很少停留在某个固定处所的人,他们通常使用离线方式,POP3是典型的以离线方式工作的模式。

相比之下,在线用户访问的邮箱始终是在邮件服务器上,但是邮箱仍然由客户软件处理。在线方式主要是由位置固定的用户使用,典型的是在快速LAN连接下进行,但是从远程拨号的功能较弱的计算机在这种模式下也可以工作得很好。有一些POP3服务器也提供了在线功能,但是它们没有达到IMAP4的功能级别。

断连方式提供了最大的灵活性。客户软件把用户选定的消息和附件复制或缓存到本地磁盘上,并把原始副本留存在邮件服务器上。缓存中的邮件可以被用户处理,以后用户重新连接邮件服务器时,这些邮件可以与服务器再同步。当前,该特性主要由邮件服务器实现,很少有客户软件支持断连方式。

无论是在哪一种操作系统上,使用IMAP4邮件客户软件的用户都可以读取和回复邮件。远程地把邮件存储在层次式的文件夹中,并且可通过IMAP4邮件主机同步客户文件。客户软件和服务器相互配合,允许过滤来自特定地址的邮件,还能够防止通过低速拨号链路下载大文件。用户可以查看主机上的邮件报文,如果需要,可以决定把其中哪些内容下载到远程连接的客户端上。用户还可以有选择地下载邮件,而不必非要下载邮件的附件。目前有一些国内的免费电子邮件站点提供IMAP4服务,如广州的www.21cn.com、四川的mail.777.net.cn和北京的btamail.net.cn等。只要我们到相应网址申请账号,设置客户端软件后即可体会到不同于POP3的IMAP新特性。

POP3提供了快捷的邮件下载服务,用户可以利用POP3把邮箱中的信下载到PC上进行离线阅读。一旦邮件进入PC的本地硬盘,就可以选择把邮件从服务器上删除,然后脱离与Internet的连接并选择在任何时候阅读已经下载的邮件。

IMAP同样提供了方便的邮件下载服务,让用户能进行离线阅读,但其能完成的却远远不只这些。首先它提供的摘要浏览功能允许用户在阅读所有的邮件到达时间、主题、发件人及大小等信息后才做出是否下载的决定,即不必等所有的邮件都下载完毕后才知道究竟邮件中的内容。如果根据摘要信息就可以决定某些邮件毫无用处,则可以直接在服务器中将其删除,而不必浪费宝贵的上网时间。

如果IMAP客户端软件完整支持IMAP4rev1(如Netscape4.5),那么还可以享受选择性下载附件的服务。举例来说,假如一封邮件中含有大小不同的5个附件。而其中只有两个附件需要的,则可以只下载那两个附件。这种服务非常适合于移动办公,除了可以从服务器接收新邮件到计算机外,还能够管理Outlook Express中的邮件,包括创建文件夹,移动、删除及修改邮件等各种功能,与服务商的邮件收发网站同步。这样即使出差外地,也可以登录邮件收发网站分类管理邮件,就好像在服务器上也安装了一套Outlook Express一样。

与POP比较,IMAP收邮件更加快速和节省硬盘空间,因为它每次都先从服务器收取新邮件的主题列表。用户需要阅读某个主题的新邮件时,才将整个邮件收取到自己的计算机上。这样能够拒收垃圾邮件,不会浪费时间与硬盘空间。虽然由于IMAP需要较昂贵的软件和硬件,一般的免费邮箱难以提供。但是由于服务功能好,加上专业邮箱服务商的支持,还是受到了用户的欢迎,正成为大企业用户的电子邮箱好管家。基本IMAP4命令如表6-4所示。

表6-4 基本IMAP4命令

6.2 电子邮件服务器的工作原理

6.2.1 电子邮件的工作流程

MUA发送邮件时只是简单地将邮件提交到一个运行电子邮件传输代理(Mail Transfer Agent,MTA)的服务器上。图6-3所示为一个简单的从发件人到收件人的电子邮件传输过程中的组件。MTA(如Sendmail或Postfix)在从一个系统发送邮件到另一个系统中完成了大量的工作,当接收一封电子邮件时,它首先决定它是否接收这封邮件。一个MTA默认接收本地用户的邮件,接收它知道如何转发的发往其他系统的邮件,接收允许中继到其他目的地的用户及系统或网络的邮件。一旦MTA接收了一封邮件,它将决定接下来如何处理这封邮件。或者将邮件发送到本地用户,或者将邮件发送给其他MTA。发往其他网络的电子邮件很可能被许多系统传递,如果MTA不能发送或独立转发邮件,则会将邮件退回发送者或通知管理员。

图6-3 电子邮件的工作流程

MTA服务器通常由Internet服务提供商管理。如果这封邮件的收件人是系统中的用户,MTA将邮件传递给邮件分发代理(Mail Delivery Agent,MDA)进行最终的发送。MDA会将邮件以文件形式存储在一个专用的数据库中。术语“邮件仓库”指的是持续的信息存储,而不是特指存储方式或存储位置。一旦邮件被保存在邮件仓库,它将一直保存直到收件人接收,接收者使用MUA获取邮件并阅读。MUA连接到可访问邮件仓库的服务器,这个服务器独立于传送邮件的MTA,并被设计为专为获取邮件提供访问。当服务器成功验证了用户,它将把用户的邮件传输给MUA。

由于Internet电子邮件的标准是开放的,所以有许多不同的软件包都能够处理Internet电子邮件。遵循相同标准的不同的软件包能够进行交互,而忽略程序的编写者或运行的平台。当建立一个邮件系统时,很可能SMTP协议与POP/IMAP协议分属不同的软件包,同时在一个完整的邮件系统的不同领域都有许多不同的软件可供选择。

6.2.2 电子邮件的历史

据电子邮件的发明人雷·汤姆林森(RayTomlinson)回忆,电子邮件的诞生是在1971年秋季(确切的时间已经无法考证)。当时已经有一种可传输文件的电脑程序,以及一种原始的信息程序。但两个程序存在极大的使用局限——使用信息程序的人只能给接收方发送公报,接收方的计算机还必须与发送方一致。

发明电子邮件时,汤姆林森是马萨诸塞州剑桥的博尔特·贝拉尼克·纽曼研究(BBN)公司的重要工程师。当时这家企业受聘于美国军方,参与Arpanet网络(Internet的前身)的建设和维护工作。汤姆林森对已有的传输文件程序及信息程序进行研究,研制出一套新程序。它可通过计算机网络发送和接收信息,再也没有了以前的种种限制。

虽然电子邮件是在20世纪70年代发明的,但它却在20世纪80年代才得以兴起。20世纪70年代的沉寂主要是由于当时使用Arpanet网络的人太少,网络的速度也仅为目前56 Kb/s标准速度的1/20。受网络速度的限制,那时的用户只能发送些简短的信息,根本不可能发送大量图片。到20世纪80年代中期,个人计算机兴起,电子邮件开始在电脑迷及大学生中广泛传播开来。到20世纪90年代中期,Internet浏览器诞生。全球网民人数激增,电子邮件被广泛使用。

使电子邮件成为主流的第1个程序是Eudora,是由史蒂夫·道纳尔在1988年编写的。由于Euroda是第1个有图形界面的电子邮件管理程序,所以它很快就成为各公司和大学校园内的主要使用的电子邮件程序。然而Eudora的地位并没维持太长时间,随着Internet的兴起,Netscape和Microsoft相续推出了它们的浏览器和相关程序。Microsoft及其他开发的Outlook使Eudora逐渐走向衰落。

在过去5年中,关于电子邮件发生的最大变化是基于Internet的电子邮件的兴起。人们可以通过任何联网的计算机在邮件网站上维护其邮件账号,而不是只能在家中或公司的联网电脑上使用邮件。这种邮件是由Hotmail推广的,Hotmail的成功使一大批竞争者得到了启发。很快电子邮件成为门户网站的必有服务,如Yahoo及Google等都有自己的电子邮件服务。

6.2.3 电子邮件地址的组成

E-mail像普通的邮件一样,也需要地址,它与普通邮件的区别在于它是电子地址。所有在Internet上有信箱的用户都有自己的一个或多个E-mai地址,并且它们都是唯一的。邮件服务器就是根据这些地址,将每封电子邮件传送到各个用户的信箱中。就像普通邮件一样,能否收到E-mai1,取决于是否取得了正确的电子邮件地址(需要先向邮件服务器的系统管理人员申请注册)。

@符号在英文中曾含有两种意思,即“在”或“单价”。前一种意思是因其发音类似于英文at,于是常被作为“在”的代名词来使用。如“明天早晨在学校等”的英文便条就成了“wait you@school morning”。除了at外,它又有each的含义,所以@也常常用来表示商品的单价符号。

美国的汤姆林森确立了@在电子邮件中的地位,赋予符号其新的意义。为了能让用户方便地在网络上收发电子邮件,汤姆林森发明了一种电子信箱地址的表现格式。他选中了这个在人名中绝不会出现的@符号并取其前一种含义,可以简洁明了地传达某人在某地的信息,@就这样进入了计算机网络。

汤姆林森设计的电子邮件的表现格式为“人名代码+电脑主机或公司代码+电脑主机所属机构的性质代码+两个字母表示的国际代码”,这就是现在我们所用电子邮件地址的格式。其中用“@”符号把用户名和电脑地址分开,使电子邮件能通过网络准确无误地传送。

一个完整的Internet邮件地址由以下两个部分组成,格式如下:

1oginname@full host name .domain name

即登录名@主机名.域名。

中间用一个表示“在”的@符号分开,符号的左边是对方的登录名;右边是完整的主机名,它由主机名与域名组成。其中,域名由几个部分组成,每一部分称为一个“子域”(Subdomain)。各子域之间用圆点“.”隔开,每个子域都会告诉用户一些有关这台邮件服务器的信息。

假定用户gblv的本地机(必须具有邮件服务器功能)为“dns.cug.edu.cn”,则其E-mail地址为gblv@dns.cug.edu.cn。它告诉我们,这台计算机在中国(cn),隶属于教育机构(edu)下的中国地质大学(cug),机器名是dns。在@符号的左边是用户的登录名gblv。

以上我们介绍的是Internet的域名地址的使用方法,Internet地址还有一种表示方法,即纯数字的IP地址。例如,计算机的域名地址为dns.cug.edu.cn,那么一定有一个IP地址(202.114.200.254)与之对应。可以在任何地方使用这个IP地址,就像使用其域名地址一样。

E-mai1地址通常比我们见到的简单的邮件地址复杂,这是因为如下原因。

(1)除Internet服务外,E-mai1还可以和许多非Internet系统的网络连接。

(2)E-mai1是要写给某个人,而不仅仅是一台机器。

6.2.4 电子邮件系统和DNS的联系

从Internet诞生以来,邮件服务器与DNS系统就是分不开的。如果要发电子邮件,必须通过邮件主机将信件送出;如果使用邮件主机寄信,又不想记忆主机所在的IP,那么必须使主机名称可以经由DNS系统找到你的IP;如果要提供一台Internet上的邮件主机,最好还是注册一个合法的主机名称,这样比较好记忆。

假设对应IP的主机名称已经成功地在Internet上完成合法注册,即有A(Address)这个DNS的标志后,即可架设邮件服务器。然而DNS系统本身还有其他功能可以支持邮件服务器,使邮件服务器更稳定并具有更佳的避免信件遗失的功能,所以出现了MX(Mail Exchanger)这个DNS标志。MX记录是邮件交换记录,它指向一台邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。例如,当Internet上的某用户要发一封信给user@mydomain.com时,该用户的邮件系统通过DNS查找mydomain.com这个域名的MX记录。如果MX记录存在,用户计算机就将邮件发送到MX记录所指定的邮件服务器上。MX的优点还有很多,最大的优点就是类似路由器的功能,我们可以称之为“邮件路由”。当有了MX记录之后,由于这是DNS的设置,所以当要传送邮件时可以直接依据DNS的MX记录直接将信件传送到设置有MX标志的邮件主机,而不需要询问邮件要寄到哪里。这个功能相当不错,可以使邮件快速且正确地送达目的地。此外由于可以设置多个MX,因此假设“此路不通”。即最先使用的MX邮件主机不通,那么信件会往下一台MX邮件主机传送。这样可以降低信件被退的几率,不过要特别强调的是MX一定要设置正确;否则信件永远在Internet上流浪。

一般来说,邮件地址的写法为“account@server.name”。当寄出这样一封信时,邮件主机会先到DNS系统查找server.name这个主机名称对应的IP与MX标志。若有MX标志,那么这封信会先送到该MX邮件主机,然后由该MX邮件主机将信件送达目的地(即server.name这台主机);如果有多台MX标志,那么这封信会送到最优先的MX邮件主机(也可能这台主机就是目的地主机),然后交给该主机处理;如果没有MX标志,那么在查到IP之后,信件才会慢慢送达该邮件主机。在送达邮件主机后,该主机则根据前面的账号将信件发送到各用户的邮件目录下。

6.3 Sendmail服务器安装和故障排除

6.3.1 安装Sendmail服务器

在RHEL 5中快速架设Sendmail邮件服务器的步骤如下。

(1)打开Sendmail设定文件:

# vi /etc/mail/sendmail.mc
dnl TRUST_AUTH_MECH('DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define('confAUTH_MECHANISMS', 'DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
DAEMON_OPTIONS('Port=smtp,Addr=127.0.0.1, Name=MTA')

将其修改为:

TRUST_AUTH_MECH('DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define('confAUTH_MECHANISMS', 'DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
DAEMON_OPTIONS('Port=smtp,Addr=0.0.0.0, Name=MTA')

(2)制作Sendmail设定文件:

# m4 sendmail.mc > sendmail.cf

(3)修改开机执行文件/etc/rc.d/rc.local,添加下面一行:

/usr/sbin/saslauthd -a shadow

(4)因为在RHEL 5中不会自动启动saslauthd这个服务,所以需手动启动:

# /etc/rc.d/init.d/saslauthd start

(5)启动Sendmail:

# /etc/rc.d/init.d/sendmail restart

(6)启动POP3:

修改文件/etc/dovecot.conf,然后添加下面一行:

protocols = pop3

启动dovecot服务,这样启动了POP3。

# /etc/rc.d/init.d/dovecot restart

(7)检查服务是否启动:

# netstat -tl

(8)检查防火墙是否开放POP3和SMTP的端口25及端口110:

# vi /etc/sysconfig/iptables

(9)设定主机名称:

# vi /etc/mail/local-host-names

添加自己的邮件主机名称,例如“kujaku.cn”。

6.3.2 提高Sendmail的防垃圾邮件能力

Sendmail是Red Hat Linux及大多数UNIX操作系统的邮件传输代理,因此它是目前配置最为广泛的邮件服务器。下面以RHEL 5使用的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)是实时黑名单,国外有一些机构提供RBL服务,常用的RBL服务器地址有relays.ordb.org、dnsbl.njabl.org、bl.spamcop.net、sbl.spamhaus.org、dun.dnsrbl.net和dnsbl.sorbs. net。可以到http://openrbl.org/http://ordb.org查询和删除RBL中的IP地址,RBL将收集到的专发垃圾邮件的IP地址加入其黑名单中。只要在Sendmail中加入RBL认证功能,就会使邮件服务器在每次收信时都自动到RBL服务器上查实。如果信件来源于黑名单,则Sendmail会拒收邮件,从而使用户少受垃圾邮件之苦。在Sendmail中添加RBL认证,需要在sendmail.mc中添加以下内容:

FEATURE('dnsbl','relays.ordb.org','"Email blocked using ORDB.org - see <http://ORDB.org/lookup/﹖host="$&{client_addr}">"')

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

3.使用SpamAssassin防止垃圾邮件

(1)配置过程。

SpamAssassin预设了许多默认规则,可以在/usr/share/spamassassin下找到。如果需要添加自己的规则,可以通过配置/etc/mail/spamassassin/local.cf文件实现。要在其中添加白名单(即可以确信不会发送垃圾邮件的发件人列表),设置代码如下:

whitelist_from_rcvd  people@basic.com
whitelist_from_rcvd  @ people.com

以上两条规则将people@basic.com邮箱和@people.com整个域添加到白名单中。下面把SpamAssassin与Sendmail(此处以Sendmail为例,Qmail和Postfix略有不同)整合在一起,简单的方法是使用procmail来调用SpamAssassin过滤器。在/etc/procmailrc文件中添加以下内容:

:0fw
| /usr/bin/spamassassin
:0
* X-Spam-Status: Yes
spam

如果希望SpamAssassin不检查大邮件,可以对其做出限制,添加下面一行:

:0fw * < 1000000 | /usr/bin/spamassassin

这段代码表示把邮件检查的大小限制在1000 KB以内。SpamAssassin还提供了一个专门的spamd后台守护进程,可以设置为系统启动时自动启动它。在Mail-SpamAssassin-3.-0.2/spamd/下有一个redhat-rc-script.sh脚本,将此脚本放入Red Hat的启动目录/etc/rc.d/init.d/下即可。同时,还需要对/etc/procmailrc文件做如下修改:

:0fw
| /usr/bin/spamc -s 100000

这样就可以通过控制spamd进程来调整过滤器的运行状态,配置完成后可以发邮件测试。如果看到在邮件头出现与SPAM检查相关的几项内容,表示SpamAssassin已经开始发挥作用。

除了设置内部的规则之外,SpamAssassin也可以访问其他外部的垃圾邮件过滤规则集。这样可以进一步增强其适用性,Chinese_rules.cf是用于垃圾邮件过滤系统SpamAssassin的中文垃圾邮件过滤规则集。由于以前没有中文的过滤规则集,所以SpamAssassin对中文邮件过滤的准确性不高。CCERT反垃圾邮件研究小组推出了第1个基于SpamAssassin的中文垃圾邮件过滤规则集Chinese_rules.cf,该规则集每周更新一次。把Chinese_rules.cf复制到/usr/share/spamassassin配置文档中的命令如下:

# wget -N -P /usr/share/spamassassin www.ccert.edu.cn/spam/sa/Chinese_rules.cf

(2)自动更新。

CCERT每周更新一次规则集,更新使用CCERT反垃圾邮件服务在6个月内处理过的垃圾邮件为样本,经常更新Chinese_rules.cf会使过滤效果更好。

Linux有一个称为“crond”的守护进程,主要功能是周期性地检查/var/spool/cron目录下的一组命令文件的内容,并在设定的时间执行这些文件中的命令。用户可以通过crontab命令来建立、修改或删除这些命令文件。例如,用crontab命令实现每周一08:35自动更新。首先建立一个文件,文件名为“myproject”(自己设定):

#crontab -e

文件内容如下:

35 08 * * 1 wget -N -P /usr/share/spamassassin www.ccert.edu.cn/spam/sa/Chinese_rules. cf;/etc/init.d/init-script restart

用vi编辑后存盘退出,使用crontab命令添加到任务列表中:

#crontab myproject

这样Linux服务器会在每星期一的8点35分自动下载Chinese_rules.cf更新规则。

SpamAssassin使用基于规则的垃圾邮件过滤技术,比分布式黑名单运行得更快,因为分布式黑名单需要查询网络服务器。对大多数用户而言,SpamAssassin能捕捉几乎所有的垃圾邮件,而不需要隔离合法邮件,它还提供了无限的调整和定制选项。

6.3.3 其他保护Sendmail的安全措施

Sendmail是使用简单邮件传输协议(SMTP)的邮件传输代理(MTA),它在其他MTA和电子邮件客户或分发代理之间传送电子邮件。虽然一些MTA能够加密彼此间的通信,但多数却不能。因此通过公共网络发送邮件被认为是一种带有固有不安全因素的通信方式,推荐用户使用以下方法解决问题。

1.限制“拒绝服务”攻击

由于电子邮件的性质,一个决意要攻击某台服务器的攻击者可以轻易地使用邮件来极大地增加服务器的系统开销,从而导致拒绝服务的攻击。通过设置 /etc/mail/sendmail.mc的以下目录的限度,这类攻击的有效性就会大受限制。

(1)confCONNECTION_RATE_THROTTLE:服务器每秒能够接收的连接数量,按照默认设置,Sendmail不限制连接数量。如果限度被设置并达到,以后的连接就会被延迟。

(2)confMAX_DAEMON_CHILDREN:服务器能够分出的子进程的最大数量,按照默认设置,Sendmail不限制子进程的数量。如果限度被设置并达到,以后的连接就会被延迟。

(3)confMIN_FREE_BLOCKS:必须为服务器保留的用来接收邮件的空闲块的最少数量,默认为100块。

(4)confMAX_HEADERS_LENGTH:消息头的可接收大小的最大限度(以字节为单位)。

(5)confMAX_MESSAGE_SIZE:单个消息的可接收大小的最大限度(以字节为单位)。

配置实例如下:

定义邮件大小最大为10 MB
define('confMAX_MESSAGE_SIZE', 10000000)
定义邮件最大收件者不可超过 25 位
define('confMAX_RCPTS_PER_MESSAGE',25)
隐藏邮件主机信息
define('confPRIVACY_FLAGS', 'goaway')
最大Header不可超过 16384 byte,避免黑客攻击
define('confMAX_HEADERS_LENGTH', 16384)
最大Client同时联机不可超过3个,避免DDoS
define('confCONNECTION_RATE_THROTTLE', 3)
伪装成Postfix ESMTP
define('confSMTP_LOGIN_MSG', 'Postfix current')
主机负载超过 8 时,拒绝SMTP联机
define('confREFUSE_LA', 8)
主机负载超过 4 时,不再Queue信息
define('confQUEUE_LA', 4)

2.NFS和Sendmail

不要把邮件脱机目录/var/spool/mail/放在NFS共享文件卷中,在NFSv2和NFSv3中系统对用户组群ID没有控制,因此多个UID相同的用户可以收到和阅读彼此的邮件。NFSv4使用Kerberos,而不是使用基于UID的用户认证,所以在NFSv4中不会出现这种情况。

3.只使用电子邮件程序访问Sendmail服务器

要防止本地用户利用Sendmail服务器上的漏洞,最好是让邮件用户只使用电子邮件程序来访问该服务器。邮件服务器中的shell账号不应该被允许,/etc/passwd文件中的所有用户shell都应该被设置为/sbin/nologin(根用户可能是个例外)。

6.3.4 配置基于Sendmail的Webmail

利用浏览器通过Web方式来收发电子邮件的服务或技术(Webmail)不需借助邮件客户端,可以说只要能上网就能使用,极大地方便了用户收发邮件。对于不能熟练使用邮件客户端或者在网吧不便使用邮件客户端的用户来说,Webmail更是必不可少的选择。另外,设定POP3 Server及SMTP Server等对于某些使用者来说也有点困难,这时Webmail可显示其优势。

Webmail允许使用者通过浏览器连接到Web服务器,而由Web服务器上的程序负责收信/送信。使用者直接通过browser执行读信/写信等操作,信件其实并不在使用者的计算机上。因此无论使用者用的是哪一台计算机,只要可以连接网络,都可以读到之前与新收到的信件。另外一个优势是Webmail不容易因为读取含有病毒的档案而导致中毒,更不会发生个人邮件系统中毒后寄送大量病毒信件给其他亲朋好友的情况。

Open Webmail的优点是良好的使用接口、多国语言(目前支持30多种语言)、多组图示、多组布景、依个人喜好自订背景、在线更改密码(必须记得原来的密码)、与Outlook接近的多媒体信件显示能力、多种字集内码自动转换、支援HTML信件编写、拼写检查(英文字典字数可能不足)、支持草稿暂存、可动态切换写信字集内码、POP3外部邮件、邮件规则(可建立过滤规则)、信件搬移/复制/删除/下载功能、信箱建立/重整/更名/删除/下载功能、通信簿、全文检索,以及自动清除垃圾箱N天以上邮件等。

Open Webmail的缺点是由于它是使用Perl脚本语言编写的,所以执行速度可能不如PHP。Open Webmail主页提供许多格式的软件,应根据Linux发行版本选择合适的软件包。本书使用rpm格式并设定一台Linux服务器的域名为“cao.net”,IP地址为“192.168.1. 253”,邮件主机为“mail.cao.net”。需要安装的软件有cyrus-sasl、dovecot、httpd、perl-Text-Iconv、perl-suidperl、perl-Compress-Zlib和perl-CGI-SpeedyCGI。其中sendmail +cyrus-sasl+ dovecot+httpd+perl在安装系统时一起安装,其他软件需要下载:

#wget  http://openwebmail.com/openwebmail/download/redhat/rpm/release/openwebmail-2.51-1.i386.rpm
#wget  http://distro.ibiblio.org/pub/linux/distributions/startcom/ML-4.0.4/updates/i38 6/perl-suidperl-5.8.5-12.1.1.i386.rpm
#wget  http://mirrors.ircam.fr/pub/dag/packages/perl-Text-Iconv/perl-Text-Iconv-1.4-1.2.el4.rf.i386.rpm
#wget  http://ftp.belnet.be/packages/dries.ulyssis.org/redhat/el4/en/i386/RPMS.dries/p erl-CGI-SpeedyCGI-2.22-1.2.el4.rf.i386.rpm

安装配置Web邮件服务器的步骤如下。

1.安装软件

# rpm -ivh perl-5.8.5-12.1.i386.rpm
# rpm -ivh perl-CGI-SpeedyCGI-2.22-1.2.el4.rf.i386.rpm
# rpm -ivh perl-Compress-Zlib-1.34-1.2.el4.rf.i386.rpm
# rpm -ivh perl-suidperl-5.8.5-12.1.1.i386.rpm
# rpm -ivh perl-Text-Iconv-1.4-1.2.el4.rf.i386.rpm
# rpm -ivh openwebmail-2.51-1.i386.rpm

2.初始化配置文件

运行命令:

# /var/www/cgi-bin/openwebmail/openwebmail-tool.pl --init

根据屏幕提示修改配置文件,如图6-4所示。

图6-4 根据屏幕提示修改配置文件

3.修改配置文件

#cd /var/www/cgi-bin/openwebmail/etc/

使用编辑器手工建立dbm.conf文件,主要包括以下内容:

dbm_ext           .db
dbmopen_ext       .dbm
dbmopen_haslock   no

4.重新初始化配置文件

# /openwebmail-tool.pl -init

系统询问是否发送站点,包括选择不发送(单击“n”按钮),如图6-5所示。

图6-5 重新初始化配置文件

5.修改其他文件

修改/var/www/cgi-bin/openwebmail/etc/openwebmail.conf文件中字段:

# domainnames auto
更改为:
domainnames cao.net      #更改为自己定义的域名#
default_language en
更改为:
default_language zh_CN.GB2312          #更改为简体中文版界面#
把/var/www/cgi-bin/openwebmail/etc/defaults/openwebmail.conf文件中的字段:
smtpserver 127.0.0.1
更改为:
smtpserver 192.168.1.253 #更改SMTP服务器的地址#
authpop3_server localhost
更改为:
authpop3_server 192.168.1.253 #更改POP3服务器的地址#
把/var/www/cgi-bin/openwebmail/etc/defaults/dbm.conf文件中的字段。
dbmopen_ext none
更改为:
dbmopen_ext .db
dbmopen_haslock no
更改为:
dbmopen_haslock yes
smtpserver 192.168.1.253 #添加SMTP服务器的地址#

6.再次运行openwebmail-tool.pl文件

在浏览器中输入 http://localhost/var/www/cgi-bin/openwebmail/openwebmail.pl,打开如图6-6所示的Open Webmail登录界面。

图6-6 Open Webmail登录界面

7.设置基本工作界面

图6-7所示为中文Open Webmail的工作界面。

图6-7 中文Open Webmail的工作界面

其中的基本设置选项允许改变多个设置以适合邮寄需求。假如初次使用Open Webmail,则应当先进入设定控制界面,而不是直接到收件箱。

Open Webmail的使用非常简单,在首页的“帮助”中有200页的常见操作信息。中文Open Webmail的帮助界面如图6-8所示。

图6-8 中文Open Webmail的帮助界面

如果无法在帮助中找到所需要的答案,或在安装Open Webmail时需要帮助,则连接到下列网站。

(1)Official Open Webmail Site。

(2)SourceForge.net Webmail Forum。

(3)FreshMeat.net Open Webmail Forum。

8.定期清理Open Webmail日志文件

日志文件都会随着时间的推移和访问次数的增加而迅速增长,因此必须定期清理日志文件以免造成磁盘空间的不必要的浪费。同时增加了网管员查看日志所用的时间,因为打开小文件的速度比打开大文件的速度要快。要使系统重新使用空的日志文件,可以执行以下操作。

修改文件/etc/logrotate.d/syslog,在文件尾添加以下内容:

/var/log/openwebmail.log {
        postrotate
            /usr/bin/killall -HUP syslogd
        endscript}

9.加速邮件服务器

(1)针对Open Webmail速度慢的缺点,可以使用SpeedyCGI来加速:

# rpm -ivh perl-CGI-SpeedyCGI-2.22-1.2.el4.rf.i386.rpm

然后执行speedy_convert命令,这个命令会自动设定已安装的Open WebMai,使其以SpeedyCGI方式执行。

(2)启动HTTP资料压缩传送。

从Open WebMail 2.10版本开始,新增支持HTTP资料压缩传送功能。对于通过调制解调器联机或是使用PDA上网的用户来说,这个功能能够大幅度地降低传输网页数据所需的时间。要让这个功能正常运行,必须在Open Webmail上安装Compress-Zlib模块,方法如下:

#wget  http://openwebmail.com/openwebmail/download/packages/Compress-Zlib-1.33.tar.gz
tar -zxvf Compress-Zlib-1.33.tar.gz
cd Compress-Zlib-1.33
perl Makefile.PL
make ;make install

此时在登录Open Webmail时会出现“HTTP资料压缩传送”选项,这样可以加速邮件服务器运行速度。

6.3.5 增强Webmail邮件服务器的安全

由于使用了Apache Web服务器,所以要为其配置SSL库,这些库提供了SSL需要的功能。在查看电子邮件时需要有一个安全的Web服务器来保护密码,以及所有流到Web服务器的信息,这样可以避免别有用心的人通过监听会话来获取密码。图6-9所示为SSL加密后的Open Webmail首页,注意浏览器位置栏和右下角的安全标志。

图6-9 SSL加密后的Open Webmail首页

早期的Open Webmail版本存在一些安全隐患,所以要使用2.3以后的版本,安装过程相同。另外由于Open Webmail功能强大,包含系统信息也比较多,所以必须要了解到这个软件有可能会产生一些安全漏洞。建议随时注意Open Webmail的官方网站http://openwebmail.com/,其中不定期地会有一些安全技术公告,可以帮助Web邮件服务器使用更加安全。

6.3.6 监控Sendmail的日志文件

利用AWStats统计并分析邮件服务器日志文件:

yum -y install awstats
cd /usr/local/awstats
/usr/local/awstats/tools/awstats_configure.pl

修改配置文件/etc/awstats/awstats.mail.config.file,添加以下内容:

LogFile="perl /usr/share/awstats/tools/maillogconvert.pl standard < /var/log/ maillog |"
LogType=M
LogFormat="%time2 %email %email_r %host %host_r %method %url %code %bytesd"
LevelForBrowsersDetection=
LevelForOSDetection=0
LevelForRefererAnalyze=0
LevelForRobotsDetection=0
LevelForWormsDetection=0
LevelForSearchEnginesDetection=
LevelForFileTypesDetection=
AllowToUpdateStatsFromBrowser=0
SiteDomain="xxx.xxx.xxx"
HostAliases="192.168.1.1 localhost 127.0.0.1"
DirData="/var/lib/awstats"
DirIcons="/awstatsicons"
ShowMenu=1
ShowMonthStats=HB
ShowDaysOfMonthStats=HB
ShowDaysOfWeekStats=HB
ShowHoursStats=HB
ShowDomainsStats=0
ShowHostsStats=HBL
ShowAuthenticatedUsers=0
ShowRobotsStats=0
ShowEMailSenders=HBML
ShowEMailReceivers=HBML
ShowSessionsStats=0
ShowPagesStats=0
ShowFileTypesStats=0
ShowFileSizesStats=0
ShowBrowsersStats=0
ShowOSStats=0
ShowOriginStats=0
ShowKeyphrasesStats=0
ShowKeywordsStats=0
ShowMiscStats=0
ShowHTTPErrorsStats=0
ShowSMTPErrorsStats=1

要产生日志文件,使用如下命令:

/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=mail.config > /dev/ null 2>&1

测试网站http://IP/awstats/awstats.pl?config=mail,结果如图6-10所示。

图6-10 Sendmail日志分析界面

6.3.7 Sendmail常见故障排除

1.解决邮件服务器问题的思路

(1)使用日志文件诊断问题。

通常检查邮件服务器问题最快速的方法是重新启动邮件服务器、测试端口情况或者密码。如果验证(用户和密码)出现问题,可以监视POP3服务器登录的用户,使用如下命令:

# tail -f /var/log/messages | grep username
Username是用户名称

如果怀疑密码错误,可以使用过滤输出,进一步检查登录失败的原因:

# tail -f /var/log/messages| grep 'Login failed'

为了查看邮件被退回的原因或者其他连接问题的原因,可以查看Sendmail的日志文件:

# tail -f /var/log/maillog | grep bob2

(2)使用Telnet诊断MTA问题。

为解决SMTP邮件服务器问题,可以远端登录在邮件服务器本身身的端口(25),而且尝试使用SMTP记录直接为服务器传达一个信息。当一个信息在机器上被递送,而且是一个好方法来诊服务器问题、排除或者证明使用者/客户端或者SMTP-Auth的问题,产生的输出将会给出答案。

2.问题解决实例

(1)如何增加新的邮件使用者?

在Linux的作业环境中,利用useradd或通过webmin新增使用者,即可以用系统账号加上@邮件服务器名称,如john@mail.cosa.org..cn来收发E-mail。

(2)安装sendmail后如何确定已经正常运行?

利用Linux系统光盘或rpm安装完成后,利用下列指令查看:

#rpm -qa|grep sendmail

如果出现sendmail版本号,代表已经安装完成.再利用下列指令查询sendmail是否已在运行:

# service sendmail status

出现下列状态,代表sendmail已正常运行:

# sendmail(pid 169716911686)正在执行中…

(3)如果使用拨接的方式寄送邮件。为什么邮件异常并常被退回?

必须设定sendmail的本机为伪装正常运行且将relay指向拨接ISP的SMTP host,这是在m4文件中多个重要的参数设定:

define('SMART_HOST','mail.yourisp.net')dnl
MASUERADE_AS(yourisp.net)dnl
FEATURE('allmasuerade')dnl
FEATURE('masuerade_envelope')dnl

(4)如何route所有寄给未知使用者的邮件到一个统一的账号?

在m4文件增加下列定义:

define('LUSER_RELAY','local:someuser@your.domain')dnl

然后执行m4命令转换为sendmail.cf:

m4 /etc/sendmail.mc >/etc/_sendmail.cf
 mv -f /etc/_sendmail.cf /etc/sendmail.cf

重新启动系统sendmail应可生效。

(5)sendmail似乎运行正常,但是使用者利用收信软件连上服务器发信时却无法连接?

问题可能是POP3的daemon没有安装或没有启用。为检查是否安装IMAP RPM(IMAP-4.5-4)使用命令rpm - imap。如果没有任何响应,则表示没有安装,必须从系统光盘安装后才能正常。试着从客户端再连接一次,如果还是有问题,必须检查/etc/xinetd.d的目录。查看ipop3d文件,确定最后一行为disable = no.(预设为yes),如有,重启动xinetd:

# service xinetd restart

应该可以解决问题。

(6)如何管理邮件队列(Mail Spool)?

邮件在发送前会保存在/var/spool/mueue的目录下,这个目录称为“邮件队列”。可使用mail命令来查询,该命令与# sendmail -bp一样,会显示邮件的ID、文件大小、在队列中停留的时间、寄件者,以及邮件目前状态等。下列范例显示一封有问题的邮件暂留在队列的信息:

$ mail
Mail ueue (1 reuest)
---ID-- --Size-- ------Time----------------Sender/Recipient----------RAA00275
124 Wed Dec 9 17:47 root
(host map: lookup (tao.linux.org.au): deferred)
terry@tao.linux.org.au

(7)如何强迫发送sendmail中邮件队列(message ueue)中的信件?

可使用命令mail或webmin中的sendmail组态.……邮件队列查看是否有信件在队列中。如果有,可以利用在邮件队列下的“Flush Mail ueue”按钮或命令/usr/sbin/sendmail强迫发送信件。

(8)对方一直没有收到邮件,应该如何解决?

可以查看/var/log/maillog或是mail,以确认邮件服务器是否传递完成。

sendmail与DNS有密切的关系,如果DNS无法降析收件者的地址,它会暂存到mail中。直到地址的解析正确才会发送,所以要确认DNS的设定要正确。如果有别名,要记录在本地端网域(sendmail.cw)中检查POP3或是IMAP是否已经激活。

(9)如何使sendmail使用SSL加密的方法发送和接收邮件?

sendmail可以配置为使用SSL加密发送和接收邮件,配置步骤如下。

● SSL需要服务器拥有一个有效的证书,可以从公司获取公司签过名的证书,也可以在本地生成:

# cd /usr/share/ssl/certs
# make sendmail.pem

在提示后输入对应的国家、省和组织的名字。

然后在/etc/mail/sendmail.mc中取消几行的dnl注释,样例如下:

...
define('confCACERT_PATH','/usr/share/ssl/certs')
define('confCACERT','/usr/share/ssl/certs/ca-bundle.crt')
define('confSERVER_CERT','/usr/share/ssl/certs/sendmail.pem')
define('confSERVER_KEY','/usr/share/ssl/certs/sendmail.pem')
...
DAEMON_OPTIONS('Port=smtps, Name=TLSMTA, M=s')dnl

…表示和SSL没有关系的配置文件内容,此处省略。

重新启动Sendmail:

# service sendmail restart

Sendmail可以在默认端口465上开启安全的SMTP服务,如果需要启动安全的IMAP/POP服务,可以启动如下服务:

# chkconfig pop3s on
# chkconfig imaps on

安全POP的默认端口是995,安全IMAP的端口是993,

现在服务器可以使用安全的方式发送和接收邮件,注意开启邮件客户端发送接收邮件上的安全选项。

(10)如何确定Sendmail程序在监听哪一块网卡(NIC)?

可以通过netstat命令查询Sendmail当前监听的IP地址和端口,默认情况下,Sendmail会监听TCP的25端口。通过netstat和grep命令来可以查看到Sendmail运行在哪一个地址之上及所监听的25端口:

#  netstat  -an | grep :25 | grep tcp

会显示下面的输出:

tcp 0 0127.0.0.1:25 0.0.0.0:* LISTEN

在上例中,sendmail只运行于127.0.0.1之上。

如果要列出每一个网络接口的地址配置情况,以root身份执行命令:

ifconfig -a

ifconfig命令的-a选项可以列出所有网络接口的详细信息。关于netstat、grep,以及ifconfig命令的更多信息,请分别查阅其man文档。

(11)使用procmail来过滤邮件仍然收到一些可疑的信件,应该如何处理?

试用如下命令:

# chmod 0640 ./.procmailrc

(12)在domain中发送一封邮件,却传回如下错误消息:

“config error. mail loops back to me (MX problem?)”

需要确定local machine,网域名(domain name)和所有在class w中的别名(aliases),这是让sendmail知道那个domains及主机应该要接收邮件,然后确定在宏组态文件(m4)中有下列行:

FEATURE('use_cw_file')dnl

在本地端网域(Cw)增加domain name及local machine的名称及其所有别名,每一个名称自成一行,最后重新启动sendmail。

(13)尝试设定mailertable,但是删除sendmail.cf中mailertable一行的批注时,显示以下的错误消息:

“/etc/sendmail.cf: line 133: readcf: map
mailertable: class dbm not available”

首先不建议直接编辑视为执行文件的sendmail.cf文件,除非非常清楚更改的目的。编辑宏组态文件/etc/sendmail.mc,然后使用m4来产生sendmail.cf文件。问题在于使用mailertable的数据类型不存在,要解决这个问题,必须编辑/etc/sendmail.mc,搜寻下列字符串:

FEATURE(mailertable, 'dbm /etc/mail/mailertable')dnl

然后修改为如下所示:

FEATURE(mailertable, 'hash -o /etc/mail/mailertable')dnl

重新用m4编译一次,重新启动sendmail.cf file即可。

(14)通常使用.forward文件,但收到如下错误消息:

: “sh: procmail not available for sendmail programs”

按照下列方式:

# cd /etc/smrsh
# ln -s /usr/bin/procmail

重新启动sendmail应该可以解决。

(15)为什么sendmail程序在在系统开机时就挂了?

可能是网络问题,如果网络设定有主机名称,而Linux无法查看到该名称,则这台主机会暂停一直等到DNS lookup网络超时,然后显示登录画面,以root的身份登录,检查问题来自何处。假如主机已经连上网络并且使用DNS server,检查/etc/resolv.conf文件中的主机设定是否正确,询问系统管理员设定值是否正确。假如主机已经连接网络,但未使用DNS server,或即将要成为DNS server,则必须编辑/etc/hosts文件中包含hostname和IP address,使lookups运行正常。/etc/hosts文件中的格式如下列范例所示:

127.0.0.1 localhost localhost.localdomain
192.168.200.1 mymachine mymachine.mynetwork.net

mymachine为主机名称。

(16)安装Sendmail后如何查看Sendmail的运行情况?

可以从syslog的设置看出系统运行中的重要的信息,一些比较重要的信息输出到/var/log/messages文件中,发送邮件的记录会被保存在/var/log/mail log文件中。系统管理员可以根据这些文件来查询相关记录统计或查找系统问题,其中使用syslog记录的messages文件中包括root登录的信息,以及用户多次登录失败的尝试等对系统安全相当重要的信息等。因此系统如果遭受攻击或sendmail有问题,可查看maillog找出一些端倪。因此对安全性要求更高的系统,可以尝试将syslog发送到另一台主机上,或者转存到其他存储媒体中。

系统会使用newsyslog定期检查syslog输出的messages和maillog文件,将较旧的数据压缩保存为备份文件,如maillog.1及maillog.2等。

(17)无法发送出邮件,显示以下错误信息:

“Can't create tr解决方法:cript file ./xfg92Eew01340: Permission denied” except the root

问题可能来自sendmail的版本,某些版本会发生这个问题。一种解决方法是chmod在'/var/spool/mueue'的权限为777:

# chmod 777 /var/spool/mueue

虽然采用这种方法可以解决问题,但是有可能会影响到安全性。如果邮件服务器是正式上线,则不建议采取这个方法。

(18)无法发送邮件到他人的机器?显示“reject=550 Relaying denied”消息。

这是因为Sendmail设定relay的功能是默认值(disabled),因此需要编辑/etc/mail/access,添加允许relay的IP地址。

(19)mail server只能在公司内部使用,如果员工出差或是下班后开放公司的Sendmail给不在公司内部上网员工的话,如何兼顾安全?

因为sendmail relay的限制使得收发邮件只可以在某些特定的范围,通常是在企业内部网中。如要开放给在外面的同事使用,SMTP认证是不错的选择。

(20)如何防范对方不知道已经中毒的邮件?

同时在客户端及服务器端加装具有邮件扫描功能的防毒软件。

(21)在使用Sendmail时如何控制接收、拒绝或者转发新的邮件?

/etc/mail/access文件用来接收,拒绝或者转发新进邮件。这个文件控制用户、完整域名或完整的IP子网访问。第1列指定了用户、域名或者自网;第2列指定下面值之中的一个:

REJECT
    rejects the sender with a general purpose message
OK
    accepts mail for receipt (not relay)
RELAY
    accept mail for relaying
DISCARD
    discard the message completely (harsher than reject)
ERROR:550 your message
    like REJECT but returns with your specific message

下面是一个/etc/mail/access文件的示例:

user@spammer.org REJECT
spammers.net     REJECT
204.168.23       REJECT
192.168          OK
virtualdomain.com    RELAY
user@domain.com      ERROR:550 mail discarded
nobody@          ERROR:550 bad name

修改过这个文件后,执行下面操作使得修改生效:

# make -C /etc/mail
# service sendmail restart

(22)Sendmail产生了大量的TLS错误?

Sendmail使用的TLS库中有一个问题会引发这个问题,一个绕过它的方法是在/etc/mail/sendmail.mc文件中添加下面一行,在定义no default msa的FEATURE行后:

DAEMON_OPTIONS('Port=smtp, M=S')dnl

然后在/etc/mail目录下使用make命令重新构造sendmail.cf文件。

(23)Sendmail可以在没有DNS下使用吗?

没有DNS或者DNS受限制的情况下,需要执行如下操作来使用sendmail。

● 设置一个SMARTHOST。

确保需要的主机可以被解析,既可以在/etc/hosts或者DNS中解析,也可以替换性地指定一个IP地址。

在/etc/mail/sendmail.mc中添加一行,类似:

define('SMART_HOST','name.of.smart.host')dnl

● 因为系统隐含地限制了解析功能,所以要接收未知域的信件,则在/etc/mail/sendmail.mc中添加一行,类似:

FEATURE(accept_unresolvable_domains)dnl

● 确保ServiceSwitchFile(默认在/etc/mail/service.switch)有类似如下内容:

aliases files
hosts files

● 设置提交代理来忽略DNS在/etc/mail/sendmail.mc中添加一行,类似:

define('confDIRECT_SUBMISSION_MODIFIERS','C')

在/etc/mail/sendmail.mc中添加一行,类似:

FEATURE(accept_unresolvable_domains)dnl

完成上面的改变后,在/etc/mail目录中输入make,重新生成submit.cf和sendmail.cf守护进程,也需要重启:

# service sendmail restart

6.4 安装Postfix服务器

6.4.1 安装过程

1.停止所有sendmail进程

#killall sendmail(停止所有Sendmail进程)
sendmail: no process killed
# rpm -ivh postfix-2.2.5-3.rhel4.i386.rpm

2.启动dovecot服务

# service postfix start
Starting postfix: [ 确定 ]
# service dovecot start
启动Dovecot Imap: [ 确定 ]

现在可以使用邮件服务器发送邮件,还不能下载邮件。因为新版Red Hat Linux中的dovecot代替了imap软件包,但是还没有绑定POP3和POP协议。下面修改配置文件/etc/dovecot.conf:

#protocols = imap imap3
protocols = imap imap3 pop3 pop3s
auth_passdb =
更改为:
auth_passdb = shadow

然后重新启动dovecot服务:

# service dovecot restart
停止Dovecot Imap: [ 确定 ]
启动Dovecot Imap: [ 确定 ]

3.修改Postfix邮件服务器的配置文件

更改如下行:

#myhostname = host.domain.tld

为:

myhostname = mail.cao.net

更改如下行:

#mydomain = domain.tld

为:

mydomain = cao.net

更改如下行:

#myorigin = $mydomain

为:

Myorigin = cao.net

更改如下行:

#inet_interfaces = all

为:

Inet_interfaces =all

更改如下行:

#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mail. $mydomain, www.$mydomain, ftp.$mydomain

为:

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mail. $mydomain,www.$mydomain,
ftp.$mydomain

更改如下行:

#mynetworks = host

为:

mynetworks = host

4.端口测试

# telnet mail.cao.net 25(测试25端口)
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.cao.net ESMTP Postfix
quit
221 Bye
Connection closed by foreign host.
# telnet mail.cao.net 110(测试110端口)
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK dovecot ready.
quit
+OK Logging out
Connection closed by foreign host.

5.安装防范病毒软件

安装和配置F-Prot Antivirus软件包过程如下:

Wegt http://files.f-prot.com/files/linux-x86/fp-linux-ws.rpm

安装F-Prot Antivirus软件包前启动SpamAssassin服务器:

# service spamassassin start(启动SpamAssassin服务器)
Starting spamd:                                       [  确定  ]
# rpm -ivh fp-linux-ws.rpm(安装F-Prot Antivirus软件包)

升级F-Prot Antivirus病毒库:

# cd /usr/local/f-prot/tools/
# ./check-updates.pl(升级命令)
***************************************
* F-Prot Antivirus Updater            *
***************************************
Nothing to be done...

安装和配置MailScanner软件包过程如下:

Wegt http://www.sng.ecs.soton.ac.uk/mailscanner/downloads.shtml
# mv MailScanner-4.50.5-1.rpm.tar.gz /tmp/source/(移动文件到/tmp/source/目录中)
# cd /tmp/source/(进入source目录中)
# tar -zxvf MailScanner-4.50.5-1.rpm.tar.gz(MailScanner解压过程)
# cd MailScanner-4.50.5-1(进入MailScanner软件解压目录)
# ./install.sh(执行MailScanner软件的安装命令)

更改incoming、quarantine两个目录相关用户和组的使用权限如下:

# chown postfix.postfix /var/spool/MailScanner/incoming
# chown postfix.postfix /var/spool/MailScanner/quarantine

修改/etc/MailScanner/目录下的MailScanner.conf文件。

将如下行:

Run As User =
Run As Group =

更改为:

Run As User = postfix
Run As Group = postfix

将如下行:

Incoming Queue Dir = /var/spool/mqueue.in
Outgoing Queue Dir = /var/spool/mqueue

更改为:

Incoming Queue Dir = /var/spool/postfix/hold
Outgoing Queue Dir = /var/spool/postfix/incoming

将如下行:

MTA = sendmail

更改为:

MTA = postfix

将如下行:

Virus Scanners = none

更改为:

Virus Scanners = f-prot

将如下行:

Always Include SpamAssassin Report = no

更改为:

Always Include SpamAssassin Report = yes

将如下行:

Use SpamAssassin = no

更改为:

Use SpamAssassin = yes

将如下行:

Required SpamAssassin Score = 6

更改为:

Required SpamAssassin Score = 4

将如下行:

SpamAssassin User State Dir =

更改为:

SpamAssassin User State Dir = /var/spool/MailScanner/spamassassin

将如下行:

SpamAssassin Install Prefix =

更改为:

SpamAssassin Install Prefix = /usr/bin

将如下行:

SpamAssassin Local Rules Dir =

更改为:

SpamAssassin Local Rules Dir = /etc/MailScanner

修改/etc/postfix/目录下的header_checks文件,新增以下行:

/^Received:/ HOLD

修改/etc/postfix/目录下的main.conf文件,将如下行:

#header_checks = regexp:/etc/postfix/header_checks

更改为:

header_checks = regexp:/etc/postfix/header_checks

停止Postfix服务器,因为启动MailScanner服务时会自动启动Postfix服务器。启动MailScanner服务器和设置开机时自动启动:

# service MailScanner start
  Starting MailScanner daemons:
  incoming postfix:                                              [  确定  ]
outgoing postfix:                                               [  确定  ]
 MailScanner:                                                   [  确定  ]
# chkconfig --level 33 MailScanner on

6.病毒检测

从网站(http://www.eicar.org/anti_virus_test_file.htm)下载一个测试病毒文件eicar.com。编写一封测试邮件(附件中带上eicar.com文件)。系统检测到邮件病毒,如图6-11所示。

图6-11 检测到病毒

查看maillog日志,确认日志中是否存在以下相近的信息:

Jan  8 12:11:08 mail MailScanner[9199]:Virus Scanning:F-Prot found virus EICAR_Test_File
Jan  8 12:11:08 mail MailScanner[9199]: Virus Scanning: F-Prot found 1 infections
Jan  8 12:11:08 mail MailScanner[9199]: Infected message E73EE13C07C.07685 came from
Jan  8 12:11:08 mail MailScanner[9199]: Virus Scanning: Found 1 viruses
Jan  8 12:11:09 mail MailScanner[9199]: Requeue: A9D6413C085.39DDE to 6414713C089
Jan  8 12:11:09 mail MailScanner[9199]: Uninfected: Delivered 1 messages

如出现以上的日志信息,代表F-Prot Antivirus + MailScanner-4.31.6-1架设已经成功。

如果希望邮件服务器每次启动都能自动运行,可以用服务设置功能。以root权限运行以下命令:

#chkconfig -level 345 dovecot on

然后重新启动系统,这样系统会启动邮件服务。

6.4.2 保护Postfix服务器

1.通过阻止IP地址或主机名方式来拒收邮件

在main.cf配置文件中使用以下行定义网络地址:

# mynetwork=192.168.1.0/24

表示只有客户端的IP地址符合mynetwork参数定义的范围才接受该客户端的连接请求,转发该邮件。

2.在Postfix中添加RBL功能

RBL(Realtime Blackhole List)是实时黑名单,国外有一些机构提供RBL服务把收集到的专发垃圾邮件的IP地址加入其黑名单中。只要在Postfix中加入RBL认证功能,就会使邮件服务器在每次收信时都自动到RBL服务器上查实。如果信件来源于黑名单,则Postfix会拒收邮件,从而使用户少受垃圾邮件之苦。通常在mail.cf中添加以下内容:

map_rb1_domains=mail-abuse.org
smtp_client_restrictions=reject_map1_rb1

其中第1行设置需要联系RBL列表的所有主机,第2行设置需要进行应用的限制。然后存盘,重新启动Postfix服务器。

3.隐藏内部邮件地址

如果网络中有发送邮件的中央邮件服务器,则可以为主机提供许多服务,那么必须隐藏邮件地址的主机名称部分。例如,在一台名为“pc-joe.yourcompany.com”服务器上有一个用户名称是“joe”。当joe通过Postfix网关发送邮件时,其地址显示为“joe@pc-joe. yourcompany.com”。对外隐藏内部主机名称是一个很好的安全策略,相关配置文件的选项为:

masquerade_domains = $mydomain
masquerade_exceptions = root

第1行表示隐藏所有域,通过变量$mydomain来完成,这意味着joe@pc-joe. yourcompany.com以后作为joe@yourcompany.com.出现。上面的第2行表示不隐藏root用户。

4.使用header_checks & body_checks

要使用header_checks或body_checks,在main.cf文件中手工建立:

header_checks = regexp:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks

5.拒绝找不到DNS资源记录中MX/A记录的主机的邮件

这个机制是查询寄件者的主机地址,然后使用这个地址执行DNS查询。一般垃圾邮件发送者会随意造一个主机名称以企图蒙骗过关,对于这种手法只要使用一个设定即可。在main.cf中添加如下行:

smtpd_sender_restrictions = reject_unknown_sender_domain

6.4.3 自动监控Postfix邮件服务器

自动监控Postfix邮件服务器的日志文件。

1.安装日志分析软件mailgraph

# yum install rrdtool rrdtool-perl perl-File-Tail
# cd /tmp
#wget http://people.ee.ethz.ch/~dws/software/mailgraph/pub/mailgraph-1.12.tar.gz
#tar xvfz mailgraph-1.12.tar.gz
#cd mailgraph-1.12
#mv mailgraph.pl /usr/local/bin/mailgraph.pl
#mv mailgraph-init /etc/init.d/mailgraph

修改配置文件/etc/init.d/mailgraph:

# #!/bin/sh
# $Id: mailgraph-init,v 1.42005/06/13 11:23:22 dws Exp $
# example init script for mailgraph
# chkconfig: 2345 82 28
# description: mailgraph postfix log grapher.
# processname: mailgraph.pl
# pidfile: /var/run/mailgraph.pid
PATH=/bin:/usr/bin
MAILGRAPH_PL=/usr/local/bin/mailgraph.pl
MAIL_LOG=/var/log/maillog
PID_FILE=/var/run/mailgraph.pid
RRD_DIR=/var/lib
IGNORE_LOCALHOST="--ignore-localhost"
case "$1" in
'start')
      echo "Starting mail statistics grapher: mailgraph";
      nice -19 $MAILGRAPH_PL -l $MAIL_LOG -d \
              --daemon-pid=$PID_FILE --daemon-rrd=$RRD_DIR $IGNORE_LOCALHOST
      ;;
'stop')
      echo "Stopping mail statistics grapher: mailgraph";
      if [ -f $PID_FILE ]; then
              kill 'cat $PID_FILE'
              rm $PID_FILE
      else
              echo "mailgraph not running";
      fi
        ;;
  *)
        echo "Usage: $0 { start | stop }"
        exit 1
        ;;
  esac
  exit 0

修改启动程序权限:

#chmod 755 /etc/init.d/mailgraph
#chkconfig --levels 235 mailgraph on
#/etc/init.d/mailgraph start

移动CGI脚本:

#mv mailgraph.cgi /var/www/IP或者域名/cgi-bin/

修改CGI脚本:

my $rrd = '/var/lib/mailgraph.rrd'; # RRD数据库路径
my $rrd_virus = '/var/lib/mailgraph_virus.rrd'; # Virus RRD数据库路径

修改CGI程序权限:

#chmod 755 /var/www/www.example.com/cgi-bin/mailgraph.cgi

浏览日志网页http://IP或者域名/cgi-bin/mailgraph.cgi,如图6-12所示。

图6-12 日志网页

2.自动向管理员发送日志分析文件

yum install postfix-pflogsumm

修改/etc/logrotate.conf配置文件,添加以下内容:

/var/log/maillog {
    missingok
    daily
    rotate 7
    create
    compress
    start 0
}

修改配置文件/etc/logrotate.d/syslog:

/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot. log/var/log/cron {
    sharedscripts
    postrotate
      /bin/kill -HUP 'cat /var/run/syslogd.pid 2> /dev/null' 2> /dev/null || true
    endscript
}

为以下内容:

/var/log/messages /var/log/secure /var/log/spooler /var/log/boot.log /var/log/cron {
    sharedscripts
    postrotate
      /bin/kill -HUP 'cat /var/run/syslogd.pid 2> /dev/null' 2> /dev/null || true
    endscript
}

建立一个脚本/usr/local/sbin/postfix_report.sh:

#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
gunzip /var/log/maillog.0.gz
pflogsumm /var/log/maillog.0 | formail -c -I"Subject: Mail Statistics" -I"From:
pflogsumm@localhost" -I"To: postmaster@example.com" -I"Received: from www.example.com
([192.168.0.100])" | sendmail postmaster@example.com
gzip /var/log/maillog.0
exit 0

注意:黑体字部分请修改为设定的管理员邮箱地址。

赋予执行权限:

chmod 755 /usr/local/sbin/postfix_report.sh

在Windows系统中有一个计划任务的功能,可以根据用户的要求定时完成某项功能,这对网管员十分有用。Linux中也有类似功能,由cron来执行。cron是一个守护进程(daemon),它能提供定时器功能。只要用户建立定时器设置文件,即可用其完成计划任务。

(1)检测cron服务是否开启:

#chkconfig -list|grep crond

(2)若未开启,可以执行下面命令:

#ntsysv

在crond服务选项加上*(用空格键),然后重新启动系统,这样系统会启动cron服务。

(3)建立定时器设置文件,文件名为“mytype”(自己设定):

#crontab -e

(4)文件内容如下:

0 9 * * * /usr/local/sbin/postfix_report.sh &> /dev/null

用vi或其他编辑器存盘退出。

(5)使用crontab命令添加到任务列表中:

#crontab -u mytype

这样用户在每天的9点会自动收取日志文件到管理员邮箱,内容如图6-13所示。

图6-13 管理员收到的日志文件内容

6.4.4 Postfix的常见问题

Postfix的常见问题如下。

(1)如何设置Postfix把一个用户的邮件重定向到另一个用户?

Postfix提供一种方法能够把邮件目标从本地的收件用户重定向到其他本地或远程邮件账户,/etc/postfix/aliases文件中包含了名称和指定的新目标和新地址。

每行的格式如下:

name: value1, value2, valueN

name是在本地机器内接收邮件的本地地址;value是本机的用户名或者一个其他域的email地址,可以设置一个或多个值。

下面的例子可以把root的邮件重定向给一个普通用户:

root: user1

将把root账户的邮件目标定向到user1账户,Postfix也允许把邮件重定向到外部邮件服务器:

root: user1@example.com

将把root账户的邮件目标定向到example.com域中的user1账户。

要使修改生效,保存文件并且运行下面命令:

newaliases

可以为本地账户发送邮件并且在重定向的账户信箱中查找该邮件来测试设置是否生效。

在命令行中运行man newaliases命令来获得更多关于newaliases的信息。

(2)如何配置Postfix备份邮件服务器?

当主服务器不能使用时,Postfix可以作为备份或者第2邮件服务器。作为一个备份邮件服务器,Postfix可以存储邮件,并且当主服务器可用时将邮件转发给主邮件服务器。这个配置要求Postfix已经安装,并且配置为可以接受外部发过来的邮件。在下面的例子中,将primarymailserver.example.com改为主邮件服务器的域名。

● 用编辑器打开/etc/postfix/main.cf,追加想转发的主邮件服务器的域名:

relay_domains = $mydestination primarymailserver.example.com

● 编辑/etc/postfix/main.cf,追加想转发的主邮件服务器的名字给smtpd_recipient_ restrictions命令。

保证这条命令包含有check_relay_domains:

smtpd_recipient_restrictions = permit_mynetworks check_relay_domains

● 启动或者重启Postfix:

/sbin/service postfix start
/sbin/service postfix restart

可以使用telnet测试备份邮件服务器是否转发邮件到主邮件服务器。

(3)如何限制Postfix邮件服务器中用户的邮箱大小?

设置Postfix邮箱限制,以至于强制用户邮箱的使用都在限制之下,这将防止用户无限制占用服务器的硬盘空间。默认的Postfix邮箱限制是51200000个字节,为了调整这个值,需要在/etc/postfix/main.cf文件中配置mailbox_size_limit配置项,0表示不限制邮箱大小。mailbox_size_limit限制值不能小于message_size_limit配置项的值;message_size_limit用于指定一封邮件的最大值,单位是字节,其中包括信头信息默认值是10240000。

(4)如何在线安装postfix?

Postfix的RPM包在系统安装光盘上,可以通过rpm命令来安装。如果系统已经在RHN注册,并且升级服务有效,可以使用下面的命令来安装:

up2date postfix

安装Postfix以后,在红帽企业版Linux 5中可以使用redhat-switch-mail或redhat-switch-mail-nox把系统默认使用的邮件传输代理从Sendmail切换到Postfix。

通过以下命令可以验证已经安装的Postfix包:

$ rpm -q postfix

(5)在红帽企业Linux 5中如何配置Postfix使用SASL(Simple Authentication Security Layer)和TLS(Transport Layer Security)?

使用Postfix和SASL允许一个电子邮件管理员来强制来自一个不信任位置的用户使用用户名和密码来做身份认证,增加TLS可以在传输过程中加密密码。这是保护邮件服务器不被垃圾邮件发送者利用的一种主要方法,同时也能保护用户账号信息。注意本文只涉及使用SMTP(发信)连接,参看知识库中的其他文章来了解如何使用TLS连接POP和IMAP(收信)。假设Postfix已经被配置为不使用SASL和TLS来收发信件,否则请查看知识库的其他文章来了解如何配置Postfix。

(6)如何设置SASL?

为了在Postfix加入SASL支持,必须安装cyrus-sasl包:

up2date cyrus-sasl

安装后,必须为每个邮件用户创建SASL用户,可以使用saslpasswd2命令。注意所有的SASL用户应该已经作为正常系统用户存在,SASL密码也应该与其系统账号密码一样:

[root@localhost ~]# saslpasswd2-c frank
Password:
Again (for verification):

SASL用户记录在数据库文件/etc/sasldb2中,这个文件的属组必须改成“postfix”:

chown :postfix /etc/sasldb2

创建用户后需要更新两个配置文件,/usr/lib/sasl2/smtpd.conf文件应该如下所示:

[root@localhost ~]# cat /usr/lib/sasl2/smtpd.conf
pwcheck_method: auxprop

(7)如何设置TLS?

为了使用TLS,必须创建一个SSL证书链。假设系统有下面证书文件:

/usr/share/ssl/certs/key.pem
/usr/share/ssl/certs/cert.pem
/usr/share/ssl/certs/cacert.pem

为Postfix配置TLS和SASL,需要在/etc/postfix/main.cf文件中添加如下行:

#### SASL bits ####
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain =
smtpd_sasl_security_options=noanonymous
## The following allows anyone who is in mynetworks, or anyone who can authenticate, to send mail through this server
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination,permit_mynetworks check_relay_domains
smtpd_delay_reject = yes
## this is necessary for some email clients
broken_sasl_auth_clients = yes
#### TLS bits ####
smtpd_tls_auth_only = no
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
## Location of key, cert and CA-cert.
## These files need to be generated using openssl
smtpd_tls_key_file = /usr/share/ssl/certs/key.pem
smtpd_tls_cert_file = /usr/share/ssl/certs/cert.pem
smtpd_tls_CAfile = /usr/share/ssl/certs/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_exchange_name = /var/run/prng_exch
tls_random_source = dev:/dev/urandom
tls_smtp_use_tls = yes
ipv6_version = 1.25

然后重载或者重启Postfix。注意在老版本的Postfix中需要重启程序。在Postfix2.1和更高版本中则不需要,因为Postfix可以直接存取该文件。

为了测试TLS,在25号端口打开一个Telnet会话。

如果想看一个完全可以工作的/etc/postfix/main.cf文件的示例,请查看 http://people.redhat.com/sfolkwil/main.cf

6.5 本章小结

电子邮件(E-mail)诞生于20世纪70年代初,它随着Internet应用的发展逐步成熟。除文字信息外,还可以传送声音、图片、图像及动画等多媒体信息。时至今日电子邮件更为我国的网民们带来了前所未有的便利。本章介绍电子邮件系统的组成和相关协议和电子邮件服务器的工作原理,另外介绍了Linux中两个主要的邮件服务器Sendmail及Postfox的安装和故障排除策略。