邮件原理你真的造吗

一、前言


    虽然现在QQ、微信等即时聊天工具原来越盛行,但是在企业与企业之间大部分还是会使用邮件系统进行信息交换。所以作为运维人员,更需要了解这个技术的原理。下面会慢慢介绍邮件的组件功能,将其组成部分。以及邮件的工作原理。

    小贴士:邮件系统是一个比较复杂的系统,过程比较繁琐,但了解之后对邮件系统搭建将会起到很大的作用。所以请耐心查阅,让螃蟹慢慢跟您介绍。


二、邮件服务器与DNS之间的关系


    最开始互联网传递邮件十分简单。因为最开始的计算机都是大型机主机,并保持24小时不停机,用户也是实时在线,而且每台主机都有固定的IP地址。

    如果www.pangxie.com主机中的eric用户想法邮件给www.windchaser.com主机里的wqp用户,他只需要以发件人为 eric@www.pangxie.com 收件人为 wqp@www.windchaser.com 发送邮件即可。

之前邮件传递.png

    但是随着小型电脑PC盛行,电脑PC无需24小时开机,导致用户不可能一直在线。如果在eric想发邮件给wqp的时候,这时wqp用户所在的电脑早已关机,那么eric将无法传递邮件给到wqp用户。

    基于这种情况下,我们就迫切需要一台邮件服务器为所在域内的所有电脑或服务器统一接收发和管理邮件。

    演变到后来,我们现在发送邮件将不需要再直接写一台主机了,而是@域名的格式即可。但是这样有存在一个问题,域本身是无法接收邮件的。所以我们必须找到域中用来处理邮件的服务器是谁,这时就需要和DNS联系了。

    DNS根据MX记录来查询邮件交换器的。 MX:Mail eXchange

    当DNS上存在多个MX记录的主机的时候怎么办,如何判断哪台才是主服务器,哪台是辅助的服务器呢?这时就是根据DNS的邮件级判断了。DNS上定义的值越小,其优先级越高。但是如果过域里有多台邮件交换器,他们之间工作是负载均衡,还是热备机备份呢?请看下图介绍

DNS.png

①当发件方需要发送邮件给对方邮件服务器,需要向DNS请求查询对方邮件服务器的MX记录。
②DNS通过查询MX表信息。
③将查询到的MX信息返回给发送方。
④发送方根据优先级,将邮件投递给对方优先级高的邮件服务器(mail1)。
⑤如果主邮件服务器过于繁忙,或者不在线的时候,会将邮件投递给辅的邮件交换器(mail2)上。
⑥待主邮件服交换器空闲下来后,mail2会将代替接收下来的邮件再转给主邮件交换器(mail1)。

小贴士:辅助交换器接受到邮件并不能保存邮件。而是这个辅助交换器会等到主邮件交换器空闲的时候把代替它接受下来的邮件在转给主邮件交换器。所以任何邮件处理都是主邮件交换器处理的。所以我们实际情况下,如果有2台服务器做邮件交换器,性能比较高的应该为主的。


三、邮件传输所需的程序


    MUA(Mail User Agent):功能是向外发送邮件的程序,以及提供用户浏览与编写邮件的功能。

    MTA(Mail Transfer Agent):(可以理解为smtpd服务器)帮忙将用户的邮件传递出去或接收进来。

    MDA(Mail Delivery Agent):将接收下来的邮件存放到对应用户邮筒当中的程序。

        通过分析MTA所收到邮件的表头或内容,来判断此邮件是属于哪个用户,然后决定将此邮件投递给哪个用户的邮筒里

    MRA(Mail Retrieval Agent):通过MRA服务器提供的邮政服务协议(POP)来接收自己的邮件


四、邮件发送过程


发送邮件过程.png

    ①用户eric想发送邮件给wqp,通过终端登录到mail.pangxie.com服务器上,编写一篇邮件,以发件人为eric@pangxie.com,收信人为wqp@windchaser.com发送邮件
    ②mail.windchaser.com主机调用smtp程序准备向外发送邮件
    ③smtp看到是通过域名发送邮件,smtp会调用DNS客户端
    ④DNS客户端会向DNS服务器查询smtp所需求的域名信息
    ⑤DNS服务器通过查询MX记录查找到域名所指向的邮件服务器信息。  
    ⑥DNS服务器将所查询到的信息返回给DNS客户端
    ⑦smtp收到DNS对方MX信息之后,开始和对方邮件服务器通过TCP/IP三次握手,最终和邮件服务器里的smtpd服务建立联系后,将邮件传递给了mail.windchaser.com服务器主机。
    #小贴士:smtpd是邮件服务器的守护进程,监听在TCP的25号端口
    ⑧当smtpd收到mail.pangxie.com主机发来的邮件,如果是本地用户的邮件,它将会继续⑨,否则它会将它再继续传递出去(这个就是开放式中继)
    ⑨当smtpd接收下来邮件之后,发现此邮件目标正是本地用户,它会调用MUA,将此邮件存放到邮筒(MailBox)里去。此邮筒的路径一般为/var/spool/mail下以此用户的名字命名的文件
    ⑩wqp用户使用终端登录到mail.windchaser.com服务器上,通过mail命令查收邮件
    ⑪查收的邮件会自动移至用户家目录一个叫mbox的文件夹。


