一、邮件服务器
1、发送邮件过程
-
MUA邮件用户代理,也就是邮件客户端工具,通过SMTP协议将邮件发送到邮件服务器,通过POP3、IMAP协议从服务器下载邮件。
-
MTA邮件传送代理,服务器接收到MUA发送过来的邮件,MTA通过目标域名判断该邮件的发送到本地域,还是其它域,如果是本地域,就把该邮件交给MDA处理;如果是其它域,向DNS查询该域的MX记录,获得目标服务器的IP地址,然后将该邮件通过SMTP协议传送到目标邮件服务器。
-
MDA邮件分发代理,根据目标地址,把邮件投递到相应用户邮箱。
MDA
-
如果收件人为Postfix本地系统的用户,则他们的邮件会被交给Local MDA处理,凡是收件地址的网域名称与mydestination参数列出的任一网域名称相符,这类邮件都算是本地邮件,对于送到任何mydestination网域的任何有效账户的邮件,Local MDA会先检查收件人是否有个人的.forward文件,如果没有,则邮件会被存入用户的个人邮箱;否则,则依据.forward文件的内容来进行投递操作(或转寄到其他地方,或是交给外部程序处理)。
-
对于需要转寄到他处的邮件,将会被重新提交会Postfix,以便传送到新地址
2、接收邮件过程
客户端MUA,连接到一个POP3或IMAP服务器,由POP3或IMAP服务器去用户对应的邮箱中获取邮件,并回传给MUA
-
smtp协议,25端口,用于发送邮件
-
pop3协议,110端口,用于客户端从服务器下载完整的邮件,下载后的邮件,服务器就删除了。
-
imap协议,143端口,用于客户端只从服务器下载邮件头,实际邮件还是存在服务器上
实现软件:
-
smtp服务器:postfix
-
pop3、imap服务器:dovecot
3、邮件服务器
Postfix是一个邮件传输代理软件 (MTA: Mail Transfer Agent),支持 smtp 协议,主要用于接收和发送邮件。
Dovecot是一个本地邮件传输服务 (LMTP: Local Mail Transfer Protocol service),支持imap和pop3协议,主要用于验证身份,方便客户端连接服务器发送和下载邮件。
注意:
-
邮件服务需要依赖DNS的MX记录
4、postfix
postfix只是一个SMTP服务,默认已经安装
邮件存放地址:/var/spool/mail
邮件存储的两种方式:
-
maibox,全部邮件存入一个文件
-
mail directory,一封邮件一个文件
4.1、安装
#centos7默认已经安装
yum install -y postfix
4.2、查询配置
#列出所有配置
postconf
#只列出inet_interfaces和myorigin两项配置
postconf inet_interfaces myorigin
#列出更改过的配置
postconf -n
#列出没有更过的配置
postconf -d
#更改配置
postconf -e "myorigin=example.com"
4.3、更改配置文件
vi /etc/postfix/main.cf
#指定邮件服务器的主机名
myhostname = mail.example.com
#指定域名
mydomain = example.com
#指定发件人所在域名
myorigin = $mydomain
#监听接口
inet_interfaces = all
#postfix接收邮件时,收件地址的域名与mydestination参数列出的任一域名相符,就认为此邮件是本地邮件。
#默认没有指定$mydomain,会拒收此域名的邮件
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#允许内网开放中继的网段,也就是允许内网哪些客户端通过该SMTP服务器中继邮件。
#默认SMTP,不需要认证,可通过此方式作访问限制
mynetworks = 0.0.0.0/0
#指定邮件存放位置,在每个用户的家目录下的Maildir目录下
#默认,所有用户邮件存放在:/var/spool/mail
home_mailbox = Maildir/
#检查配置语法
postfix check
#重启服务
systemctl restart postfix
4.4、创建用户
注意:
-
不能使用Root远程登陆
#创建不能登陆的用户
useradd -s /sbin/nologin user1
#密码
passwd user1
4.5、测试
#提供mail工具
yum install -y mailx
mail -s "hello" root
this is a test mail
ctrl+d
echo -e "this is a test mail" |mail -s 'hi' root
4.6、使用telnet发邮件
#telnet登陆到smtp服务器
telnet mail.exmaple.com 25
#声明本机的主机名
helo mail.example.com
#声明发件人
mail from:user1@example.com
#声明收件人
rcpt to:user2@example.com
#开始写邮件正文件,以点结束
data
hello...
.
#退出
quit
5、dovecot
支持pop3s,imaps
5.1、安装
#默认开启了POP3,IMAP
yum install -y dovecot
5.2、配置文件
vi /etc/dovecot/dovecot.conf
#指定要支持的协议
protocols = imap pop3 lmtp
#监听
listen = *
#信任的IP或网段
login_trusted_networks = 0.0.0.0/0
5.3、配置存储
vi /etc/dovecot/conf.d/10-mail.conf
#根据postfix的配置,指定去哪儿取邮件
#根据上面postfix的配置,在每个用户家目录下的Mialdir目录下
mail_location = maildir:~/Maildir
#如果postfix使用的是默认配置,使用以下配置
mail_location = maildir:/var/mail/%u
5.4、配置认证
vi /etc/dovecot/conf.d/10-auth.conf
#开启纯文本认证
#比如,使用系统用户认证,就是纯文本
disable_plaintext_auth = no
auth_mechanisms = plain login
-
plain,plain是最简单的机制,但同时也是最危险的机制,因为身份证书(登录名称与密码)是以base64字符串格式通过网络,没有任何加密保护措施。因此,使用plain机制时,可能要结合tls。
-
login,login不是正式支持的机制,但某些旧版的mua使用这种机制。类似plain。
5.5、关闭SSL
vi /etc/dovecot/conf.d/10-ssl.conf
#启用SSL
ssl = no
注意:
-
默认启用了SSL,就不允许纯文本身份验证
-
使用纯文本身份验证,此处必须设置为no
#重启服务
systemctl restart dovecot
5.6 补充:加密配置
#启用加密
ssl = required
#证书位置
ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
#私钥位置
ssl_key = </etc/pki/dovecot/private/dovecot.pem
cd /etc/pki/tls/certs
#制作自签名证书,默认使用RSA,证书和私钥在一个文件里
make dovecot.pem
cp dovecot.pem /etc/pki/dovecot/private/
cp dovecot.pem /etc/pki/dovecot/certs/
#重启服务
systemctl restart dovecot
5.7、测试
mutt -f imap://server0.example.com
6、空客户端
所谓空客户端,也就是把postfix配置成一个客户端。
作为客户端须满足以下条件:
-
本地发送的任何邮件都会转发到现有邮件中继服务器
-
本地postfix服务不接受任何中继请求
-
用户可以在本地读取和发送电子邮件
6.1、配置
vi /etc/postfix/main.cf
#指定中继服务器是谁,用中括号括起来,就不会再去找DNS解析MX记录了
relayhost = [mail.example.com]
#仅监听回环口
inet_interfaces = loopback-only
#指定只转发哪些网段来的邮件
mynetworks = 127.0.0.0/8 [::1]/128
#指定发送邮件时的域名,如果不指定,就用本地主机名代替
myorigin = example.com
#为空,本地不作为任何邮件域的端点
mydestination=
#不将任何邮件发送到本地邮箱,也就是本地不保存邮件。
local_transport = error: local delivery disabled
#可参考:/usr/share/doc/postfix-2.10.1/README_FILES/STANDARD_CONFIGURATION_README
#重启服务
systemctl restart postfix
6.2、测试
#给user1发送一封邮件,标题是:hello world,邮件内容是:this is a test mail
mail -s “hello world” user1@example.com
this is a test mail
.
-
点代表结束输入
6.3、查看邮件
#登陆到user1
mutt -f imaps://imap0.example.com
7、SMTP认证
基本的smtp协议没有验证用户身份的能力
从postfix的角度看,它需要扮演两种角色:当它身为smtp server时,需要能够验证用户个人的身份(让他们能使用smtp server寄出邮件);当它身为smtp client时,它需要能够提供出自己的身份证书给其他mta检验(以便通过远程mta将邮件递送到最终目的地)。因此,我们也会解释如何设定 postfix,使其能通过其他mta的身份验证。
RFC 2554 “smtp service extension for authentication”制定了如何在基本smtp协议上增加验证功能的机制,此机制使得smtp能使用sasl协议来验证客户端身份。我们将使用carnegie mellon大学开发的cyrus sasl函数库来扩充postfix,使其具备sasl验证能力。cyrus sasl函数库的研发进度,目前分为两条线路,即sasl与saslv2。其中,sasl已经逐渐被saslv2所取代。
有许多客户机/服务器协议没有验证能力,sasl就是用于加强或增加这类协议的一种通用方法
7.1、SASL
cyrus sasl支持多种验证机制,至于要使用哪一种验证机制,客户端与服务器双方必须事先取得共识。以下是一些比较常见的机制;
-
plain,plain是最简单的机制,但同时也是最危险的机制,因为身份证书(登录名称与密码)是以base64字符串格式通过网络,没有任何加密保护措施。因此,使用plain机制时,你可能会想要结合tls。
-
login,login不是其正式支持的机制,但某些旧版的mua使用这种机制,所以cyrus sasl让你可选择其是否支持login机制。如果你的用户仍在使用这类老掉牙的mua,你必须在编译sasl函数库时,指定要包含login的支持。login的证书交换过程类似plain。
-
otp,otp是一种使用“单次密码”的验证机制。此机制不提供任何加密保护,因为没必要(每个密码都只能使用一次),每次联机都要改用新密码。smtp client必须能够产生otp证书。
-
digest-md5,使用这种机制时,client与server共享同一个隐性密码,而且此密码不通过网络传输。验证过程是从服务器先提出challenge(质询)开始,客户端使用此challenge与隐性密码计算出一个response(应答)。不同的challenge,不可能计算出相同的response;任何拥有secret password的一方,都可以用相同的challenge算出相同的response。因此,服务器只要比较客户端返回的response是否与自己算出的response相同,就可以知道客户端所拥有的密码是否正确。由于真正的密码并没有通过网络,所以不怕网络监测。
-
kerberos,kerberos是一种网络型验证协议。除非你的网络已经使用kerberos,否则你应该用不到kerberos机制;相对的,如果你的网络已经架设了kerberos验证中心,sasl就能完美的将smtp验证整合进现有的体系。
-
anonymous,anonymous机制对smtp没有意义,因为smtp验证的用意在于限制转发服务的使用对象,而不是为了形成open relay,sasl之所以提供这种机制,主要是为了支持其他协议。
当客户端链接到一个支持sasl的邮件服务器时,服务器会以优先级列出可用的机制供客户端选择。如果客户端也支持多钟机制,则当第一种机制验证失败时,客户端可能会继续尝试第二种机制,直到通过验证或是所有机制都失败为止。如果双方在一开始就无法协调出共同的机制,验证过程就算失败。一旦双方在使用哪种机制上达成共识,就开始进行验证过程。
sasl验证架构可以使用现有的unix系统密码,也可用smtp用户专用密码文件。如果你的网路上kerberos之类的中间控制式验证构架,也可以使用。
注意:
-
postfix不能直接访问系统密码文件,cyrus函数库对于这个问题的解决办法,是提供一个特殊的验证服务器程序,称为saslauthd,它能够代替postfix来取得密码数据
-
saslauthd daemon本身需要特权身份,不过,由于它是一个独立于postfix之外的进程,而且通常不必于外界进行网络通信,所以安全性的危害已经被降到最低
7.2、安装cryrus-sasl
yum install -y cyrus-sasl-*
7.3、更改postfix配置文件
vi /etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP
#启用SMTP认证
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_application_name = smtpd
#设定邮件中有关收件人部分的限制
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,reject_unknown_sender_domain
#使用SASL认证机制
smtpd_sasl_auth_enable = yes
#让不支持RFC2554的smtpclient也可以跟postfix做交互。
broken_sasl_auth_clients = yes
#指定SMTP认证的本地域名
smtpd_sasl_local_domain = $myhostname
#取消匿名登陆方式
smtpd_sasl_security_options = noanonymous
7.4、配置 sasl2
vi /etc/sysconfig/saslauthd
SOCKETDIR=/var/run/saslauthd
#指定以本地系统用户名认证
MECH=shadow
vi /etc/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
log_level:3
saslauthd_path:/var/run/saslauthd/mux
7.5、重启saslauthd服务
systemctl enable saslauthd.service
systemctl restart saslauthd.service