玩转企业常见应用与服务系列(七):邮件服务 Postfix 原理与实践

2023-11-21 16:45:04 浏览数 (1)

前面介绍了企业常用服务 NFS FTP DHCPDNS Sambalsyncd 相关的知识点,今天我将详细的为大家介绍邮件服务 Postfix 相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发朋友圈支持一波!!!

Postfix 简介

Postfix 是一种电子邮件服务器,它是由任职于IBM华生研究中心(T.J. Watson Research Center)的荷兰籍研究员Wietse Venema为了改良sendmail邮件服务器而产生的。最早在1990年代晚期出现,是一个开放源代码的软件。

  • Postfix 官方网站:http://www.postfix.org/
  • Postfix 下载地址:http://www.postfix.org/download.html

sendmail由于出现的比较早,但是各方面的问题也比较突出,postfix就是为了替代sendmail的缺点而出现的,postfix 邮件服务器的优点很明显:

  • 开源的,要知道开源的即是免费的。
  • 速度更快,比sendmail×××倍。
  • 兼容性好,与sendmail兼容,两者互相迁移很方便。
  • 更能干,在重负荷之下仍然能正常工作,当超负荷之后,他会自动调整。
  • 更灵活,不同于sendmail一体化的设计,postfix使用模块化的设计,各个模块专注于自己的工作。
  • 安全性,具有多层的防御结构。
邮件服务知识扩展
邮件服务器遵循的协议类型

1)SMTP:Simple Mail Transfer Protocol/简单邮件传送协议,定义邮件传送,基于TCP服务的应用层,明文传送,SMTP协议使用25端口 。两个邮件服务器之间,客户和邮件服务器之间使用。服务器和服务器之间用来传输邮件,客户端将邮件传输到服务器。

2)POP3:Post Office Protocol 3/邮局协议第三版,POP3协议适用于不能实时在线的邮件用户。支持客户在服务器上租用信箱,然后利用POP3协议向服务器请求下载,基于TCP/IP协议与客户端/服务端模型,POP3的认证与邮件传送都采用明文,使用110端口 。客户端和服务器之间使用,用来下载邮件。

3)IMAP:Internet Message Access Protocol/英特网信息存取协议,也叫邮件同步协议,另一种从邮件服务器上获取邮件的协议,与POP3相比,支持在下载邮件前先行下载邮件头以预览邮件的主题来源,基于TCP/IP,明文传送,使用143端口。

邮件服务器常用的端口
  • 25 smtp
  • 465 smtps
  • 110 pop3
  • 995 pop3s
  • 143 imap
  • 993 imaps
Postfix的模块有哪些呢?
  • smtpd 用于响应用户的请求。
  • cleanup 用于检测语法。
  • pickup 用于分检邮件。
  • smtp 类似于客户端,传输邮件。
  • qmgr 队列管理器用于不同邮件状态的管理。

postfix由这些还有其他的一些模块来进行服务,各个模块自己完成自己的任务,他们由一个master进程统一调度。

Postfix 的四种邮件队列?

  • maildrop 本地邮件存放处。
  • incoming 放置正在到达或者队列管理进程尚未发现的邮件。
  • active 放置已经打开了正准备投递的邮件,当然它是由长度限制的。
  • deferred 放置不能被投递的邮件。

队列管理进程仅仅在内存中保留active队列,并且限制其长度。

Postfix 对邮件风暴的处理

当有新的邮件到达的时候,postfix进行初始化,此时postfix同时只接受两个并发连接请求,当邮件投递成功后,可以同时接收的并发连接就会缓慢地增长,一直到可配置的值。

当系统资源消耗已经达到不能承受的负载,就会停止并发连接数量的增长,或者postfix在处理邮件过程中遇到问题,数量也会减少。

当接收到的新邮件的数量,超过它的投递能力时,postfix会停止投递deferred队列中的邮件,去处理新接收到的邮件,因为处理新邮件的延迟小于处理defferred队列中的邮件。

Postfix 对无法投递的邮件的处理

当第一次发送失败,postfix会给该邮件,贴上一个将来的时间有票,在达到这个时间之前,不会再处理该类邮件,到到达这个时间时,进行投递,再次失败,将再次贴上一个双倍与第一次的邮件将来时间的邮票,以此类推,进行多次尝试之后,放弃该邮件,回复用户错误信息。

