邮件
服务的理论知识
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

与电子邮件相关的协议有:pop3imap4smtp

其中最重要的是smtp

SMTP(simple Mail Transfer Protocol)是简单邮件传输协议,因为它简单到邮件发出去后

只负责如何路由、如何选择。当邮件到达目的地后如何到达用户手中?它就不会参与了。所以

它只负责邮件传输相关的功能。smtp本身是基于tcp的协议,监听tcp25号端口

其实一封邮件从发出的那个用户开始到最终到接受邮件的用户手中,都经历了哪些步骤?

跟哪些服务组件相关?

首先,我们来说下smtp服务与DNS的关系。电子邮件的地址通常是用户名@一个域名,如redhat@126.com

在没有pc机之前,所有主机都是MainFrame,叫大型机。所有的计算机用户都是MainFrame上的用户,在当时网络诞生之后都一般是时时在线的就是不会关机,这时两台主机发邮件是很简单的。

比如主机www.magedu.com上的用户jerry向主机www.hehuan.com上的用户tom发邮件的话,

其实非常简单,jerry只需写封邮件,发件人就是jerry@www.magedu.com,收件人是tom@www.hehuan.com

当时就这么简单,username@FQDN

pc机出现之后,用户很可能就不是mainframe上的用户了,可能是某个pc机上的用户,

而这些pc机并不需要时时在线,假如说上面hehuan.com这个域中有一台主机叫ns.hehuan.comtom就是这台主机上的用户

发送方还是jerry@www.magedu.com 接收方就变成tom@ns.hehuan.com ,而且如果jerry发邮件的给tom的时候

tom不在线的话邮件是发不出去的,所以发送邮件的这台主机会隔一段时间重试着发一次,在尝试一定的次数之后

若还是发不出去,他就会认为这台主机不存在。于是这封邮件的就会被保留,因为这台主机压根不存在,所以无法发送到tom

所以电子邮件发展到后来,就不是让每台主机都有接受邮件的能力,而是专门提供一台主机为一个域内的所有的pc机或服务器

统一接受邮件。所以在hehuan.com这个域内专门有台主机收发邮件。而且我们的邮件地址不再写成tom@ns.hehuan.com格式,而是写成

tom@hehuan.com这样的格式。然而域显然是不能收发邮件的,我们必须找到这个域内谁是用来收发邮件的、谁是用来邮件处理的。

因此我们必须有一种机制用来保证让对方的服务器知道这个域内到底是哪台服务器负责邮件处理的

那如何来保证呢?这就要用到DNS了。DNS是如何实现标识一个域内的邮件服务器的?是靠MX记录来实现的,即邮件交换器。

DNS上一个域内的邮件交换器可以有多个,当有多个邮件交换器时如何标识谁是主的谁是辅的?比如说hehuan.com这个域内有两个邮件交换器,mailmail1,默认情况下,

当发送方解析对方MX记录的时候得到的是两台主机,这时就不知道到底发送给那一台。那么如何判定发给那一台?MX记录是有优先级的,

优先级是0-99,数值越小优先级越高,反之越低。如果mail的优先级是5mail1的优先级是10,那就发送给mail,当mail忙不过来或不在线的时候

发送方才联系mail1,发送到这个辅助邮件交换器上,但并不是这个交换器接受邮件后就可以保存邮件了

这个辅助邮件交换器会等到主邮件交换器空闲的时候把代替它接受的邮件再转发到主邮件服务器,所以辅助邮件交换器仅仅
在主的忙不过来的时候临时的把邮件接受过来。

如果我们要配置一个互联网上的服务器,那么它和DNS是紧密集成起来的。

如果我们发送的是tom@www.hehuan.com这种格式,那么这台主机要有A记录

如果我们发送的是tom@hehuan.com这种格式,要求对方的DNS不光有A记录还要有MX记录

所以要是后面这种格式,一次邮件发送到目标域中要进行几次DNS查询?两次,一次查A记录,一次是MX记录

以上说明了:1、现在的邮件发送@后的是域名而不是主机名;2、邮件发送过程中与DNS服务的关系

邮件的发送的过程:整个传送是明文的,并且是纯ASCII码,而且早期的互联网络