五、开放式中继代理(open relay)


    开放式中继.png

    如果eric发的邮件不是发给wqp@windchaser.com,而是发给peng@a.com,但是这封邮件被本地的smtp程序发给了mail.windchaser.com服务器了。mail.windchaser.com服务器接收了此邮件后发现不是自身域里的用户,就会通过查询DNS后找到a.com对应的MX记录所指向的邮件服务器,然后再次转发出去。这个就是中继代理的功能。

    但是我们会发现一个问题,为什么eric的smtp程序没有直接将邮件投递给a.com域里的邮件服务器呢?原因是因为以前的互联网的网络是很不可靠的,为了保证邮件能顺利的传递给对方,每个邮件服务器都是开放中继代理功能。如果mail.pangxie.com邮件服务器认为自己的通路不太可靠,而发现mail.windchaser.com的通路比较可靠,那么它就会将邮件投递给mail.windchaser.com服务器,mail.windchaser.com服务器收取邮件后发现不是本地域里的用户,就会友好的将此邮件再次投递出去,最终投递给a.com域。而windchaser.com就是开放式中继的服务器。开放式中继固然方便了正常邮件的发送,但是也造成了另一个负面的地方,那就是垃圾邮件。


六、电脑客户端(MUA)发送邮件


    在之前我们介绍了MUA,发现用户想发送邮件都是通过终端连接到服务器上,然后在使用编辑器发送邮件。但是在我们日常工作中却不会是这样。例如我们在使用QQ邮箱、126邮箱时候,就不可能直接连接上它们服务器上发送邮件,而是通过电脑上的客户端发送邮件。

    具体流程如下:

基于客户端发送邮件.png

    ①用户在电脑中打开MUA程序。代表程序有Outlook、Foxmail。
    ②当用户编写好邮件之后,在发送邮件之前注明了为我们提供向外发送邮件功能的邮件服务器地址,开始调用本地的smtp程序。
    ③本地smtp根据用户所提供的邮件服务器地址通过smtp协议开始和邮件服务器(mail.windchaser.com)建立连接,将邮件发送给本地域邮件服务器。
    ④邮件服务器收到此邮件后,开始检查邮件的目标地址是否是本地域用户。如果是则执行第④步,如果不是执行第⑤步。
    ⑤通过MDA分析邮件的表头等信息,最终将邮件投递到公共的邮筒里(MailBox)。
    ⑥通过查询DNS,解析目标邮件服务器对应的MX记录,最后将邮件投递出去。之后的步骤和上面一致,这里不再多做介绍。

小贴士:这里可以发现,其实mail.magedu.com也是有开放了中继功能,所以邮件服务器还是需要开放本地网络的中继功能。仅仅为本地网络中的客户端中继邮件,而mail.a.org发现收件人是本地域里的用户,会无条件接收下来。

 


   

七、通过MUA接收邮件(POP3,IMAP4)

    由本地的smtpd服务接收下来邮件,由MDA投递放到用户对应的邮筒里去。这时会建立另一个服务,这个服务器能够实现让用户通过账号密码连接此服务,此服务能够根据用户的账号密码验证用户的身份,并在在验证之后以用户的身份到到邮筒里去取出用户的邮件,并且把它返回给用户,这个就叫做MRA(邮件检索或邮件取回代理) 而整个服务就是pop3或imap4服务。

    详细流程如下:

客户端接收邮件.png

    ①本地电脑调用MUA程序。
    ②wqp用户将自己的账号和密码,通过pop3协议去连接POP3服务。
    ③POP3服务通过验证用户身份,验证通过之后,调用MRA程序,使用用户的账号信息提交给MailBox。
    ④MailBox根据MRA程序请求,取出用户的邮件,最终将邮件返回给用户。

小贴士:这个流程就说明为什么我们在配置MUA的时候不止需要配置发送的邮件服务器,也要配置接收邮件的服务器。



八、webmail,通过网页形式收发邮件


    在使用网页形式收发邮件前,邮件服务器必须首先建立web服务器,通常是通过CGI脚本为用户提供脚本。

    用户就能不在通过MUA客户端程序才能发送和接收邮件,而只需要在本地打开浏览器,输入对应服务器地址,并提供用户的账号密码,当邮件服务器认证通过之后,CGI脚本就会把用户账号信息传送给MRA,由MRA到MailBox收取对应用户的邮件,然后再网页界面展示给用户。   

    如果用户需要发邮件的话,在浏览器中点击写邮件,就会打开一个编辑器,写完之后点击发送,我们CGI就会调用本地的smtp,将邮件发给MTA,由MTAX向外进行发送。这个程序就叫做WebMail