postfix对于目标不可达的目的邮件的处理,postfix内存之中保存了一个有长度限制的不可达的地址列表,避免想这些地方进行邮件投递。

Postfix的安全性

  • 1.动态分配内存,放置系统缓冲区溢出
  • 2.把大邮件分割成几块处理,投递时在进行重组
  • 3.postfix的各个进程互相不进行控制,只接受master主进程的控制
  • 4.postfix 的队列文件有其特殊格式,只能被postfix本身识别

Postfix 邮件处理过程

接收的过程

当接受新邮件时,新的邮件首选在incoming队列停留,并进行处理:

  • 对于来自与本地的邮件:local进程负责接收,并放置邮件于maildrop队列中,然后pickup进程对其进行完整性检测,maildrop目录的权限必须进行设置 避免用户删除其他用户的邮件。
  • 对于网络的邮件:smtpd 进程负责接收邮件,并且进行安全性检测。
  • postfix进程会自己产生邮件,用于将邮件的不可投递信息返回给发件人,这些工作由bounce后台程序产生。
  • postfix 产生邮件,提示postfix管理员 postfix运行过程中出现问题。
  • cleanup进程,对邮件进行处理,添加信头中丢失的Form信息。也就是将地址重写为标准的user@’域名‘ 的格式,从信头中抽取收件人的地址,投入到incoming队列中,请求处理该信件,请求地址重写进程将收件人地址转换为标准的user@‘域名’的格式。
邮件的投递过程

上面的部分结束之后,邮件已经到达incoming的队列了,接下来进行邮件的投递。

  • 邮件到达邮件队列管理进程,他将办含有队列文件路径信息,发件人地址,收件人地址的投递请求发送给投递代理。
  • 与此同时,邮件队列管理进程维护者deferred,active队列,不同状态的邮件放置于的队列。
  • 针对于发送成功与失败,队列管理进程与rewrite,与bounce后台程序练习,成功的给rewrite进行地址解析,失败的给bounce返回信息给用户。
  • 检查成功的邮件送给投递代理进程,local和smtpd。

CentOS 7 搭建 Postfix 邮件服务器

准备工作
代码语言:javascript复制
root@localhost ~]# systemctl stop firewalld //关闭防火墙
[root@localhost ~]# setenforce 0 //关闭selinux

搭建DNS服务器(可参考前面的文章:)

代码语言:javascript复制
[root@localhost ~]# vi /etc/named.conf 修改如下内容:

保存退出

代码语言:javascript复制
[root@localhost ~]# vi /etc/named.rfc1912.zones

保存退出

代码语言:javascript复制
[root@localhost named]# vi aa.com.zone //编辑正向区域数据配置文件
代码语言:javascript复制
//创建反向区域数据配置文件
[root@localhost named]# cp -p named.localhost aa.com.local
[root@localhost named]# vi aa.com.local //编辑反向区域数据配置文件

保存退出

搭建postfix并配置
代码语言:javascript复制
[root@localhost ~]# postconf –a //验证是否支持cyrus dovecot功能

(若postfix已安装好,则会支持这两个功能,若不支持,表示postfix未安装好;CentOS 7开始默认系统自带postfix。)。

代码语言:javascript复制
[root@localhost ~]# systemctl start postfix 启动服务
代码语言:javascript复制
------------编辑主配置文件--------------  
[root@localhost ~]# vi /etc/postfix/main.cf
代码语言:javascript复制
root@localhost ~]# postfix check //检查语法错误(与named-check用法一样)
[root@localhost ~]# systemctl restart postfix //重启服务
[root@localhost ~]# postconf –n //查看postfix的非默认并已生效配置
-------------增加邮件测试帐号--------------
[root@localhost ~]# groupadd mailusers //创建组给测试帐号
[root@localhost ~]# useradd -g mailusers -s /sbin/nologin jack
//创建jack帐户只属于mailusers组并不能登录系统,用于测试邮件
[root@localhost ~]# passwd jack //创建jack密码
[root@localhost ~]# useradd -g mailusers -s /sbin/nologin tom
[root@localhost ~]# passwd tom
--------------连接服务器的25端口进行简单发信测试-----------
[root@localhost ~]# telnet mail.aa.com 25
//连接成功,开始写信
helo mail.aa.com //声明本机的主机
mail  from:jack@aa.com //声明发件人地址
rcpt  to:tom@aa.com //声明收件人地址
data //写正文
i am jack!!
. //正文结束标记
quit // 退出

如图所示:

