浅析邮件服务器原理

上面的架构图中包含两组邮件系统、两个客户端和一个DNS服务器,其中的邮件系统是企业中比较经典的架构形式,下面我将依据此图来简述邮件服务器的工作流程。

名词解释:

  • MUA 接收邮件所使用的邮件客户端,使用IMAP或POP3协议与服务器通信,常见的有:outlook、foxmail;
  • MTA 通过SMTP协议发送、转发邮件,常见的有:sendmail、postfix、qmail;
  • MDA 将MTA接收到的邮件保存到磁盘或指定地方,通常会进行垃圾邮件及病毒扫描;
  • MRA 负责实现IMAP与POP3协议,与MUA进行交互;
  • SMTP 传输发送邮件所使用的标准协议;
  • IMAP 接收邮件使用的标准协议之一;
  • POP3 接收邮件使用的标准协议之一;
  • MailBox 用户邮箱;
  • cyrus-SASL及courier-authlib 提供用户认证相关的支持。
  • SQL 数据库,用于存储用户身份信息

前面的架构图中,MUA想发送邮件,就要将邮件通过SMTP协议送到MTA上,MTA通常会要求用户认证身份(也可不认证),认证通常使用SASL,认证源可以是像上面的架构图中那样使用SQL数据库也可以使用其他方式。MTA收到邮件后会检查邮件目的地址的邮件域,此时会产生两种情况。
情况一,目的邮件域是本服务器:
如果发现是本服务器的邮件域则将邮件送到MDA,由MDA将其投递到用户的邮箱(MailBox)中。最后用户在MUA上使用POP3/IMAP协议链接MRA,MRA通常也会要求用户认证身份,其认证源同MTA一样可以是SQL也可以是其他方式,若认证通过,则允许MUA读取邮件信息。
情况二,目的邮件域非本服务器:
若是邮件域是其他邮件服务器的,则MTA会发送UDP报文向DNS服务器查询邮件域对应的邮件主机,并最终解析出其IP地址,随后MTA会查询本服务器的转发控制策略,若允许转发,则将邮件转发到该域对应的服务器上,最终会重复情况一中MTA收到邮件后的处理方式。

CentOS 6下使用postfix搭建简单邮件服务器

介绍:
postfix是linux/unix下比较常用的开源免费邮件传输代理程序(MTA)。
下图是postfix的logo,略显猥琐。。。

服务安装:
通常情况下,CentOS默认都会安装postfix。
如果你不确定你的系统中有没有postfix可以使用如下命令查看。

yum -qa | grep postfix

若没有安装则使用如下命令安装。

yum install -y postfix

DNS配置:
邮件发送是需要DNS解析支持的,DNS服务器的配置方法参考此篇文章:

CentOS 6下使用BIND配置简单DNS服务器


最后要求DNS正向解析配置成类似如下形式,反向解析区域可不配置。“192.168.1.20”是我的邮件服务器的IP地址,请按照实际情况来做更改。

主要配置文件介绍:
postfix的配置文件存放路径为/etc/postfix,其中的主要的配置文件有两个,一个是main.cf另一个是master.cf。关于两个配置文件的说明,如下。

main.cf              //此配置文件为postfix主配置文件,决定了postfix的工作方式。
master.cf            //此配置文件用以配置postfix中各个程序的工作参数,一般在做邮件系统优化时才会用到。

postfix配置:
在配置前,我们需要先关掉系统中sendmail(sendmail也是linux/unix下常用的邮件传输代理程序)的所有服务,避免二者产生冲突。
查看是否安装了sendmail。
rpm -qa | grep sendmail
如安装了sendmail,则关闭sendmail服务,否则跳过这一步。

service sendmail stop
chkconfig sendmail off

编辑主配置文件。

vim /etc/postfix/main.cf

查找“myhostname”关键字,一般在第75行左右的位置,因软件版本差异行号可能不同。

去掉其中一个前面的注释,这里是配置postfix服务器的主机名,这个主机名必须是FQDN(完全合格域名,例如:mail.ibadboy.net)。

