当前位置: 代码迷 >> 综合 >> 邮件服务器:Postfix
  详细解决方案

邮件服务器:Postfix

热度:55   发布时间:2024-02-02 11:32:40.0

邮件服务器

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的收信方式:

  1. MUA通过POP3的协议连接到MRA的port 110,并且输入账号密码来取得正确的认证与授权;
  2. MRA确认该用户账号/密码没有问题后,会前往该用户的Mailbox(/var/spool/mail/用户账号)取得用户的邮件并发送到用户的MUA软件上;
  3. 当所有的邮件服务传送完毕后,用户的Mailbox内的数据将会被删除。

IMAP协议可以让你将Mailbox的数据存储到你的主机上的用户主目录,即/home/账号/ 那个目录下,那你不但可以建立邮件数据文件夹,也可以针对邮件分类管理。

1.3.2、Relay与认证机制的重要性

通常设置Relay的方法有几种:

  1. 规定某一个特定客户端的IP或网段;
  2. 若客户端的IP不固定可以利用认证机制来处理;
  3. 将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等重要概念

在本机MTA当中的邮件分析过程
  1. 发信端与收信端两台主机间会先经过一个握手(ehlo)的阶段,此时发信端被记录为发信来源(而不是Mail from)。通过握手后就可以进行邮件标题(header)的传送;
  2. 此时收信端主机会分析标题的信息,若邮件的“Mail to:主机名”为收信端主机,且该名称符合mydestination的设置,则该邮件会开始被接收到队列,并进一步送到Mailbox中;若不符合mydestination的设置,则终止连接且不会进行邮件内容(body)的传输;
  3. 若“Mail to:主机名”不是收信端本身,则开始进行中继转发(Relay)的分析;
  4. 转发过程首先分析该邮件的来源是否符合信任的客户端(这个客户端为步骤1所记录的发信端主机),也就是来源是否符合mynetworks的设置值,若符合则开始接收邮件至队列中,并等待MDA将邮件再转发出去,若不符合则继续下一步;
  5. 分析邮件来源或目标是否符合relay_domains的设置,若符合则邮件将被接收至队列,并等待MDA将邮件再转发出去;
  6. 若这封邮件的标题数据都不符合上述的规范,则终止连接,并不会接收邮件的内容数据。

在暂不考虑access以及MDA的分析机制中,一台MTA想要正确地收发邮件,电子邮件必须符合下面的需求:

  • 收信方面
    1. 发信端必须符合$inet_interfaces的设置;
    2. 邮件标题的收件人主机名必须符合 m y d e s t i n a t i o n mydestination的设置,或者收件主机名需要符合 virtual_maps的设置。
  • 转发方面
    1. 发信端必须符合$inet_interfaces的设置;
    2. 发信端来源必须符合 m y n e t w o r k s mynetworks的设置;发信端来源或邮件标题的收件人主机名符合 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  

4、MUA软件:Thunderbird

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述