是不可靠的,因此邮件传递过程当中通常每台服务器都是open relay 即开放式中继。

stmp服务工作在对方tcp25号端口,而工作在这个端口的服务叫stmpdddaemon即守护进程

当用mail命令接受邮件后,会在每个用户的家目录下生成一个文件mbox,专门放用户自己看过的邮件,

但是smtpd进程没有权限随便进入别人的家目录,当stmpd接收到邮件后,不是放在用户的家目录,而是放到为每个用户准备好的邮筒中去了

是谁的放到谁的里边。

没有看过的邮件在/var/spool/mail文件中,只要用户收到过邮件都会自动的生成一个用户对应的文件,作为用户自身所未看文件的存放位置

# ls -l  /var/spool/mail 看下属性

将用户的邮件放到用户的邮箱当中的不是stmpd服务器本身的功能,还要借助于

其他程序,这个程序我们通常叫它为邮件投递的程序,叫MDA

MUA:让用户能够打开写邮件,并且在写完之后自动的向外发出的程序就是MUA全称是邮件用户代理。

MTP:邮件传输代理,接收到的邮件,如果目标域不是自己所负责的域,还可以再次转发的,叫MTA.

当邮件发过来后发现是自己所负责的域,邮件接收下来之后怎样放到用户的邮筒

里去,这就要用到MDA
,投递代理。

smtp 没有认证功能,可以借助于SASL

SASL Simple Authentication Security Layer)简单认证安全层,库,用于为其它没有

认证能力的服务提供认证功能。

实现SASL的功能的是软件cyrus-sasl   

怎样认证?默认情况下把没有认证功能smtp服务想象成一个矿业荒郊的一座房子,你就住在这个房子,任何人想进这个房子都易如反掌,为了能够提供一种防护机制,在

房子的外围加上院墙,当别人向***这台主机时,得先通过这个院墙才能到达服务器

可以把sasl看成是smtp外的一道防护机制,但是这个防护机制用不用要通过smtp服务器进行配置

用就配置,不用就默认是没有这个功能。有了sasl之后用户要想通过它发邮件,在用户通过smtp发邮件的时候

会先要求用户提供一个帐号并且把用户帐号交给sasl进行验证,如果用户有个合法的帐号,

就能够向外发送邮件,若没有就不能发送。所以saslsmtp服务器提供了用户认证能力。

但是sasl只是认证框架,只是有了认证能力,本身不做认证

要想认证还要借助于额外的认证机制,常用的认证有:plainloginmysqlldap等,每个认证机制都需要一个认证模块。

使用sasl框架的时候还要告诉它用的哪种机制认证的,哪种机制就决定了到哪个库中去找用户帐号的,

我们都知道,如果基于mysql认证,用户的帐号密码就放在mysql数据库的表中

如果是ldap就放在ldap中;如果是plainlogin,帐号和密码就放在/etc/passwd 和 /etc/shadow

这就是sasl实现了发信认证,避免所有用户都能利用服务器向外发送邮件来避免垃圾邮件。

到现在为止,看似完美了,考虑一下如果我们发送的是一个商业文件呢,smtp

能加密文件吗.就算smtp能加密发送到服务器上了,那用户接受邮件是不是通过pop3协议

imap协议来收邮件,这两种协议是明文的。

pop3监听在tcp110端口

imap4监听在tcp143端口

由于smtp是多段式的,它的加密过程未必是完整的,因为发送方或接收方有一方不支持ssl

那发送的邮件就是明文的。

stmp基于ssl加密,固然能够实现smtp协议叫smtps,但是安全性并不能得到解决

而接受邮件时就是在客户端和服务器端建立联系,这时pop3imap4就能够完整的基于ssl

pop3基于ssl的协议叫pop3s 监听在tcp995端口

imap4基于ssl的协议叫imaps 监听在993端口上

这两个是不同的服务,只不过最终目的一样,实现过程不同。

smtp通常在实现邮件传输的时候不用smtps协议,而使用S/MIME或者是GPG机制

MIME是多用途互联网邮件扩展

S/MIME是安全的多用途互联网邮件扩展

GPG PGP的实现

