1.2. mail relay 规则详解 [1]

1.2.1. 配置允许本地用户RELAY
1.2.2. 口令验证下的 open relay
1.2.3. 提高安全性:SMTP over SSL

在默认情况下,也就是安装完系统(Sendmail服务器)不做任何设置的情况下,则只能在本机上收发邮件,网络上(局域网或Internet)的任何其它主机不能向该SMTP服务器发送邮件。这往往并不能满足需要。

1.2.1. 配置允许本地用户RELAY

对于内部的邮件服务器或者相对简单的网络环境,允许发送邮件的用户的IP地址相对固定或者完全是内部IP地址,则配置非常简单。

  • 允许其他机器使用邮件服务器发送邮件

    若希望能实现发送,则需满足下面的任何一个条件即可(不需要同时满足):1. 发送者身份属于“本地或者被允许的发送者”;2. 接收者身份属于“本地或者被允许的接收者”

  • /etc/mail/relay-domains

    在配置文件/etc/sendmail.cf中,指定了该文件的路径:

    # Hosts for which relaying is permitted ($=R)
    FR-o /etc/mail/relay-domains
    

    /etc/mail/relay-domains示例:

    localhost.localdomain
    localhost
    127.0.0.1
    10.0.0
    

    即在列表中出现的主机,可以使用本邮件服务器发送邮件。

  • /etc/mail/access

    除了使用文件relay-domains外,还可以使用access文件确定允许relay的主机,在配置文件/etc/sendmail.cf中,指定了该文件的路径:

    # Access list database (for spam stomping)
    Kaccess hash -o /etc/mail/access.db
    

    /etc/mail/access示例:

    localhost.localdomain           RELAY
    localhost                       RELAY
    127.0.0.1                       RELAY
    10.0.0                          RELAY
    

    access文件和relay-domains格式的区别在于access文件中,允许relay的主机名添加RELAY关键字。

    其它的关键字还有:

    • OK

      当有别的规则阻挡,仍旧允许

    • RELAY

      允许转寄

    • REJECT

      拒绝这个来源的信件

    • DISCARD

      丢弃。这种情况下,邮件看上去是正常投递了,但是由于没有人接 受,邮件会自动地“消失”在网络中。

    • 错误代码+任何其他字符串

      将向发信者返回这个字符串作为出错信息。错误代码是R FC 822定义的标准出错代码。如: 550 We don like a spammer!

  • 属于本地/被允许的发送者,则RELAY

    如果在relay-domains或者access文件中列出的是域名,则对发送者的IP地址先查找/etc/hosts文件(一般是如此,如果文件/etc/host.conf采用默认配置的话),如果没有,再查找DNS。查找DNS的过程是:先做IP地址的反向DNS查找,如果能够反向查找出来,且查找出来的主机的域部分属于上面两个文件中列出的域名,再对该主机名做正向DNS查找,若查找出的IP地址(主机的A记录)与发送者IP地址相同,则允许relay邮件,这表明发送者属于被允许的发送者。

    如果正反向解析不一致,则会在/var/log/maillog中记录一行警告信息说"may be forged"(可能被伪造的)。如果收信人也不在access文件列表中,则拒发邮件。

  • 本地或者被允许的接收者,则RELAY

    相对于发送者,这个就非常简单了。只要接收者的email地址的域部分被列在/etc/mail/relay-domains或者/etc/mail/access 文件中,邮件被允许接收。

  • 文件/etc/mail/local-host-names,服务的域名亦可作为本地接收者的判断依据。

1.2.2. 口令验证下的 open relay [2]

对于移动用户的情况,往往网络拓扑复杂,设置/etc/mail/relay-domains,或者/etc/mail/access就不够了。

当前的解决办法有:

  1. 公司设置自己的拨入服务器,仅仅公司员工可以用自己的用户名和密码拨入后发送邮件.

  2. SMTP-After-POP3方法, 修改POP3程序,拨到ISP后先收一次自己的信,POP3检测到收信者IP地址后再动态地加这个IP地址到relay-domains或者access文件中,允许relay默认半个小时.

  3. sendmail 8.10加入了SMTP用户认证功能,发送邮件时提示输入用户名和密码后允许relay.

显然第三种方法是最理想的。

首先检查是否支持 SASL 认证:

#/usr/sbin/sendmail -d0.1 -bv root |grep SASL
NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS QUEUE SASL SCANF

如果出现了 SASL,则sendmail编译时编译了SASL模块,否则需要重新编译 SASL,

设置口令验证,需要修改宏文件 sendmail.mc,如下:

define(QUEUE_DIR,`/var/spool/mqueue/q*')                            1
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl               2
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl 3
dnl define(`confDEF_AUTH_INFO', `/etc/mail/auth/auth-info')         4
dnl FEATURE(`no_default_msa') 
dnl DAEMON_OPTIONS(`Port=smtp,Name=MTA')dnl                         5
DAEMON_OPTIONS(`Port=25,Name=MSA,M=Ea')dnl                          6
1

和认证无关,但是启动了多个邮件队列,希望得到更好的队列处理和性能改进。

2

"TRUST_AUTH_MECH"的作用是使sendmail不管access文件中如何设置,都能 relay 那些通过LOGIN,PLAIN或DIGEST-MD5方式验证的邮件。

3

"confAUTH_MECHANISMS"的作用是确定系统的认证方式。

4

"confDEF_AUTH_INFO"的作用是当你的计算机作为客户机时,向另外一台有smtp认证功能的主机进行认证,用户和密码存放在auth-info文件中,在这个例子中并不需要这个功能,所以注释掉了。

5

设置非口令验证的SMTP端口

6

注释本行,则25端口可以同时进行口令验证和非口令验证,否则只能有完成口令验证,方可发送邮件。

测试:输入如下命令

$ telnet localhost 25
Connected to localhost.
Escape character is '^]'.
220 localhost.localdomain ESMTP Sendmail 8.11.6/8.11.6; Wed, 12 Feb 2003 16:38:34 +0800
ehlo localhost
250-xxxxxxxxxxxxxxxxxxxxxxxxx, pleased to meet you
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-SIZE
250-DSN
250-ONEX
250-ETRN
250-XUSR
250-AUTH LOGIN PLAIN         1
250 HELP
auth login
1

看到本行,则支持口令验证。

Outlook Express使用LOGIN认证,Netscape Mail使用PLAIN认证,Foxmail 3.11 一般使用LOGIN认证

文件:/usr/lib/sasl/Sendmail.conf

pwcheck_method:pam

既然Redhat Linux普遍使用PAM,我们就用PAM 认证。为了支持加密验证,则需要使用SASLDB方式的认证。

文件:/etc/pam.d/smtp

1.2.3. 提高安全性:SMTP over SSL

参见从头安装 sendmail