smtp 并不支持身份的验证。所以每个人都可以发送邮件。所以我们希望邮件服务器能够通过对发信人进行验证。

image

系统账户并没有adce账户。但是他还是可以发送邮件的。

image

而且user1还是接受到了该邮件。有时候该邮件可能是垃圾邮件,病毒等等我们不想接受的东西。

这就利用到了sasl

SASL全称Simple Authentication and Security Layer,是一种用来扩充C/S模式验证能力的机制。可以利用SASL来判断用户是否有权使用转发服务,或是辨认谁在使用你的服务器。

我们这时候就要对中继进行配置了。有两种方法验证:

IP地址验证:

账号验证:     本地账号

                  虚拟账号      

邮件服务器可以对特定的IP地址进行中继 。但有时候使用者要到外地出差。这时候用IP地址验证已经行不通了。

邮件服务器对账号进行验证,只有账号验证成功了。才能使用邮件服务器进行发送邮件。  邮件服务器决定是否中继。

首先介绍IP地址的验证

拿sendmail来说

修改中继配置文件如下

[root@mail ~]# vim /etc/mail/access   

Connect:localhost.localdomain           RELAY
Connect:localhost                            RELAY
Connect:127.0.0.1                           RELAY
connnect:192.168.145                     RELAY   //对来自该网段的邮件进行中继

拿postfix来说

255 mynetworks = 192.168.145.0/24, 127.0.0.0/8    //对来自该网段和本区域的邮件进行中继

发送邮件测试,这里就不利用outlook了

[root@mail ~]# telnet 192.168.145.100 25
Trying 192.168.145.100...
Connected to mail.bj.zz.com (192.168.145.100).
Escape character is '^]'.
220 mail.bj.zz.com ESMTP Postfix
mail from:user1@bj.zz.com
250 2.1.0 Ok
rcpt to:user3@sh.zz.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject:qq  
qqqqqqqqqqqqqqqqqqqqqqqqqqqq
.
250 2.0.0 Ok: queued as B0FEB10D74C

查看日志

[root@mail ~]# tail -f /var/log/maillog

Aug 13 04:44:22 mail postfix/qmgr[7697]: A396010D75A: from=<user1@bj.zz.com>, size=383, nrcpt=1 (queue active)
Aug 13 04:44:22 mail postfix/smtp[7779]: A396010D75A: to=<user3@sh.zz.com>, relay=mail.sh.zz.com[192.168.145.101]:25, delay=36, delays=36/0.02/0.06/0.05, dsn=2.0.0, status=sent (250 2.0.0 q7CDIRWZ004886 Message accepted for delivery)
Aug 13 04:44:22 mail postfix/qmgr[7697]: A396010D75A: removed

查看user3用户是否收到邮件

 image

下面介绍账号验证 拿sendmail来说

root@mail ~]# vim /etc/mail/access
[root@mail ~]# rpm -qa |grep sasl      
cyrus-sasl-lib-2.1.22-5.el5
cyrus-sasl-2.1.22-5.el5
cyrus-sasl-devel-2.1.22-5.el5
cyrus-sasl-plain-2.1.22-5.el5
[root@mail ~]# vim /usr/lib/sasl2/Sendmail.conf  

pwcheck_method:saslauthd      //sendmail的验证方法是saslauthd来实现的

首先我们启用sasl验证功能

[root@mail ~]# vim /etc/mail/sendmail.mc

39 define(`confAUTH_OPTIONS', `A y')dnl       //采用身份验证

52 TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl   //支持的身份验证的方法

53 define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl  //验证的机制

116 DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA , M=Ea')dnl    //强制的身份验证

测试如下:

image

我们可以看到这时候邮件发送是采用身份验证的

我们这时候验证的命令是AUTH LOGIN

但这个命令只支持base 64编码。我们这时候可以利用如下命令生成账号base64编码。

[root@mail ~]# echo -n "user1@bj.zz.com"|openssl base64
dXNlcjFAYmouenouY29t

[root@mail ~]# echo -n "123"|openssl base64
MTIz

[root@mail ~]# service saslauthd start            //打开验证功能
启动 saslauthd:                                           [确定]

image

这时候测试一下邮件是否发送成功

[root@mail ~]# su - user2
[user2@mail ~]$ mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/user2": 2 messages 1 new
    1 MAILER-DAEMON@mail.b  Sun Aug 12 19:28  13/548   "DON'T DELETE THIS MESSAGE -- F"
&gt;N  2 user1@bj.zz.com       Mon Aug 13 03:41  14/509   "ooo"
& 2
Message 2:
From user1@bj.zz.com  Mon Aug 13 03:41:45 2012
Date: Mon, 13 Aug 2012 03:39:43 +0800
From: user1@bj.zz.com
X-Authentication-Warning: mail.bj.zz.com: [192.168.145.10] didn't use HELO protocol
subject: ooo

zzzzzzzzzzZZZZZZZZZZZZ

&

我们的邮件已经发送成功

使用outlook时我们需要做如下修改才能成功通过验证发送邮件

image

拿postfix来说

 

255 mynetworks = 127.0.0.0/8    

668 broken_sasl_auth_clients = yes    //启用客户端验证功能
669 smtpd_sasl_auth_enable = yes      //postfix利用sasl进行验证
670 smtpd_sasl_security_options = noanonymous    //不允许匿名账号发送邮件
671 smtpd_sasl_application_name = smtpd              //发送服务器进程
672 smtpd_client_restrictions = permit_sasl_authenticated,reject   //允许经过验证的账户进行发送邮件

673 #smtpd_client_restrictions = permit_sasl_authenticated
674 smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination   //允许通过验证的进行中继。拒绝没有通过验证的。

[root@mail sasl2]# service postfix restart

[root@mail sasl2]# service saslauthd restart

测试发送邮件

[root@mail ~]# telnet 192.168.145.100 25
Trying 192.168.145.100...
Connected to mail.bj.zz.com (192.168.145.100).
Escape character is '^]'.
220 mail.bj.zz.com ESMTP Postfix
mail from:user1@bj.zz.com
250 2.1.0 Ok
rcpt to:user3@sh.zz.com
554 5.7.1 <mail.bj.zz.com[192.168.145.100]>: Client host rejected: Access denied
auth login dXNlcjFAYmouenouY29t
334 UGFzc3dvcmQ6
MTIz
235 2.0.0 Authentication successful
rcpt to:user3@sh.zz.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject:aa
ssssssssssssssssssssssssssss
.
250 2.0.0 Ok: queued as A6CD810D74C

查看日志

Aug 13 05:21:12 mail postfix/qmgr[7892]: A6CD810D74C: from=<user1@bj.zz.com>, size=383, nrcpt=1 (queue active)
Aug 13 05:21:12 mail postfix/smtp[7943]: A6CD810D74C: to=<user3@sh.zz.com>, relay=mail.sh.zz.com[192.168.145.101]:25, delay=80, delays=80/0.02/0.02/0.01, dsn=2.0.0, status=sent (250 2.0.0 q7CDtHrc004985 Message accepted for delivery)

测试user3是否收到邮件

image