如何反垃圾邮件、病毒邮件?

开源界中反垃圾邮件的软件有:spamassassin 垃圾邮件的过滤器

反垃圾邮件本身并不能反垃圾邮件,它是靠垃圾邮件的特征库

反病毒的开源软件:clamav 是杀毒软件,并不杀毒,只是判断是否是病毒

smtp本身并不能调用病毒文件反病毒,也不能调用病毒文件过滤器反病毒

也不能调用反垃圾邮件来反垃圾邮件,需要借助于额外的机制来实现

这个机制是caller 

caller能实现邮件发过来后先用反垃圾邮件过滤一遍再用反病毒文件过滤一遍

 如果没问题了再向外发。

 caller著名的有:mailscannermimedefangamavisd-new

 这几个都可以让smtp服务器去掉用clamavspamassassin来实现反垃圾和反病毒的

 比较常用的是amavisd-new

 还可以在根上防护:这是客户端黑名单

 还可以根据对方的邮件服务器来发邮件,邮件服务器接受来自另外一个邮件服务器发

 送来的邮件,最终接收方确实是这个邮件服务器所负责的域,我们应该无条件接收,但是我们发现这个用户

 经常发送垃圾邮件,可以拒收这个邮件,即把他列入服务器的黑名单,但是把一个客户列入黑名单,只能在一台服务器

 上反垃圾邮件。目前来讲还有一种基于DNS来做的叫RBL,也就是

 当一个用户向外发送邮件的时候,发往哪个域就需要解析这个域,为了能够

 防范垃圾邮件,会反解对方的ip,反解出来的主机名是否和正解的A记录匹配,若不匹配就拒绝接受

所以在互联网上做邮件服务器的时候得有反解,若没有反解就会拒决接收

这种机制就是防范adsl用户创建邮件服务器向外发送邮件的,adsl用户拨号获得一个地址但事实上是没有域名的。

一般来讲就算有域名也无法反解,在互联网上无法通过DNS反解,这是防范垃圾邮件的一种机制。

所以互联网上邮件流量比较大,因此在某些意义上反解流量,比正解流量还要多就是因为这个原因造成的。

每一封邮件接收方和发送方都要反解的,这只是一种机制;还有一种机制是

时时黑名单,直接在服务器上配置拒绝某个特定域内的邮件,或者是互联网上有个专门

的组织,把那些经常发送垃圾邮件的服务器所在的域列到黑名单中,而我们接收邮件的时候

先去反解对方的主机名,这样可以获得对方的域名或主机名,然后拿着这个域名或主机名与列表比对,看看

这个域有没有在这个黑名单列表中,如果有就拒绝接收,没有的话就放行。

什么叫时时黑名单?即列表会时时更新的,它会通过一些程序始终监控扫描着互联网上哪些服务器会经常

往外发送垃圾邮件,一旦发现会把它放进黑名单列表,但不是永久的放在里边的,过一定的时间还会把过期的移除掉。

不会一直在列表中放着。

不过一般互联网上的黑名单列表是收费的。

总结:

为了反垃圾邮件我们有以下机制:

关闭开放式中继、基于客户端认证、用户认证、使用专门的软件、使用黑名单

为了能让用户收发邮件,我们必须要求用户在这个系统上有个帐号,如果这个帐号是

系统帐号的话,是不是就能登录系统了,这样是很不安全的。为了避免这种情况

我们可以使用虚拟账号。虚拟账号的机制,密码和帐号放在mysqlldap中。

MUA软件有:muttwindows上的OEFoxmailThunderbird   evalution

MTA 软件有提供smtpd服务的,非商业的: sendmail qmailpostfixeximExchangeLotus  Notes Domono

postfixsendmail安全性要高,稳定性要好,维护性要简单方便,而且比sendmail有更高的效率,所以postfix取代了sendmail

Exchange依赖于WindowsAD所以只能用在Windows

MDAprocmail邮件投递代理、maildrop(开源)

MRAcyrus-imap、 courier-imapdovecot

SASLcyrus-sasl 

cyrus-sasl 默认情况下是不支持mysqlldap的认证,要想基于他们的认证可以借助于courier-authlib,来实现
虚拟用户的认证。