最近想学习一下LINUX的邮件服务器,但是不知道用什么的比较好? 在网上查查,看现在的有postfix、Qmail、openwebmail、Sendmail、U-Mail 、exim、Zmailer等还有好多~ 找来一篇文章与大家分享,希望大家多给建议,看看什么类型的即易于菜鸟学习又有很大的发展前景。
几年以前,Linux环境下可以选择 的可以免费邮件服务器软件只有Sendmail,但是由于Sendmail的缺陷,一些开发 者先后开发了若干种其他的邮件服务器软件。
当前,运行在Linux环境下免费的 邮件服务器,或者称为MTA(Mail Transfer Agent)有若干种选择,比较常见的有Sendmail、Qmail、Postfix、 exim及Zmailer等等。本文希望通过对几种影响相对来说比较大的主流Linux环境 下的MTA的特点进行阐述,并对其优缺点一一金星分析比较,使用户在选择Linux 环境下的免费MTA时有一个选择的依据。
Postfix
Postfix是一个由 IBM资助下由Wietse Venema 负责开发的自 由软件工程的一个产物,其目的是为用户提供除sendmail之外的邮件服务器选择 。Postfix力图做到快速、易于管理、提供尽可能的安全性 ,同时尽量做到和sendmail邮件服务器保持兼容性以满足用户的使用习惯。起初 ,Postfix是以VMailer这个名字发布的,后来由于商标上的原因改名为Postfix 。
主要设计目标
Postfix工程的目标是实现一个邮件服务器,提供给用户除sendmail以外的选 择。其设计目标包括:
性能, Postfix要比同类的服务器产品速度快三倍以上,一个安装 Postfix的台式机一天可以收发百万封信件。Postfix设计中采用了web服务器的 的设计技巧以减少进程创建开销,并且采用了其他的一些文件访问优化技术以提 高效率,但同时保证了软件的可靠性。
兼容性。Postfix设计时考虑了保持Sendmail的兼容性问题,以使移植变 的更加容易。Postfix支持/var[/spool]/mail, /etc/aliases, NIS, 及 ~/.forward等文件。然而 Postfix为保证管理的简单性,所以没有支持配置文件 sendmail.cf。
安全和健壮性。Postfix设计上实现了程序在过量负载情况下仍然保证程 序的可靠性。当出现本地文件系统没有可用空间或没有可用内存的情况时, Postfix就会自动放弃,而不是重试使情况变的更糟。
灵活性。Postfix结构上由十多个小的子模块组成,每个子模块完成特定 的任务,如通过SMTP协议接收一个消息,发送一个消息,本地传递一个消息,重 写一个地址等等。当出现特定的需求时,可以用新版本的模块来替代老的模块, 而不需要更新整个程序。而且它也很容易实现关闭某个功能。
安全性。Postfix使用多层防护措施防范攻击者来保护本地系统,几乎每 一个Postfix守护进程都能运行在固定低权限的chroot之下,在网络和安全敏感 的本地投递程序之间没有直接的路径—一个攻击者必须首先突破若干个其他的程 序,才有可能访问本地系统。Postfix甚至不绝对信任自己的队列文件或IPC消息 中的内容以防止被欺骗。Postfix在输出发送者提供的消息之前会首先过滤消息 。而且Postfix程序没有set-uid。
Postfix的一些特点
支持多传 输域:sendmai支持在Internet, DECnet, X.400及UUCP之间转发消息。 Postfix则灵活的设计为无须虚拟域 (vistual domai)或别名来实现这种转发。但是在早期的发布里仅仅支持STMP和有限度 地支持UUCP,但对于我国用户来说,多传输域的支持没有什么意义。
虚拟域:在大多数通用情况下,增加对一个虚拟域的支持仅仅需要改变一个 Postfix查找信息表。其他的邮件服务器则通常需要多个级别的别名或重定向来 获得这样的效果。
UCE控制 (UCE,unsolicited commercial email): Postfix能限制哪个主机允许通过自身转发邮件,并且 支持限定什么邮件允许接进。Postfix实现通常的控制功能:黑名单列表、RBL查 找、HELO/发送者DNS核实。基于内容过滤当前没有实现。
表查看 : Postfix没有实现地址重写语言,而是使用了一种扩展的表查看来实现地 址重写功能。表可以是本地 dbm或 db文件等格式。
Postfix体系结构及与Sendmail 的比较
Postfix是基于半驻留,互操作的 进程的体系结构,每个进程完成特定的任务,没有任何特定的进程衍生关系(父 子关系)。而且,独立的进程来完成不同的功能相对于“单块”程序具有更好的 隔离性。此外,这种实现方式具有这样的优点:每个服务如地址重写等都能被任 何一个Postfix部件所使用,无须进程创建等开销,而仅仅需要重写一个地址, 当然并不是只有postfix采用这种方式。
Postfix是按照这种方式实现的: 一个驻留主服务器根据命令运行Postfix守护进程,守护进程完成发送或接收网 络邮件消息,在本地递交邮件等等功能。守护进程的数目由配置参数来决定的, 并且根据配置决定守护进程运行的次数(re-used times),当空闲时间到达配置参数指定的限度时,自动消亡。这种方法 明显地降低了进程创建开销,但是单个进程之间仍然保持了良好的隔离性。
Postfix的设计目标就是成为 Sendmail的替代者。由于这个原因,Postfix系统的很多部分,如本地投递程序 等,可以很容易地通过编辑修改类似inetd的配置文件来替代。
Postfix的核心是由十多个半驻留 程序实现的。为了保证机密性的原因,这些Postfix进程之间通过Unix的socket 或受保护的目录之下的FIFO进行通信。即使使用这种方法来保证机密性, Postfix进程并不盲目信任其通过这种方式接收到的数据。
Postfix进程之间传递的数据量是 有限制的。在很多情况下,Postfix进程之间交换的数据信息只有队列文件名和 接收者列表,或某些状态信息。一旦一个邮件消息被保存进入文件,其将在其中 保存到被一个邮件投递程序读出。
Postfix采用一些通常的措施来避 免丢失信息:在收到确认以前通过调用flush和fsync()保存所有的数据到磁盘中 。检查所有的系统调用的返回结果来避免错误状况。
大多数构建邮件服务器者都会选择 sendmail,公平的来讲sendmail是一个不错的MTA(Mail Transfer Agent),最初开发时Eric Allman的设计考虑主要放在了邮件传递的成 功性。不幸的是,Sendmai开发时没有太多的考虑Internet环境下可能遇到的安 全性问题。Sendmail在大多数系统上只能以根用户身份运行,这就意味着任何漏 洞都可能导致非常严重的后果,除了这些问题之外,在高负载的情况Sendmail运 行情况不是很好。
安全
Postfix则并一定要以root 的身份运行,而只需要一个主(master)程序以root身份运行,其生成进程来处理 接入、发出及本地邮件投递工作。通过使用一系列模块部件,每个任务由一个单 独的程序来运行(这样使审计变的容易一些)。例如发出邮件被卸载到一个队列目 录,在这里“pcikup”程序取到该邮件然后将邮件传递给“cleanup”程序,其再 将邮件传递给“trivial-rewrite”,其负责处理邮件头,最后若邮件目的是别 的系统则将邮件传递给“smtp”程序。而且相对于Sendmail来说Postfix也更容 易设置chroot'ed环境。只要简单地通过编辑master.cf(一般位于/etc/postfix 内)文件即可实现,并且Postfix将运行chroot'ed,以限定在其定义的队列目录之 下(通常位于/var/spool/postfix),同样可以在master.cf中对Postfix的单一模 块设置进程限制。用户可以限制Postfix以哪个用户的身份运行,一般来说是以 “postfix”用户(概念上该用户和Apache的nobody类似)运行,该用户可以访问 特定的队列目录。Postfix其他的主要优点是起配置文件的清晰易懂性。
与Sendmail的比较
如sendmail之类的邮件系统 是按照一个"单块"的结构设计实现的,该“单块”程序实现所有的功 能。当然这种结构有利于在系统的不同部分之间共享数据。但是这种结构容易出 现一些致命的错误。而如qmail的邮件系统上使用一种分层次的结构,按照固定 得顺序运行不同功能的子模块进程,执行完毕之后就将其释放。这种方法有良好 的“绝缘”性,但是增加了进程创建开销和进程间通信开销。但是通过合理的规 划子模块进程的运行顺序可以将开销保持在可以接受的范围内。
使用其他的MTA替代Sendmail是一 件非常麻烦的事情,用户往往又要花大量的时间去熟悉新的MTA的配置和使用。 而使用Postfix,你可以利用很多以有的配置文件。如(access, aliases, virtusertable等等),只需要简单的在master.cf中定义一下即可。此 外,Postfix在行为上也很象Sendmail,用户可以使用"sendmail"命令 来启动Postfix。
当然,使用一个软件来替代另外一个软件需要解决特定的问题。部分原因是因为 Postfix的安全特性,在配置Postfix时可能会遇到一些问题。最典型的问题是向 root用户发送邮件。Postfix一般不提高自身的权限(向root用户发送邮件所必须 的)来投递邮件。用户需要在别名文件中为root定义别名,如:"root: someuser"。这同样会对若干个邮件列表模块发生影响,特别是SmartList 。一般来说实现邮件列表最好使用Majordomo,它易于配置。
Sendmail一个很突出的问题就是可 扩展性和性能问题。例如用户若希望每天重新启动Sendmail来实现自动更新配置 文件(如为虚拟主机重定向邮件)就会出现问题。Sendmail生成新的进程来处理发 送和接收邮件,这些进程会一直存在直到传输结束,之后Sendmail才能退出,这 样你的脚本程序将不能正确的重起Sendmail。