九、关于发送邮件的身份验证


    虽然看上去邮件发送流程已经完备了,但是还是存在另一问题,那就是我们在邮件发送流程中,域里的邮件服务器并没有对发送邮件的用户身份进行验证,而仅仅是对内网的IP地址进行中继代理放行。那么假设公司有人在外地工作,那么该用户的所用网络肯定不是内网的IP地址,邮件服务器检测到不是允许中继的IP地址,将拒绝将邮件进行转发的。可是他确实是我们公司的用户,这样肯定不和常理。并且还要注意一点,由于IP地址是可以伪装的,有可能会因为内部人员对公司邮件服务器进行破坏。所以认证用户身份是必不可少的。但是由于smtp过于简单,所以他没有对发送用户进行认证功能,这时就需要借助额外的机制,这个机制就是SASL。

    SASL:Simple Authentication Security Layer简单认证安全层,是一种协议,是一个库文件 ,用户为其他没有认证功能的服务提供认证功能 

    提供SASL这个功能的软件叫cyrus-sasl,是一个通用组件

小贴士:SASL默认功能是不开启的

    详细认证过程请看下图:

认证.png

    ①用户向服务器请求发送邮件,并将用户账号密码提供给邮件服务器
    ②邮件服务器调用SASL程序
    ③SASL只是一个认证框架,本身并没有认证功能。所以需要寻找额外的认证机制。从认证机制中比对用户的账号密码,认证通过则执行第⑤步,否则执行第④步
    ④认证不通过,邮件服务器拒绝转发此邮件
    ⑤认证通过,邮件服务器根据DNS解析MX记录后,将邮件投递到目标邮件服务器。

小贴士:常用的认证机制还有plain,login,mysql,ldap,这些认证机制都需要一个模块来实现,哪种机制就表明要去哪个库去找账号密码的。


十、关于发送和接收邮件的加


    如果你发送的邮件具有商业秘密或者军事秘密的邮件,不希望别人能查看的到,这时需要对邮件进行加密处理。但是smtp过于简单,根本没有对邮件进行加密的功能。所以在邮件传递过程中,smtp、pop3、imap4都是明文的。由于此三个协议都属于不同的程序,如果仅对其中一个程序加密是无法保证邮件是安全的。所以需要分开对加密。

    对于pop3和imap4,由于处理方式都是在自己域里,所以相互之间通过协商后可以使用pop3s,imaps加密方式对收件方式进行加密。但是对于smtp相对很难,因为在邮件传递过程中,smtp不单单会在自身域里传递,而且也会与其他邮件服务器之间传递,所以直接使用加密某个smtps协议很难实现。

    所以smtp需要使用基于S/MIME,GPG的程序对邮件发送过程进行加密。

    加密方法如下:

加密.png

小贴士:加密过程是属于另一个较大的知识范畴,这里不做详细介绍。日后将会更新此相关博客,请耐心等待哈(*^__^*) 


十一、关于垃圾邮件和病毒邮件的过滤

       

    由于smtp自身比较简单,而现在对邮件用户危害较大的注意有2种,垃圾邮件和病毒邮件。

    常用的反垃圾邮件有spam assassin

    常用的反病毒邮件有clamav病毒邮件防护网关   

    但smtp并不能调用这两种组件来为防范病毒和垃圾邮件,他还需要借用caller机制实现。而caller能够实现让邮件发过来后先要反病毒邮件过滤器过滤一次,要防垃圾邮件过滤一次,如果没有问题了就再向外发。

小贴士:著名的caller有mailscanner、mmedefang、amavised-new。

    详细邮件过滤过程如下图:

过滤.png

    ①eric用户向邮件服务器(mail.pangxie.com)请求发送邮件
    ②邮件服务器通过查询DNS的MX记录最终将邮件发往mail.windchaser.com邮件服务器
    ③mail.windchaser.com邮件服务器收到邮件之后先调用caller程序
    ④caller调用反病毒邮件检测程序,对邮件进行病毒检测
    ⑤caller调用反垃圾邮件检测程序,对垃圾邮件进行检测
    ⑥如果反病毒邮件程序和反垃圾邮件程序检测结果无误,则mail.windchaser.com服务器将此邮件接收下来放到用户的邮筒里。


十二、总结

    1、邮件传输所需的程序:MUA、MTA、MRA、MDA

    2、由于smtp过于简单,所以为完善整个邮件过程中需要额外的程序和应用。例如:DNS、web、pop3、imap4、pop3s、imaps、SASL、caller等

    3、eric@pangxie.com发送给wqp@windchaser.com的完成过程

总结.png

备注:此博客为本人学习总结的,写的并不太详细,写的不好或者不对的地方还希望能多多见谅。希望能和各位多多交流。

原创文章,作者:螃蟹,如若转载,请注明出处:http://www.178linux.com/7049

评论列表(2条)

  • stanley
    stanley 2015-08-17 11:31

    庖丁解牛,文章名字也起的生动有趣,增色不少,非常赞

    • 螃蟹
      螃蟹 2015-08-22 23:25

      @stanley还好还好,谢谢老师鼓励