在第83行左右找到“mydomain”关键字。

去掉其前面的注释,并将参数修改为邮件域。
什么是邮件域?举例说明:admin@ibadboy.net这个邮箱地址中@后面的ibadboy.net就是邮件域。

在第98行左右找到“myorigin”关键字,去掉第二个“myorigin”前方注释。
这里是用于定义由本台邮件服务器寄出的每封邮件的邮件头中mail from(发信源主机)的地址。如果不设置,默认会以$myhostname也就是本地主机名这个选项的参数为值,最后是这种形式:“from  ‘user1’ <user1@mail.ibadboy.net>”,看起来是不是怪怪的?为了方便阅读,一般以$mydomain作为其参数,这样就变成了“:“from  ‘user1’ <user1@ibadboy.net>”。
需要特殊说明的是:main.cf配置文件中所有以$开头的字符串都是一个变量,变量的值就是变量名对应的选项的参数,例如$mydomin这个变量对应的值就是83行mydomin这个选项的参数。

修改后:

转到第113行,找“inet_interfaces”这个关键字,这里是定义postfix监听的接口,默认只监听本地回环接口(127.0.0.1),通常的做法是让其监听所有的接口(值为all),或者也可以使用主机名为值,要求其只监听主机名对应IP的接口。

修改后:

转到164行,找“mydestination”关键字,这里定义postfix可收信的主机名或域名。这里其实很好理解,一封邮件的目的地址是我这台服务器我就收下,否则我当然不收了。

默认的选项是不包括域名的,通常情况下需要接收主机名或域名为本机的邮件,也就是修改为选项二,如下图。

至此,一个简单的postfix邮件服务器就配置好了,我们一共对配置文件做了如下几个更改:1、指定了主机名,2、指定了邮件域,3、指定了发信源主机,4、使postfix监听所有网卡,5、设置了允许收信的主机名及域名。
保存配置后,在保证selinux和防火墙均关闭的情况下启动postfix服务。

service postfix start

服务测试:
推荐搭建完postfix后配合dovecot(MRA,邮件接收代理)一起在邮件客户端进行测试。
dovecot配置教程参考此篇文章:

CentOS 6下邮件接收代理程序——dovecot配置教程


 

CentOS 6下邮件接收代理程序——dovecot配置教程

介绍:
dovecot是开源的pop3和imap邮件服务器(MRA,邮件接收代理),用于支持客户端从服务器读取邮件。
软件安装:

[root@localhost ~]# yum install -y dovecot

dovecot配置部分
使用vim文本编辑器编辑dovecot主配置文件

[root@localhost ~]# vim /etc/dovecot/dovecot.conf

找到# protocols = imap pop3 lmtp这条配置语句,去掉前面的注释(#)。这里是开启dovecot的pop3和imap服务。

修改后如图:

保存并退出。
编辑/etc/dovecot/conf.d/10-auth.conf

[root@localhost ~]# vim /etc/dovecot/conf.d/10-auth.conf

找到# disable_plaintext_auth = yes,去掉前面的注释(#)并将= yes改为= no。这里是定义允许使用明文密码登陆imap/pop3。

修改后如图:

保存并退出
编辑/etc/dovecot/conf.d/10-mail.conf

[root@localhost ~]# vim /etc/dovecot/conf.d/10-mail.conf

找到# mail_location = mbox:~/mail:INBOX=/var/mail/%u,去掉前面的注释(#)。这里是定义邮件存储路径。

修改后如图:

保存并退出,至此dovevot部分配置完成。
现在在保证selinux及防火墙已关闭的情况下启动dovecot服务。

[root@localhost ~]# service dovecot start

添加两个邮件账户测试用:

[root@localhost ~]# useradd -s /sbin/nologin user1
[root@localhost ~]# useradd -s /sbin/nologin user2
[root@localhost ~]# passwd user1
[root@localhost ~]# passwd user2

创建完账户后要赋予账号对应的邮箱777的权限,否则接收不到邮件。

