一. Sendmail及相关概念简介
在Linux下有许多软件可以实现标准的邮件服务。UNIX/Linux 的电子邮件系统模型基本可分为邮件传输代理MTA,邮件投递代理MDA,邮件获取及存储代理MSA,以及邮件客户代理MUA几大模块。
用户代理用来接受用户的指令,将用户的信件传送至信件传输代理,如MS Outlook等;而投递代理则从邮件传输代理取得信件并传送至最终用户的邮箱;实际中,许多邮箱用户并不是时时在线的,不可能将信件直接投递至用户主机,因此就有了MSA(如pop3,imap等)用来代替用户接收邮件。
一个邮件传输代理的主要工作是监视用户代理的请求,根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之间传输并且将接收到的邮件缓冲或者提交给最终投递程序。sendmail是Linux平台上的著名邮件传输代理,它几乎在任何 UNIX 平台上都有相应的版本。它是一个免费软件,可以支持数千甚至更多的用户,而且占用的系统资源相当少。
一封电子邮件的传输过程大致是这样的:当用户编辑完成并试图发送一封电子邮件的时候,用户代理(MUA)则去寻找一个邮件传输代理(MTA),并把邮件提交给它。传输代理得到了邮件后,首先将它保存在自身的缓冲队列中,而后,邮件传输代理程序查找确定此目标地址对应的邮件传输代理服务器,如果是自己负责的域,则根据自身的规则决定接收或者拒绝此邮件;否则,则通过网络将邮件传送给此目标域的SMTP服务器。目标服务器接收到邮件之后,将其缓冲存储在本地,目标收信人便可以通过信箱帐号查收此邮件了。显然,邮件传输是从MTA到MTA的,而且每个用户必须拥有服务器上存储信息的空间(称为信箱)才能接受邮件(发送邮件不受这个限制)。
Sendmail 程序得到一封待发送的邮件的时候,它需要根据目标地址确定将邮件投递给对应的服务器,这是通过 DNS 服务实现的。例如一封邮件的目标地址是 ,那么 Sendmail 首先确定这个地址是用户名(redhat)+机器名(mydomain.org)的格式,然后,通过查询DNS来确定需要把邮件投递给某个服务器。
DNS 数据中,与电子邮件相关的是信件交换(Message eXchange,MX)记录,例如在 mydomain.org这个域的 dns 数据文件中有如下设置:
IN MX 10 mail
mail IN A 192.168.1.6
如果 DNS 查询无法找出对某个地址的MX记录(通常因为对方没有邮件交换主机),那么 Sendmail 将试图直接与来自邮件地址的主机对话并且发送邮件。因此 Sendmail 在确定MX服务器失败后,将从 DNS 取得对方的 IP 地址并直接和对方对话试图发送邮件。
二. SMTP命令简介
SMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码。SMTP 在 TCP 协议 25 端口监听连接请求。
ESMTP (Extended SMTP),顾名思义,扩展 SMTP 就是对标准 SMTP 协议进行的扩展。它与 SMTP 服务的区别仅仅是,使用 SMTP 发信不需要验证用户帐户,而用 ESMTP 发信时,服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与 SMTP 方式没有两样。
SMTP 命令包括:
HELO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
EHLO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL FROM 命令中指定的地址是发件人地址
RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。
DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器应响应 OK
RSET 重置会话,当前传输被取消
QUIT 结束会话
三. 实验环境
本文将配置两台Sendmail服务器,以实现MTA间的邮件交换,实际应用中,邮件的传递也大多都是MTA间的。
|OUTLOOK|-------------------->|MTA1|---------------->|MTA2|
MTA1:
DNS服务器,域:mydomain.org
IN MX 10 mydomain.org.
mydomain.org. IN A 192.168.1.6
/etc/resolv.conf
nameserver 127.0.0.1
nameserver 192.168.1.66
#指向MTA2
MTA2:
DNS服务器,域:benet.org
IN MX 10 benet.org.
benet.org. IN A 192.168.1.66
/etc/resolv.conf
nameserver 127.0.0.1
nameserver 192.168.1.6
#指向MTA1
试验平台为RedHat 9.0;MTA是Sendmail 8.13.8;
四. Sendmail的安装
下载sendmail至/usr/local/src,地址为:
1.先检查本机是否已经开启了MTA,若有,先关闭并卸载它们,如:
#service sendmail stop
#rpm -e sendmail
2. 安装:
#cd /usr/local/src
#tar zxvf sendmail.8.13.8.tar.gz
#cd sendmail-8.13.8
#vi devtools/Site/site.config.m4
添加:
APPENDDEF(`confENVDEF',`-DSASL=2')
APPENDDEF(`conf_sendmail_LIBS',`-lsasl2')
#sh Build
#mkdir -pv /usr/man/man{1,8}
#sh Build install
#mkdir -pv /usr/share/sendmail
#cp -a cf /usr/share/sendmail
#mkdir /var/spool/mqueue
#cd cf/cf
#cp generic-linux.mc sendmail.mc
#make install-cf
#cp sendmail.mc /etc/mail
#cd /etc/mail
#touch aliases access
#echo "mydomain.org">local-host-names
#echo "mail.mydomain.org">>local-host-names
#echo "localhost RELAY" >> access
#echo "127.0.0.1 RELAY" >> access
#makemap hash access.db < access
启动sendmail,
#sendmail -bd -q30m
注:Sendmail的命令参数的含义如下:
-b:指定Sendmail在后台运行,并且监听端口25的请求。
-d:指定Sendmail以Daemon方式运行(守护进程)。
-q:当Sendmail无法将邮件成功地发送到目的地时,它会将邮件保存在队列里。该参数指定邮件在队列里保存的时间。例子里的30m表示保留30分钟。
3.测试发信
#netstat -tnlp |grep :25
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 4636/
#useradd test (添加一个测试用户)
#passwd test
#echo "root:test" >> /etc/mail/aliases
#newaliases
开始连接服务器并测试发信
#telnet localhost 25
mail from:root@mydomain.org
rcpt to:test@mydomain.org
data
THis is a test!!
.
quit
通过发信日志查看邮件发送状态
#tail -20 /var/log/maillog
也可以通过outlook来测试发信。
五、配置并测试转发(RELAY)
1.按上述步骤及第二部分的规划设置好MTA2,并新建一个测试帐号benet
2.在MTA1上,编辑/etc/mail/sendmail.mc,添加如下两行:
include(`/usr/share/sendmail/cf/m4/cf.m4')dnl
FEATURE(`access_db')dnl
注意:FEATURE 要加在MAILER 语句的前面。
3.重新生成sendmail.cf主配置文件
#m4 sendmail.mc> semdmail.cf
4.建立/etc/mail/relay-domains文件,并添加要转发的域,如:
192.168.1
benet.org
5.编辑/etc/mail/access文件,添加:
192.168.1 RELAY
重新生成数据库文件:
#makemap hash access.db < access
6.测试效果:用outlook连接至MTA1,帐户为test,新建一封邮件,目标为,填写好主题及内容后进行发送。而后登录至MTA2,使用benet帐号进行收信。
六、实行身分认证转发
当允许客户端来自互联网时,我们就无法确定其IP地址,因而access的方式也就难以满足这种需求了。此时,我们可以配置sasl的身份认证方式,以实现对客户端的有效过滤。这样,既能满足正常客户的发信需求,也能有效的防止对垃圾邮件的RELAY。下面就来介绍这种方式。
1.执行如下命令,查看sendmail是否sasl2方式的身份认证(按我们如上的步骤编译安装,sendmail是支持此认证的):
# sendmail -d0.1 -bv
Version 8.13.8
Compiled with: DNSMAP LOG MATCHGECOS MILTER MIME7TO8 MIME8TO7
NAMED_BIND NETINET NETUNIX NEWDB PIPELINING SASLv2 SCANF USERDB
XDEBUG
请查看执行结果中是否显示为橙色字体的部分。如果有,则可进行以下步骤,否则,请检查前面的编译安装过程是否有遗漏或错误之处。也可以运行如下命令仔细检查问题所在。
#sendmail -O loglevel=14 -bs
2.编辑/etc/mail/sendmail.mc文件,添加如下几行:
define(`confAUTH_MECHANISMS',`A y')dnl
TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5')dnl
define(`confAUTH_MECHANISMS',`LOGIN PLAIN DIGEST-MD5')dnl
FEATURE(`no_default_msa')dnl
DAEMON_OPTIONS(`Port=25,Name=MTA,M=Ea')dnl
并执行下列命令重新生成/etc/mail/sendmail.cf文件
#m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
3.新建/usr/lib/sasl2/Sendmail.conf
添加如下内容:
pwcheck_method:saslauthd
mech_list:login plain
4.开启saslauthd服务,并让其能在系统开机时自动运行:
#service saslauthd start
#chkconfig --level 35 saslauthd on
5.重启sendmail服务
#killall -9 sendmail
#sendmail -bd -q30m
6.查看开启状况:
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 localhost.localdomain ESMTP Sendmail 8.13.8/8.13.8; Sat, 24 Mar 2007 22:37:15 +0800
ehlo localhost <--此句为输入的命令
250-localhost.localdomain Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-AUTH LOGIN PLAIN DIGEST-MD5
250-DELIVERBY
250 HELP
注意查看是否有显示为类同为橙色部分的行。如果没有,请再检查比照是否执行了以上步骤,以及是否在/etc/mail/sendmail.mc文件中添加有误。
7.outlook客户的设置:
“工具”-->"帐户"-->"属性"-->"服务器"-->勾选 "我的服务器要求身份验证"
注:实验时可以先进行发信,看能否成功;如果不成,再进行以上步骤后看测试效果。