前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >玩转企业常见应用与服务系列(七):邮件服务 Postfix 原理与实践

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

作者头像
民工哥
发布2023-11-21 16:45:04
6221
发布2023-11-21 16:45:04
举报

前面介绍了企业常用服务 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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 民工哥技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Postfix 简介
    • 邮件服务知识扩展
      • Postfix的模块有哪些呢?
      • Postfix 的四种邮件队列?
      • Postfix 对邮件风暴的处理
      • Postfix 对无法投递的邮件的处理
      • Postfix的安全性
      • Postfix 邮件处理过程
        • 接收的过程
          • 邮件的投递过程
          • CentOS 7 搭建 Postfix 邮件服务器
            • 准备工作
              • 搭建postfix并配置
                • 收信验证
                  • 发信认证配置
                    • 将邮件用户名和密码生成密文
                    • 邮件群发配置
                      • 设置邮件组
                        • 添加lucy邮件测试用户
                        • 发送邮件大小容量的限制
                          • 编辑配置文件
                            • 通过配置用户磁盘配额实现限制用户邮箱空间
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档