收信验证
代码语言:javascript复制
[root@localhost ~]# cat /home/tom/Maildir/new/1515968168.Vfd00I306d0f0M475089.localhost.localdomain
成功显示:
搭建dovecot提供收信服务
代码语言:javascript复制
----------------启动服务--------------
[root@localhost ~]# systemctl start dovecot
[root@localhost ~]# netstat -anpt | grep dovecot
//110,143端口需要监听
代码语言:javascript复制
---------------收信验证---------------  
[root@localhost ~]# telnet mail.aa.com 110  
user tom //收件人登录  
pass 123 //邮箱密码  
list //列表查看邮件  
retr 1 //读取编号为1的邮件  
quit //退出邮箱 

如图所示:

验证成功。

用win7客户端outlook2013收信验证
发信认证配置
代码语言:javascript复制
---------安装cyrus-sasl软件-------------
[root@localhost ~]# yum install -y cyrus-sasl* //注意,此处加上“*”,包含安装该软件所包含插件
代码语言:javascript复制
-------------启动服务--------------
[root@localhost ~]# systemctl start saslauthd
[root@localhost ~]# systemctl enable saslauthd

#编辑postfix主配置文件
[root@localhost ~]# vi /etc/postfix/main.cf
添加以下内容:
smtpd_sasl_auth_enable = yes //开启认证。
smtpd_sasl_security_options = noanonymous //不允许匿名发信。
mynetworks = 127.0.0.0/8 //允许的网段,如果增加本机所在网段就会出现允许不验证也能向外域发信。
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination //允许本地域以及认证成功的发信,拒绝认证失败的发信。
将邮件用户名和密码生成密文
代码语言:javascript复制
#下载需要的命令
[root@master ~]# yum install -y perl-String-Format.noarch
#账户加密
[root@master ~]# printf "jack" | openssl base64
amFjaw==
[root@master ~]# printf "000000" | openssl base64
MDAwMDAw
[root@master ~]# telnet mail.aa.com 25
Trying 192.168.200.10..
Connected to mail.aa.com.
Escape character is '^]'.
220 mail.aa.com ESMTP Postfix
ehlo mail.aa.com
250-mail.aa.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login    //认证登录
334 VXNlcm5hbWU6
amFjaw==      //密文用户名
334 UGFzc3dvcmQ6
MDAwMDAw      //密文密码
235 2.7.0 Authentication successful
mail from:jack@aa.com
250 2.1.0 Ok
rcpt to:aa@163.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
this is test
.
250 2.0.0 Ok: queued as 04F27F31FF
quit
221 2.0.0 Bye
Connection closed by foreign host.

邮件群发配置

设置邮件组
代码语言:javascript复制
[root@master config]# vim /etc/aliases
#生成新的hash数据库文件
[root@master config]# newaliases
添加lucy邮件测试用户

发送邮件大小容量的限制

编辑配置文件
代码语言:javascript复制
[root@master config]# vim /etc/postfix/main.cf 最后添加
通过配置用户磁盘配额实现限制用户邮箱空间

开启磁盘配额

代码语言:javascript复制
#查看磁盘配额开启状态
[root@master config]# mount 
代码语言:javascript复制
#卸载home目录的挂载
[root@master config]# unmount /home

#重新挂载
[root@localhost ~]# mount –a

#查看挂载状态
[root@localhost ~]# mount
代码语言:javascript复制
确认home目录磁盘配额已开启
[root@localhost ~]# quotaon -p /home/

由于sda2分区格式为xfs,默认自动开启磁盘配额功能,为jack用户配置磁盘配额限制。

代码语言:javascript复制
[root@localhost ~]# edquota -u jack

配置jack用户邮箱大小为最大10M。

测试
代码语言:javascript复制
[root@master home]# vim /etc/postfix/main.cf 
代码语言:javascript复制
#重启服务
[root@localhost ~]# systemctl restart postfix

发出第三封邮件之后,邮箱提示,硬盘配额溢出。

代码语言:javascript复制
#进入jack用户存放邮件的目录查看接收邮件的大小
[root@localhost ~]# cd /home/jack/Maildir/cur/

系统默认接收到两封邮件后容量已达8.1M,无法再接收第三封3M的邮件,磁盘配额生效,测试成功。

参考链接:https://blog.csdn.net/weixin_43214644/article/details/124582335 https://blog.csdn.net/m0_73966096/article/details/129999670

0 人点赞