一、邮件服务器

1、发送邮件过程

1 (2).png

  • 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