欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

邮件服务器:Postfix

程序员文章站 2022-03-18 17:12:02
...

邮件服务器

1、邮件服务器的功能和工作原理

1.1、Mail Server与DNS之间的关系

  • 邮件服务器一定要有一个合法的主机名才可以;
  • DNS的反解也很重要
  • 需要DNS的MX及A标志(超重要的MX)
  • Email的地址写法:账号@主机名

1.2、邮件传输所需要的组件(MTA、MUA、MDA)以及相关协议

邮件服务器:Postfix

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

邮件服务器:Postfix

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
[aaa@qq.com ~]# 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
[aaa@qq.com ~]# rpm -ivh Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm
[aaa@qq.com ~]# 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:设置邮件别名

[aaa@qq.com ~]# 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
#其他的保留默认值即可
[aaa@qq.com ~]# postmap hash:/etc/postfix/access
[aaa@qq.com ~]# postalias hash:/etc/aliases

因为在main.cf当中额外加入了两个外部配置文件:mynetworks和alias_database,所以才会额外进行postmap和postalias。然后开始准备启动:

#先检查是否有语法错误
[aaa@qq.com ~]# postfix check
#启动并观察端口
[aaa@qq.com ~]# systemctl restart postfix
[aaa@qq.com ~]# netstat -tunlp | grep ':25'
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      18365/master  

2.3、邮件发送流程与收信、Relay等重要概念

邮件服务器:Postfix
  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. 邮件标题的收件人主机名必须符合mydestinationmydestination的设置,或者收件主机名需要符合virtual_maps的设置。
  • 转发方面
    1. 发信端必须符合$inet_interfaces的设置;
    2. 发信端来源必须符合mynetworksmynetworks的设置;发信端来源或邮件标题的收件人主机名符合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这个网络使用时,可以这么做:

[aaa@qq.com ~]# vim /etc/postfix/access
120.114.141.60          OK
.baidu.com              OK
av.com                  REJECT
192.168.2.              REJECT 
[aaa@qq.com ~]# postmap /etc/postfix/access
[aaa@qq.com ~]# 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

[aaa@qq.com ~]# 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
[aaa@qq.com ~]# vim /etc/aliases
dream:          li
[aaa@qq.com ~]# postalias hash:/etc/aliases
[aaa@qq.com ~]# 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

之后,不论是aaa@qq.com还是aaa@qq.com都会将邮件丢到/var/spool/mail/li这个Mailbox中。

2.5.2、个人化的邮件转递:~/.forward

一般用户也想要进行邮件转发,比如:我的li这个账号接收到的邮件除了自己保留一份外,还要给本机上的li02账号也转发一份:

[aaa@qq.com ~]# su li
[aaa@qq.com root]$ cd /home/li
[aaa@qq.com ~]$ vim .forward
li
li02

2.5.3、查看邮件队列信息:postqueue、maip

[aaa@qq.com ~]$ postqueue -p
Mail queue is empty
#如果关闭postfix后,发送一封邮件
[aaa@qq.com ~]$ systemctl stop postfix
[aaa@qq.com ~]# echo "test" | mail -s "test queue" root
[aaa@qq.com ~]# 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  root
                                         root

-- 0 Kbytes in 1 Request.

输出的信息主要有:

Queue ID、Size、Arrival time、Sender/Recipient

事实上,这封信放在了/var/spool/postfix里面,可以使用postcat查看信件内容:

[aaa@qq.com ~]# cd /var/spool/postfix/maildrop/
[aaa@qq.com maildrop]# ls
D5A8510A18CF		#注意Queue ID的对应
[aaa@qq.com 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: 7bit

test
*** HEADER EXTRACTED D5A8510A18CF ***
*** MESSAGE FILE END D5A8510A18CF ***

3、MRA服务器:dovecot设定

3.1、基础的POP3/IMAP设定

需要安装dovecot软件,配置文件也只有一个:/etc/dovecot/dovecot.conf。

[aaa@qq.com maildrop]# yum install dovecot -y
[aaa@qq.com maildrop]# vim /etc/dovecot/dovecot.conf
protocols = imap pop3
[aaa@qq.com maildrop]# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = no
[aaa@qq.com maildrop]# systemctl start dovecot
[aaa@qq.com maildrop]# systemctl enable dovecot
[aaa@qq.com 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

邮件服务器:Postfix

邮件服务器:Postfix

邮件服务器:Postfix

相关标签: 服务器 linux