[干货]邮件原理你真的造吗|螃蟹同学

一、前言

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

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


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

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

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

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

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

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

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

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

①当发件方需要发送邮件给对方邮件服务器,需要向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)来接收自己的邮件


四、邮件发送过程

①用户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)

如果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邮箱时候,就不可能直接连接上它们服务器上发送邮件,而是通过电脑上的客户端发送邮件。

具体流程如下:

①用户在电脑中打开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服务。

详细流程如下:

①本地电脑调用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默认功能是不开启的

详细认证过程请看下图:

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

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


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

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

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

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

加密方法如下:

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


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

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

常用的反垃圾邮件有spam assassin

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

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

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

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

①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的完成过程

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

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2015-12-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏知识分享

有人WIFI模块使用详解

 补充 模块在连接路由器时如果希望模块固定IP 不过发现固定IP之后好像连接路由器的等待时间增加了 ? ? 用的这一款 ? 看一下现在可能用到了引脚 ? ? 这...

39450
来自专栏数据之美

ssh 双机互信:免密码登录设置步骤及常见问题

在 linux 系统管理中,设置免密码登录,进行机器的批量管理是最常用的一个方法。比如针对几十甚至上百台线上机器,通常我们会设置一台“发布机”作为中央控制机对其...

413100
来自专栏Java架构师学习

面对缓存,出现这些问题你要如何思考!

缓存可以说是无处不在,比如 PC 电脑中的内存、CPU 中的二级缓存、HTTP 协议中的缓存控制、CDN 加速技术都是使用了缓存的思想来解决性能问题。 Java...

421100
来自专栏云计算教程系列

如何在Ubuntu 14.04上配置Apache内容缓存

缓存是一种通过允许以允许更快访问的方式临时存储共同请求的内容来提高服务器性能的方法。这通过减少一些资源密集型操作来加速处理和交付。

22400
来自专栏北京马哥教育

[诀窍]上G文件双机互传首选工具BBCP

由来: 局域网双机拷贝单个大文件 【200G大小】,不要问我是啥! 也不要问我为毛会生成那么大的单文件,事实就是这样!然后就开始了操蛋之旅!再次做下记录备忘! ...

50550
来自专栏Linux驱动

38.Linux驱动调试-根据系统时钟定位出错位置

当内核或驱动出现僵死bug,导致系统无法正常运行,怎么找到是哪个函数的位置导致的? 答,通过内核的系统时钟,因为它是由定时器中断产生的,每隔一定时间便会触发一次...

235100
来自专栏玄魂工作室

CTF实战14 任意文件上传漏洞

该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关

1.1K30
来自专栏Hadoop实操

如何为Hadoop集群服务器绑定双万兆网卡

在搭建Hadoop集群时,要求网络使用以太网,最低要求使用千兆网络,推荐使用万兆网络,标准配置是数据网络配备双万兆网卡,管理网络配备双千兆网卡。使用双万兆网卡的...

95610
来自专栏沃趣科技

ASM 翻译系列第二弹:ASM 12C 版本新特性

原作者:Bane Radulovic 译者: 邱大龙 审核: 魏兴华 随着Oracle 12c的发布,也就意味着全新版本的ASM面世了。已知的重大新...

37740
来自专栏情情说

RabbitMQ实战:性能和安全

前两篇介绍了RabbitMQ在可用性、监控方面的考虑,这是基础保障,因为在某些场景下是不容许丢失消息的,但它和性能往往是对立的,需要根据业务场景做取舍。

72780

扫码关注云+社区

领取腾讯云代金券