Linux 邮件服务部署与配置
1. 实验介绍
1.1 实验内容
在生活中经常会用到邮件来收发信息,那么具体是如何实现的呢?本节实验主要介绍了一些常见的邮件服务以及他们的相关术语,然后我们一起来学习如何搭建一个邮件服务来实现邮件的收发过程,以及邮件服务的实现。
1.2 实验知识点
- 常见邮件服务
- 邮件服务相关术语
- 搭建邮件服务——Postfix
- 邮件服务实现
1.3 推荐阅读
2. 常见邮件服务
在 Linux 环境下邮件传输代理,被称为 MTA(Mail Transfer Agent),常见的 MTA 有 Sendmail、Qmail、Postfix、exim 及 Zmailer 等。
- Sendmail
sendmail 是最古老的 MTA 之一,是一种通用互联网络电子邮件路由工具,支持多种邮件传输和传输方法。虽然设计得比较灵活,便于配置和运行于各种类型的机器上,但 Sendmail 在大多数系统上只能以根用户身份运行。
- Qmail
Qmail 是新生一代的 MTA 代表,以速度快、体积小、易配置安装等特性而著称。作者 D.J.Bernstein 使用了多种当时比较先进的技术,包括 Maildir,sendmail单个 binary 不同的模块化设计,权限分离,以及使用了大量由他编写的配套工具。
- Postfix
Postfix 是 Wietse Venema 在 IBM 的 GPL 协议之下开发的 MTA 软件,并提供给用户除 sendmail 以外的选择。如今已是独树一帜,流水线、模块化的设计,兼顾了效率和功能。主要的特点有速度快、稳定,配置功能强大,提供了与外部程序对接的 API/protocol。本实验正是基于postfix服务器软件来d搭建邮件服务器。
- exim
Exim 是在类 Unix 操作系统上使用的邮件传输代理(MTA),其目标是成为一个灵活的通用邮件程序,具有广泛的检查传入电子邮件的功能。最大的特点就是配置简单性,但是其安全性不如 Qmail 及 Postfix。
- Zmailer
ZMailer 是一个高性能、多进程的 Unix 系统邮件传输代理。适用于网关或邮件服务器或对邮件功能有极高要求的其他大型网站环境。
3. 邮件服务相关术语
3.1 邮件服务系统体系结构
完整的邮件系统通常包括了三个部分:
- 用户邮件代理(Mail User Agent,MUA)
即本地的邮件客户端,是用户与邮件系统的接口,负责用户和邮件服务器之间的交互工作。其作用是将邮件发送到邮件服务器上和从邮件服务器上接收邮件。
- 邮件服务器
是邮件系统的核心,主要功能是发送和接收邮件,并向发件人告知邮件的传送情况。邮件服务器根据其功能,可以分为邮件传输服务器和邮件接收服务器。
- 电子邮件协议
- SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),是一种提供可靠、高效的电子邮件传输协议。SMTP 规定了如何在网络上的两台主机间可靠、高效地传送邮件。SMTP 默认端口为:25。
- POP3(Post-Office Protocol,邮局协议的第 3 版本)是本地电子邮件客户端使用的应用层互联网标准协议,用于通过 TCP/IP 连接从远程服务器检索电子邮件。 POP 已经通过多种版本发展,版本 3(POP3)是最常用的标准。POP 服务端是非常简单小巧的,单一的一台机器可以为数以千计的用户提供服务。
- IMAP4(Internet Message Access Protocol 4, Internet 信息访问协议的第 4 版)是电子邮件客户端用来通过 TCP/IP 连接从邮件服务器检索电子邮件的 Internet 标准协议。 IMAP 由 RFC 3501 定义。
- LMTP(Local Mail Transfer Protocol,本地邮件传输协议)是 ESMTP(简单邮件传输协议(SMTP)的扩展)的衍生产品。
3.2 邮件服务工作原理
- MDA(Mail Delivery Agent):将接收的邮件存放到对应用户邮筒当中的程序。通过分析 MTA 所收到邮件的表头或内容,来判断此邮件是属于哪个用户,然后决定将此邮件投递给哪个用户的邮筒里。
- MRA(Mail Retrieval Agent):用于从远程邮件服务器检索或提取电子邮件,并与邮件传递代理一起将邮件传递到本地或远程电子邮件邮箱。
工作原理
用户(MUA)通过 SMTP 协议将邮件发送到服务器,服务器分解发现如果是本地的邮件传输则通过 LMTP 来传送,如果是远程邮件将调用本地的客户端使用 SMTP 协议向对方服务器传送。
当对方的服务器接收到邮件之后,发现如果不是本机所负责的域,则将邮件交给本机的邮件客户端,根据邮件目标域请求 DNS 解析,将邮件发送到目标服务器,或者丢至下一中转邮件服务器此过程称为邮件中继,如果发现是本机负责区域内的用户,SMTPD 将邮件转交给 MDA,由 MDA 把邮件传递到用户的邮筒。
3.3 邮件服务器和 DNS 的关系
- 发送邮件时,需要向 DNS 请求查询对方邮件服务器的 MX 记录。
- DNS 查询 MX 记录信息。
- 将查询到的 MX 信息返回给请求方。
- 发送方根据 MX 记录优先级,将邮件投递给优先级高的邮件服务器(mail1)。
- 如果邮件服务器过于繁忙,或者连接不上的时候,会将邮件投递给优先级较低的邮件交换器(mail2)上。
注:MX 记录是邮件交换记录,指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。
4. 搭建邮件服务——Postfix
4.1 Postfix 特点
- 性能好,比 sendmail 快很多,一台运行 postfix 的 pc 每天可收发上百万邮件
- 免费
- 兼容 sendmail
- 健壮稳定,在重负荷之下仍然可以正常工作。当系统运行超出了可用的内存或磁盘空间时,postfix 会自动减少运行进程的数目。当处理的邮件数目增长时,postfix 运行的进程不会跟着增加
- 灵活性好,postfix 是由许多的小程序组成的,每个程序完成特定的功能。可以通过配置文件设置每个程序的运行参数
- 安全性,postfix 具有多层防御结构,可以有效地抵御恶意入侵者,可以运行在较低的权限之下
4.2 配置过程
配置过程中,postfix 通过 Internet 发送和接收 email,并存储在用户邮箱。同时客户也可以通过 IMAP 或者 POP3 获取邮件。其中,客户认证是通过 Courier Authdaemon 模块的。过程如图所示:
4.3 在 Centos 下安装 Postfix 软件
$ sudo yum install postfix
4.4 Centos 下配置 Postfix
Postfix 可以通过配置文件来设置程序的运行参数。下面对配置文件 /etc/postfix/main.cf 进行操作:
我们查看一下 /etc/postfix/main.cf 配置文件的详细内容,通过下面的命令。
$ sudo cat /etc/postfix/main.cf
常见参数说明:
- myhostname :设置系统主机名,例如:host.shiyanlou.com
- mydomain :设定邮件系统的域名。例:mydomain = domain.tld
- alias_map :设定本地交付代理使用的别名数据库列表。默认列表是依赖于系统的。
- alias_database :使用 newaliases 或sendmail -bi 构建别名数据库。这是一个单独的配置参数,因为 alias_maps 可以指定不仅仅由 Postfix 控制的表。
- myorigin :设置发件人邮件的域名。默认的 myorigin = $myhostname 对于小型网站来说是足够的。如:myorigin = $myhostname 或 myorigin = $mydomain。如果使用多台计算机运行域,则应该将其更改为 myorigin = $mydomain,并设置一个域别名数据库,将每个用户别名为
[email protected]
。
- mydestination :指定 postfix 接收邮件时收件人的域名,和 myorigin 相似,例如:mydestination = shiyanlou.com 或 mydestination = localhost.$mydomain 或 mydestination = $myhostname
- mynetworks :指定所在网络的网络地址,例如:127.0.0.1/8 。
- inet_interfaces :设定邮件系统接收邮件的网络接口地址。默认情况下,声明机器上的所有活动接口。即:inet_interfaces = all。(或者指定主机名: inet_interfaces = $myhostname 、inet_interfaces = $myhostname, localhost)
- inet_protocols :启用 IPv4 和 IPv6(如果支持)。
可以通过 sudo postconf -d | grep my 选择查看系统默认的设定。
$ sudo vim /etc/postfix/main.cf
在配置文件中找到下面的参数进行修改:
- 设置 myhostname => myhostname = host.shiyanlou.com
- 设置 mydomain => mydomain = shiyanlou.com
- 设置 myorigin => myorigin = $mydomain
- 设置 mydestination => mydestination = $myhostname,localhost.$mydomain
- 设置 mynetworks => mynetworks = 127.0.0.0/8 10.29.112.0/22 101.37.20.0/22(此处的 ip 地址根据你的主机进行相应修改)
- 设置 alias_maps => alias_maps = hash:/etc/postfix/virtual
- 设置 inet_interfaces => inet_interfaces = all
设置完成保存退出。
可以通过下面命令来查看修改的情况。
sudo cat /etc/postfix/main.cf | grep -v ^#| grep -v ^$
完整配置文件中的参数配置可以参考官方文档中的介绍。
4.5 启动服务
$ sudo service postfix restart
$ ps -ef | grep postfix
启动出错的话可以检查 systemctl status postfix 命令的输出,根据其中的 failed 出现的语句进行排错。
例如如果 /etc/hosts 文件中有 ::1 ipv6 相关的信息的话,那么使用 inet_interfaces= all 就会报没有找到 ipv6 接口的错误。需要删除 /etc/hosts 中的相关解析
从图中可以看到启动的三个守护进程 : master、qmgr 和 pickup。
4.6 编辑邮件地址
在配置文件时,我们将 alias_map 指向了一个 virtual 文件,这里需要我们自定义设置一些邮箱地址来传送邮件。
$ sudo vim /etc/postfix/virtual
设置一个表,对应相关的邮件地址。
[email protected] master
[email protected] shiyanlou
设置完成后保存退出。
然后,调用命令来实现映射。
$ sudo postmap /etc/postfix/virtual
接着重启 postfix 服务,完成修改
$ sudo systemctl restart postfix #如果你已经开启了 postfix,可能会提示已经开启了服务。
4.7 telnet 测试
可以先通过 netstat 命令来验证 Postfix 是否正在监听 25 端口。
netstat -ant
然后我们可以进行一个古老的 telnet 测试 。
$ telnet localhost 25
helo localhost # 发送 helo 验证对方服务器是否在线
mail from:[email protected] # 发送方所在域
rcpt to:[email protected] # 接受方所在域
data # 编写邮件内容
Telnet test # 邮件 title
Hello,this is shiyanlou! # 正文
. # 结束
quit # 退出
这样就完成了一个简单的邮件发送的过程。
Postfix 部署及配置操作视频:
5. 邮件服务实现
5.1 编写邮件
$ vim email.txt
保存退出
5.2 发送邮件并查看
$ mail -s "test" [email protected] < email.txt
# '-s' 是指邮件的标题, '<' 后面是要发送的邮件。
$ mail
# 用来查看邮件的命令
点击 ENTER 可以查看邮件内容,输入 quit 即可退出。
6. Ubuntu 下安装配置 Postfix 软件
以下为大家提供 ubuntu 中搭建的方式:
$ sudo apt-get update
$ sudo apt-get install postfix
安装时需要选择服务器类型,推荐选择 Internet Site。因为这是最符合的服务器类型,然后点 ENTER 确认。
接下来是给服务器设置域名,例如:shiyanlou.com,然后点 ENTER 确认。
配置文件
在 Ubuntu 系统下安装 postfix 的过程中就已经为 Postfix 配置了域(domain),同时也启动三个守护进程 : master、qmgr 和 pickup。
可以通过命令来查看下三个守护进程。
$ ps ax | grep postfix
配置 /etc/postfix/main.cf 文件。
$ sudo vim /etc/postfix/main.cf
修改如下参数:
- 设置 myhostname,myhostname = shiyanlou.com
- 设置 alias_map,alias_maps = hash:/etc/postfix/virtual
- 设置 mynetworks,它定义为可以使用这台服务器的主机,这里我们就用本地地址,也可是设置为其他地址。
设置完成保存退出。
安装收发邮件的软件
Ubuntu 中需要安装一个收发邮件的软件
$ sudo apt-get install mailutils
可以创建用户 master 来发送邮件
$ sudo useradd -d /usr/master -m master
# -d和-m选项为master产生一个主目录/usr/master
$ sudo passwd master
# 设置密码
编写邮件
$ vim email.txt
保存退出
发送邮件
$ mail -s "test" [email protected] < email.txt
# '-s' 是指邮件的标题, '<' 后面是要发送的邮件。
然后切换到 master 查看邮件。
$ su master
$ mail
# 用来查看邮件的命令
点击 ENTER 可以查看邮件内容,输入 quit 即可退出。
补充:mail 的更多用法可参看这个链接
7. 总结
通过本节实验可以了解到常见的一些邮件服务,熟悉如何搭建一个邮件服务系统。