[root@localhost ~]# chmod 777 /var/mail/*

测试服务可以使用outlook、fixmail等邮件客户端。
推荐配置完MTA(邮件传输代理)和MRA(邮件接收代理)后一起测试,会方便很多。
关于MTA(邮件传输代理)的配置教程可以参考以下文章:

CentOS 6下使用sendmail搭建简单邮件传输服务器

CentOS 6下使用sendmail搭建简单邮件传输服务器

介绍:

sendmail是linux/unix下比较常用的开源免费邮件传输代理程序(MTA)。

需要安装的软件包:

sendmail(邮件传输代理,用于发送及转发邮件,使用smtp协议)
sendmail-cf(包含配置过程中需要使用的m4工具)

安装命令:

yum install -y sendmail sendmail-cf

DNS配置:

DNS服务器的配置方法参考此篇文章:

https://www.ibadboy.net/archives/1027.html

最终要求添加一个sx.com的域名并配置DNS解析为如下形式:

本实验中DNS服务器IP地址:192.168.162.244,邮件服务器IP地址:192.168.162.245。

注意MX记录要写在前面(如上图),否则会出错。

配置完DNS服务器之后别忘了将邮件传输服务器的DNS修改为DNS服务器的地址,否则会导致邮件传输服务器无法转发邮件哦。

Centos下修改DNS的方法参考此篇文章:

https://www.ibadboy.net/archives/1055.html

sendmail配置部分:

sendmail主配置文件:

实际上sandmail的主配置文件是/etc/mail/sendmail.cf,但因为该配置文件使用宏语言编写,一般人难以看懂更别提编辑了。
所以sendmail提供了一个/etc/mail/sendmail.mc文件,此文件可读性远远大于sendmail.cf,使用者可以直接编辑sendmail.mc文件再通过m4工具生成相对应的sendmail.cf配置文件供sendmail读取。

使用vim文本编辑器打开sendmail.mc

vim /etc/mail/sendmail.mc

找到第116行(因软件版本差异行号可能对不上),如下图,将此行中Addr=127.0.0.1修改为本机公网IP地址(MX记录对应的域名所解析出的IP地址,本实验中为192.168.162.245),也可以改为0.0.0.0。这里是定义让sendmail监听哪个地址,默认是监听127.0.0.1(本地回环),修改为0.0.0.0是监听所有地址,也可以像本实验中设置的只监听某个指定的公网地址。

修改后如图:

保存并退出。

使用m4工具生成与刚刚编辑的sendmail.mc相对应的sendmail.cf文件

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

编辑/etc/mail/access文件定义允许接收或转发哪些主机的邮件。

vim /etc/mail/access

如上图,定义了允许接收并转发192.168.162网段中所有主机的邮件。

关于/etc/mail/access配置文件的详细配置方法请转到此篇文章了解:

https://www.ibadboy.net/archives/676.html

保存并退出

生成与刚刚编辑的/etc/mail/access相对应的数据库文件。

makemap hash /etc/mail/access < /etc/mail/access

编辑/etc/mail/local-host-names定义本机的域(如不定义,默认以主机名作为本机域),当sendmail收到邮件时会依据此文件来判断邮件的目标地址是本域还是其他域,如果是本域则投递到对应账号的邮箱内,如果是其他域则进行转发。

vim /etc/mail/local-host-names

配置方法很简单,一行一个域名即可,如下图。

保存并退出,自此sendmail部分配置完成。

启动服务:

在保证selinux及防火墙均已关闭的情况下启动sendmail服务。

service sendmail start

但需要注意的是,一个完整的邮件系统不应该只包含使用SMTP协议的MTA(邮件传输代理),还应该包括使用POP3或IMAP协议的MRA(邮件接收代理)

推荐同时配置完MTA(邮件传输代理)和MRA(邮件接收代理)后一起进行最后的服务测试。

关于MRA(邮件接收代理)的配置参考此篇文章:

https://www.ibadboy.net/archives/958.html