邮件服务器
1、邮件服务器的功能和工作原理
1.1、Mail Server与DNS之间的关系
- 邮件服务器一定要有一个合法的主机名才可以;
- DNS的反解也很重要;
- 需要DNS的MX及A标志(超重要的MX);
- Email的地址写法:账号@主机名
1.2、邮件传输所需要的组件(MTA、MUA、MDA)以及相关协议
1.2.1、MUA(Mail User Agent)
MUA的主要功能是收取邮件主机的电子邮件,以及提供用户浏览与编写邮件。常见的MUA有:Thunderbird、Outlook等。
1.2.2、MTA(Mail Transfer Agent)
MTA的功能有这些:
- 接收邮件:使用简单邮件传输协议(SMTP),使用port 25
- 转发邮件:如果这封邮件的目的地不是本地用户,由MDA转发
常见的MTA的SMTP功能的主要软件是postfix、sendmail等。
1.2.3、MDA(Mail Delivery Agent)
MDA是挂在MTA下面的一个小程序,最主要的功能是:分析由MTA所收到的邮件表头或内容等数据,来决定这封邮件的去向。所以说,上面提到的MTA的邮件转发功能,其实是由MDA实现的。功能:
- 过滤垃圾邮件
- 自动回复
一般的MTA邮件都有MDA功能。也可以使用外挂软件,如:procMail。
1.2.4、Mailbox
Mailbox就是电子邮件的意思。Linux系统默认的邮箱就是在**/var/spool/mail/用户账号** 中。
如何通过MUA来将邮件送到对方的邮件服务器去呢?
-
Step 0:取得某台MTA的权限
通俗来说,就是必须要向MTA注册一组可使用的E-mail的账号与密码才行。
-
Step 1:用户在MUA上编写邮件后,发送至MTA上
邮件的主要数据有:
- 邮件标题
- 邮件内容
-
Step 2.1:如果该封邮件的目标是本地端MTA自己的账号
通过MDA将这封信送到Mailbox去
-
Step 2.2:如果这封邮件的目的地为其他MTA,则开始中继转发的流程
MDA会开始转发,通过SMTP(port 25)转发出去
-
Step 3:对方MTA服务器接收邮件
远程MTA会接收我们MTA发送的邮件
1.3、用户收信时服务器所提供的相关协议:MRA
1.3.1、MRA(Mail Retrieval Agent)
用户可以通过MRA服务器提供的邮政服务协议(Post Ofice Protocol,POP)来接收自己的邮件,也可以通过IMAP(Internet Message Access Protocol)协议将自己的邮件保留在邮件服务器上面,并进一步进行建立邮件数据文件夹等高级操作。
POP3的收信方式:
- MUA通过POP3的协议连接到MRA的port 110,并且输入账号密码来取得正确的认证与授权;
- MRA确认该用户账号/密码没有问题后,会前往该用户的Mailbox(/var/spool/mail/用户账号)取得用户的邮件并发送到用户的MUA软件上;
- 当所有的邮件服务传送完毕后,用户的Mailbox内的数据将会被删除。
IMAP协议可以让你将Mailbox的数据存储到你的主机上的用户主目录,即/home/账号/ 那个目录下,那你不但可以建立邮件数据文件夹,也可以针对邮件分类管理。
1.3.2、Relay与认证机制的重要性
通常设置Relay的方法有几种:
- 规定某一个特定客户端的IP或网段;
- 若客户端的IP不固定可以利用认证机制来处理;
- 将MUA搭建在MTA上面。
1.3.3、电子邮件的数据内容
E-mail也有所谓的标题与内容两部分。
2、MTA服务器:Postfix基础设定
2.1、所需要的软件与软件架构
主要的文件 | 说明 |
---|---|
/etc/postfix/main.cf | 主要的postfix配置文件 |
/etc/postfix/master.cf | 主要规定了Postfix每个程序的工作参数 |
/etc/postfix/access(利用postmap处理) | 可以设置开放Relay或拒绝连接的来源或目标地址等信息的外部配置文件,需要在/etc/postfix/main.cf配置让其生效 |
/etc/aliases(利用postalias或newaliases均可) | 作为邮件别名的用途,也可作为邮件组的设置 |
主要的执行文件 | 说明 |
/usr/sbin/postconf(查阅Postfix的设置数据) | 这个指令可以列出你的Postfix的详细设置数据,包括系统默认值 |
/usr/sbin/postfix | 主要执行文件 |
/usr/sbin/postalias | 设置别名数据库的命令,因为MTA读取数据库格式的文件效率较好,所以我们都会将ASCII格式文件重建为数据库 |
/usr/sbin/postcat | 主要用于检查放在queue当中的邮件内容。 |
/usr/sbin/postmap | 与postalias类似,主要用于转换access文件的数据库 |
/usr/sbin/postqueue | 类似于mailq |
[root@server ~]# wget http://www.percona.com/redir/downloads/Percona-XtraDB-Cluster/5.5.37-25.10/RPM/rhel6/x86_64/Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm
[root@server ~]# rpm -ivh Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm
[root@server ~]# yum install postfix -y
2.2、让Postfix可监听Internet来收发邮件
要让你的postfix可以收发邮件,你必须要启动的设置数据有下面这些:
-
myhostname:设置主机名,需使用FQDN
-
myorigin:发信时所显示的“发信源主机”项目
就是“邮件头上面的mail from”的那个地址,也就是代表本MTA传出去的邮件将以此设置值为准。默认以$myhostname为准。
-
inet_interfaces:设置Postfix的监听端口(极重要)
在默认情况下,你的postfix只会监听本机的接口(127.0.0.1)而已。如果想要监听整个Internet的话,请开放成为对外的接口,或者是开放给全部的接口,如“inet_interfaces = all”
-
inet_protocol:设置Postfix监听IP协议
-
mydestination:设置“能够收信的主机名”(极重要)
主机可能有很多的主机名,在许多的主机名当中,仅有写入这个设置值的名字才能作为E-mail的主机地址。
-
mynetworks_style:设置“信任网络”的一项指标
这个设置值在规定与主机在同一个网络的可信任客户端。下面的mynetworks会取代这个设置值。
-
mynetworks:规定信任的客户端(极重要)
你的MTA能不能帮忙进行Relay与这个设置值有很大关系。如果你想要以/etc/postfix/access这个文件来控制relay的而用户时,可以写成“mynetworks = 168.100.189.0/28, 127.0.0.0/8, 10.0.0.0/8, hash:/etc/postfix/access”,然后只需要建立access重整数据库后,就能够设置relay的用户了。
-
relay_domains:规定可以帮忙relay的下一台MTA主机地址
针对“下游MTA服务器”而设置的。
-
alias_maps:设置邮件别名
[root@server ~]# vim /etc/postfix/main.cf
myhostname = server.lan
mydomain = lan
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost, server.lan, Li-911m.lan, client.lan
mynetworks = 168.100.189.0/28, 127.0.0.0/8, 10.0.0.0/8, hash:/etc/postfix/access
relay_domains = $mydestination
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
#其他的保留默认值即可
[root@server ~]# postmap hash:/etc/postfix/access
[root@server ~]# postalias hash:/etc/aliases
因为在main.cf当中额外加入了两个外部配置文件:mynetworks和alias_database,所以才会额外进行postmap和postalias。然后开始准备启动:
#先检查是否有语法错误
[root@server ~]# postfix check
#启动并观察端口
[root@server ~]# systemctl restart postfix
[root@server ~]# netstat -tunlp | grep ':25'
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 18365/master
2.3、邮件发送流程与收信、Relay等重要概念
- 发信端与收信端两台主机间会先经过一个握手(ehlo)的阶段,此时发信端被记录为发信来源(而不是Mail from)。通过握手后就可以进行邮件标题(header)的传送;
- 此时收信端主机会分析标题的信息,若邮件的“Mail to:主机名”为收信端主机,且该名称符合mydestination的设置,则该邮件会开始被接收到队列,并进一步送到Mailbox中;若不符合mydestination的设置,则终止连接且不会进行邮件内容(body)的传输;
- 若“Mail to:主机名”不是收信端本身,则开始进行中继转发(Relay)的分析;
- 转发过程首先分析该邮件的来源是否符合信任的客户端(这个客户端为步骤1所记录的发信端主机),也就是来源是否符合mynetworks的设置值,若符合则开始接收邮件至队列中,并等待MDA将邮件再转发出去,若不符合则继续下一步;
- 分析邮件来源或目标是否符合relay_domains的设置,若符合则邮件将被接收至队列,并等待MDA将邮件再转发出去;
- 若这封邮件的标题数据都不符合上述的规范,则终止连接,并不会接收邮件的内容数据。
在暂不考虑access以及MDA的分析机制中,一台MTA想要正确地收发邮件,电子邮件必须符合下面的需求:
- 收信方面
- 发信端必须符合$inet_interfaces的设置;
- 邮件标题的收件人主机名必须符合 virtual_maps的设置。
- 转发方面
- 发信端必须符合$inet_interfaces的设置;
- 发信端来源必须符合 relay_domains的设置。
2.4、设定邮件主机权限与过滤机制:/etc/postfix/access
基本上,指定了Postfix的mynetworks的信任来源就能够让用户relay了。当然,还可以通过access这个文件来额外管理邮件过滤。基本的access语法如下:
规范的范围或规则 Postfix的操作
IP/部分IP/主机名/Email等 OK/REJECT
如果想让120.114.141.60还有baidu.com可以使用这台MTA来转发邮件,而不允许av.com以及192.168.2.0/24这个网络使用时,可以这么做:
[root@server ~]# vim /etc/postfix/access
120.114.141.60 OK
.baidu.com OK
av.com REJECT
192.168.2. REJECT
[root@server ~]# postmap /etc/postfix/access
[root@server ~]# ll /etc/postfix/access*
-rw-r--r--. 1 root root 21085 7月 29 18:07 /etc/postfix/access
-rw-r--r--. 1 root root 12288 7月 29 18:07 /etc/postfix/access.db
#会发现有个access.db也会同步更新!这才是postfix实际读取的!
用这个文件的最大好处就是,不用重启postfix,只要数据库建好,立刻就生效了!
2.5、设定邮件别名:/etc/aliases、~/.forward
系统里边有很多账号,如:bin、apache等,这些账号执行的程序发生错误时,会发给root。不过MTA为什么知道会发给root呢?这就需要aliases这个邮件别名配置文件来处理了!
2.5.1、邮件别名配置文件:/etc/aliases
[root@server ~]# vim /etc/aliases
# Basic system aliases -- these MUST be present.
mailer-daemon: postmaster
postmaster: root# General redirections for pseudo accounts.
bin: root
daemon: root
adm: root
lp: root
sync: root
shutdown: root
halt: root
mail: root
news: root
uucp: root
operator: root
games: root
gopher: root
ftp: root
nobody: root
[root@server ~]# vim /etc/aliases
dream: li
[root@server ~]# postalias hash:/etc/aliases
[root@server ~]# ll /etc/aliases*
-rw-r--r--. 1 root root 1539 7月 29 18:16 /etc/aliases
-rw-r--r--. 1 root root 12288 7月 29 18:16 /etc/aliases.db
之后,不论是li@server.lan还是dream@server.lan都会将邮件丢到/var/spool/mail/li这个Mailbox中。
2.5.2、个人化的邮件转递:~/.forward
一般用户也想要进行邮件转发,比如:我的li这个账号接收到的邮件除了自己保留一份外,还要给本机上的li02账号也转发一份:
[root@server ~]# su li
[li@server root]$ cd /home/li
[li@server ~]$ vim .forward
li
li02
2.5.3、查看邮件队列信息:postqueue、maip
[li@server ~]$ postqueue -p
Mail queue is empty
#如果关闭postfix后,发送一封邮件
[li@server ~]$ systemctl stop postfix
[root@server ~]# echo "test" | mail -s "test queue" root
[root@server ~]# postqueue -p
postqueue: warning: Mail system is down -- accessing queue directly
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
D5A8510A18CF 280 Wed Jul 29 10:28:22 rootroot-- 0 Kbytes in 1 Request.
输出的信息主要有:
Queue ID、Size、Arrival time、Sender/Recipient
事实上,这封信放在了/var/spool/postfix里面,可以使用postcat查看信件内容:
[root@server ~]# cd /var/spool/postfix/maildrop/
[root@server maildrop]# ls
D5A8510A18CF #注意Queue ID的对应
[root@server maildrop]# postcat D5A8510A18CF
*** ENVELOPE RECORDS D5A8510A18CF *** #队列编号
message_arrival_time: Wed Jul 29 18:28:22 2020
named_attribute: rewrite_context=local #分析named(DNS)的特性来源自本机
sender_fullname: root #发件人的名字
sender: root
recipient: root #收件人
*** MESSAGE CONTENTS D5A8510A18CF *** #信件内容
Date: Wed, 29 Jul 2020 18:28:22 +0800
To: root
Subject: test queue
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bittest
*** HEADER EXTRACTED D5A8510A18CF ***
*** MESSAGE FILE END D5A8510A18CF ***
3、MRA服务器:dovecot设定
3.1、基础的POP3/IMAP设定
需要安装dovecot软件,配置文件也只有一个:/etc/dovecot/dovecot.conf。
[root@server maildrop]# yum install dovecot -y
[root@server maildrop]# vim /etc/dovecot/dovecot.conf
protocols = imap pop3
[root@server maildrop]# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = no
[root@server maildrop]# systemctl start dovecot
[root@server maildrop]# systemctl enable dovecot
[root@server maildrop]# netstat -tlnp | grep dovecot
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 42710/dovecot
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 42710/dovecot
tcp6 0 0 :::110 :::* LISTEN 42710/dovecot
tcp6 0 0 :::143 :::* LISTEN 42710/dovecot