Sendmail relay规则及配置文件用法汇总

来源:互联网 发布:淘宝代销如何刷单 编辑:程序博客网 时间:2024/06/15 04:40

1. Sendmail

1.1. M4 和 sendmail.cf
1.2. mail relay 规则详解
1.2.1. 配置允许本地用户RELAY
1.2.2. 口令验证下的 open relay
1.2.3. 提高安全性:SMTP over SSL
1.3. 别名 aliases 和 .forward 文件
1.3.1. /etc/mail/aliases
1.3.2. ~/.forward
1.4. 用 virtusertable 管理虚拟域
1.5. 其它配置文件
1.5.1. /etc/mail/domaintable
1.5.2. genericstable和genericsdomain
1.5.3. /etc/mail/mailertable
1.6. 地址伪装
1.7. DNS 和 Email
1.8. 配置pop3
1.9. 从头安装 Sendmail
1.9.1. 下载软件包
1.9.2. 安装 SASL,以支持SMTP认证 [2]
1.9.3. 支持SMTP over SSL
1.9.4. 安装 sendmail
1.9.5. 配置 sendmail — 支持 SMTP 认证 [2]
1.9.6. 配置 sendmail — 支持 SMTP over SSL [4]
1.9.7. 配置 sendmail — 证书管理
1.9.8. 配置pop3
1.9.9. 关于权限
1.9.10. 启动 sendmail
1.10. 邮件分拣
1.10.1. vacation 自动回信
1.10.2. procmail
1.11. FAQ

可以通过命令 telnet <email_server> 25 , 或者命令 sendmail -dt -d0* , 来查看sendmail版本号。如果需要配置 smtp over ssl,则最好使用 8.12版本以上的 sendmail。

由于 Sendmail 有着长期的安全漏洞历史,更需要着重注意 sendmail 的版本更新。

[警告] 

Recent Sendmail Vulnerabilities:

  1. 2003.3.3, Sendmail 检查接收邮件标题字段的代码中,发现了缓冲区溢出的安全漏洞。

    美国CERT/CC、美国Internet Security Systems(ISS)以及美国Sendmail.org等公司 于美国当地时间3月3日发出警告,在具有代表性的邮件服务器软件“Sendmail”中发现 了严重的安全漏洞。影响版本涉及 5.79 至 8.12.7。请立即升级至 8.12.8。

Sendmail 作为 Linux, BSD 和其它 Unix 平台的“标配”,被广泛使用。再加上众多的相关软件支持,Sendmail 配置应该算得上是系统管理员的基本技能。Sendmail 主要的配置文件如下:

  1. /etc/sendmail.cf

    Sendmail 核心配置文件

  2. /etc/aliases

    邮件别名文件

  3. /etc/mail/relay-domains

    设定可RELAY的域名

  4. /etc/mail/access

    设定处理来信的方式:RELAY等


1.1. M4 和 sendmail.cf

Sendmail的配置文件 sendmail.cf 算得上“臭名昭著”,看看这个文件一定会让你头大,几乎没有人从头来写这个文件。关于 sendmail.cf 的详细内容,参见:Sendmail Installation and Operation Guide --- THE WHOLE SCOOP ON THE CONFIGURATION FILE。

通过使用 m4 宏处理命令,由宏文件 sendmail.mc 来生成复杂的配置文件 sendmail.cf,一切变得简单多了。

/etc/mail/sendmail.mc 文件即是原始宏文件。生成配置文件 sendmail.cf 的命令为:

$ m4 sendmail.mc > sendmail.cf

默认的配置文件仅仅能在本机发送邮件,如果需要更强的功能,需要修改宏文件:sendmail.mc

缺省的sendmail.mc文件:

divert(-1)                                     1dnl This is the sendmail macro config file. If you make changes to this file,dnl you need the sendmail-cf rpm installed and then have to generate adnl new /etc/sendmail.cf by running the following command:dnldnl        m4 /etc/mail/sendmail.mc > /etc/sendmail.cfdnlinclude(`/usr/share/sendmail-cf/m4/cf.m4')VERSIONID(`linux setup for Red Hat Linux')dnl  2OSTYPE(`linux')                                3dnl Uncomment and edit the following line if your mail needs to be sent outdnl through an external mail server:dnl define(`SMART_HOST',`smtp.your.provider')  4define(`confDEF_USER_ID',``8:12'')dnl          5undefine(`UUCP_RELAY')dnlundefine(`BITNET_RELAY')dnldefine(`confAUTO_REBUILD')dnldefine(`confTO_CONNECT', `1m')dnldefine(`confTRY_NULL_MX_LIST',true)dnldefine(`confDONT_PROBE_INTERFACES',true)dnldefine(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnldefine(`ALIAS_FILE', `/etc/aliases')dnl        6dnl define(`STATUS_FILE', `/etc/mail/statistics')dnldefine(`UUCP_MAILER_MAX', `2000000')dnldefine(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnldefine(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn,restrictqrun')dnldefine(`confAUTH_OPTIONS', `A')dnldnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnldnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnldnl define(`confTO_QUEUEWARN', `4h')dnldnl define(`confTO_QUEUERETURN', `5d')dnldnl define(`confQUEUE_LA', `12')dnldnl define(`confREFUSE_LA', `18')dnldnl FEATURE(delay_checks)dnlFEATURE(`no_default_msa',`dnl')dnlFEATURE(`smrsh',`/usr/sbin/smrsh')dnl        7FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnlFEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl 8FEATURE(redirect)dnlFEATURE(always_add_domain)dnl                9FEATURE(use_cw_file)dnl                      10FEATURE(use_ct_file)dnl                      11dnl The '-t' option will retry delivery if e.g. the user runs over his quota.FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnlFEATURE(`access_db',`hash -o /etc/mail/access.db')dnlFEATURE(`blacklist_recipients')dnlEXPOSED_USER(`root')dnldnl This changes sendmail to only listen on the loopback device 127.0.0.1dnl and not on any other network devices. Comment this out if you wantdnl to accept email over the network.DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl NOTE: binding both IPv4 and IPv6 daemon to the same port requiresdnl       a kernel patchdnl DAEMON_OPTIONS(`port=smtp,Addr=::1, Name=MTA-v6, Family=inet6')dnl We strongly recommend to comment this one out if you want to protectdnl yourself from spam. However, the laptop and users on computers that dodnl not have 24x7 DNS do need this.FEATURE(`accept_unresolvable_domains')dnl     12dnl FEATURE(`relay_based_on_MX')dnlMAILER(smtp)dnlMAILER(procmail)dnlCwlocalhost.localdomain
1

divert(-1),从这行以下到divert(0)之间会被忽略,不会加到产生出来的*.cf文件中,通常放一些版权信息之类。

2

放入一些版本信息

3

根据平台设置,产生相关环境设定

4

行首的 dnl 相当于注释

5

行尾的 dnl 用于去掉行尾的空格、回车换行,以避免生成的文件包含过多的空行。

6

设置别名文件。亦可设置多个别名文件,如:define(`ALIAS_FILE', `/etc/aliases,/usr/local/majordomo/majordomo.aliases')dnl

7

smrsh 即 sendmail restricted shell。简而言之smrsh限制了攻击者可以执行的程序集。当它与sendmail程序一起使用的时候,smrsh有效的将sendmail可以执行的程序的范围限制在smrsh目录之下。

8

允许在同一个主机上使用多个虚拟域

9

即使是本地传送的信件,也会加上domain-name。

10

会参考 /etc/mail/local-host-names 来决定哪些domain-name是local-host。

11

会参考 /etc/mail/trust-users 文件,来决定哪些用户可以以其它身份发信而不产生警告。Majordomo 用户需要属于 trust-users。

12

发件人的地址如果不能解析,也能发送成功。避免由于域名解析受限制而拒收邮件。

修改该配置如下:

dnl Dmworldhello.netdnl Dwmaildnl define(`confDOMAIN_NAME', `$w.$m')dnl                    1... ...FEATURE(`domaintable',`hash -o /etc/mail/domaintable')       2... ...FEATURE(`genericstable',`hash -o /etc/mail/genericstable')   3... ...GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain')             4... ...dnl  DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')     5... ...FEATURE(`accept_unqualified_senders')dnl                     6... ...define(confMAX_HOP,30)                                       7... ...Cwlocalhost.localdomain your_real_domain                      8... ...
1

如果sendmail不能正确判断本机域名,使用由变量 $w 和 $m 确定的域名。

2

添加配置,提供地址重写方式

3

添加配置,提供地址重写方式

4

添加配置,提供地址重写方式

5

注释掉本语句的目的是侦听所有网卡,为整个网络提供服务

6

允许未加域名的发件人发送邮件,默认禁止。

7

设置转发的地址不能超过30个。

8

定义类$w,在此处或者外部文件中定义。用于设置服务器提供服务的域名,即本地主机名。

外部文件通常为 sendmail.cw,新版本为 local-host-names。但也有可能是其他名称,用如下命令查看:

$ grep "^Fw" sendmail.cf Fw/etc/mail/local-host-names

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.localdomainlocalhost127.0.0.110.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           RELAYlocalhost                       RELAY127.0.0.1                       RELAY10.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 SASLNAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS QUEUE SASL SCANF

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

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

define(QUEUE_DIR,`/var/spool/mqueue/q*')                            1TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl               2define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl 3dnl define(`confDEF_AUTH_INFO', `/etc/mail/auth/auth-info')         4dnl FEATURE(`no_default_msa') dnl DAEMON_OPTIONS(`Port=smtp,Name=MTA')dnl                         5DAEMON_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 25Connected to localhost.Escape character is '^]'.220 localhost.localdomain ESMTP Sendmail 8.11.6/8.11.6; Wed, 12 Feb 2003 16:38:34 +0800ehlo localhost250-xxxxxxxxxxxxxxxxxxxxxxxxx, pleased to meet you250-ENHANCEDSTATUSCODES250-8BITMIME250-SIZE250-DSN250-ONEX250-ETRN250-XUSR250-AUTH LOGIN PLAIN         1250 HELPauth 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



[1] 来源:Sendmail relay规则及配置文件用法汇总

[2] 来源:Redhat 7.1下的Sendmail SASL认证的实现


1.3. 别名 aliases 和 .forward 文件

1.3.1. /etc/mail/aliases
1.3.2. ~/.forward

1.3.1. /etc/mail/aliases

一个重要的邮件重写规则。root 用户可以通过对该文件的配置,建立邮件组、重定向本地用户等等。别名文件会循环检查,直到影射到的邮件地址不在本机接收之列(参见配置文件/etc/mail/local-host-names)。

示例:

user1:        me@otherdomain.com,user2,user3    1user2:        user2@otherdomain.comalises:       :include:/etc/mail/filealiases    2list-request: |/usr/local/bin/auto_reply        3nobody:       /dev/null                         4
1

逗号分隔多个地址。

2

对于经常变化的邮件列表,可以采用外部文件方式。一个邮件一行。

3

管道

4

设备文件

更改别名文件后使用newaliases或sendmail -bi建立邮件别名文件的二进制数据文件。

特殊的别名

  1. owner-aliasname : address

    设置该别名后,退信将退回到owner-xxx 别名下。

1.3.2. ~/.forward

别名文件一般由root用户管理,而普通用户则可以通过用户主目录下的 .forward 文件,实现邮件别名、转发等一系列处理功能。

当一个别名解析成一个本地用户地址后,sendmail 察看该用户主目录是否存在 .forward 文件,如果存在,读取该文件中的内容,决定进一步的处理方式。

.forward 文件可以通过三种不同的处理方式,对接受的邮件进行处理:定义存储邮件的邮箱文件名(以字符“/”开始的文件名)、进行转发的目的地址、管道(以字符“|”开始,对电子邮件进行处理的外部应用程序)。可以使用第三种方法“管道”,来启动 Procmail。 该文件格式类似 aliases 文件,但是省略了冒号之前的部分,毕竟.forward只针对一个特定的本地用户么。

例如:用户 johnson,需要将其邮件拷贝一份给 jiangxin,再回复给发信人说本人正在度假(通过 vocation 程序实现),但仍然保留给自己一份。如果 .forward 内容如下,则会造成死循环:

jiangxin"|/usr/ucb/vacation johnson"johnson

解决办法是在 johnson 前面加上斜线 \,则再次发送给 johnson 时,则不会再次处理 .forward 文件。修改后如下:

jiangxin,"|/usr/ucb/vacation johnson",\johnson

1.4. 用 virtusertable 管理虚拟域

如同Apache一样,sendmail也允许使用虚拟主机功能,这是通过FEATURE(virtusertable)功能实现的,而虚拟主机的文件缺省是/etc/mail/virtusertable。这个文件的形式类似于aliases文件,即:左地址 右地址 ,中间用Tab键分开。还需要注意的是,虚拟域(左地址的域名),应该属于本机接收之列

joe@yourdomain.com      jschmoe                         1bogus@yourdomain.com    error:nouser No such user here  2@testdomain.com         test@mydomain.com               3@yourdomain.com         %1@othercompany.com             4
1

这样一行意味着本来应该发送给 joe@yourdomain.com 的邮件现在要发送给本机的 用户 jschmoe。

2

发向 bogus@yourdomain.com 的邮件,返回错误信息。

3

意味着所有发往 xxx@testdomain 的邮件都会被发送到 test@mydomain.com。

4

代表参数转义,例如 user1@yourdomain.com 的邮件被发送到user1@othercompany.com。

aliases 文件同样可以将本地用户,映射到其它地址,那么和 virtusertable 的优先级如何?[1]

  1. 当接收者邮件地址的域部分在 /etc/mail/local-host-names 中又在/etc/mail/virtusertable中时,优先检查virtusertable文件,应用该文件中的定义规则.

  2. 要应用virtusertable规则,则接收者邮件地址的域部分必须在 /etc/mail/local-host-names 文件中存在

  3. 若接收者邮件地址的域部分在 /etc/mail/local-host-names 文件中但不在 virtusertable 文件中有相应的定义则先只应用 aliases 中的定义去扩展别名,一旦扩展出的别名接收者邮件的域部分在 virtusertable 中有定义行时则决不再别名下去,马上运行virtusertable中的定义规则。


1.5. 其它配置文件

1.5.1. /etc/mail/domaintable
1.5.2. genericstable和genericsdomain
1.5.3. /etc/mail/mailertable

优先级:domaintable > virtusertable > local-host-names > mailertable > DNS MX记录

1.5.1. /etc/mail/domaintable

  1. 无论什么时候,domaintable都是优先检查,且没有任何附加条件,无条件检查,与/etc/mail/local-host-names中是否有某域名无关。

    而 virtusertable 要求域名属于本机接收之列。

  2. 一般地用来做域名更换,假如你的公司@abc.com可能被员工误打为abd.com,则放入下面的行到 /etc/mail/domaintable

    abd.com  abc.com 
  3. 使用 domaintable ,发件人和收件人的地址全部被替换。

    而使用 virtusertable 仅仅将邮件的信封地址替换、信头地址不变,而且也仅仅替换收件人地址。

1.5.2. genericstable和genericsdomain

若文件/etc/mail/genericstable 的内容为:

jwu jwu@sources.com 

若文件/etc/mail/genericsdomain的内容为:

test.com 

如果该SMTP服务器从互联网上收到一封发送者邮件地址为jwu@test.com的信,则发送者邮件地址被重写为jwu@sources.com,且message envelope中的return address也是jwu@sources.com

1.5.3. /etc/mail/mailertable

跨越DNS的MX的记录,优先于MX记录,可以与MX记录指定的主机设定不同. mailertable的运用不需要接收者邮件地址的域部分在/etc/mail/local-host-names中存在.

sh.abc.com relay:[192.168.11.1]bj.abc.com smtp:mail.bj.abc.com

则发送给jwu@sh.abc.com,发送给192.168.11.1, 并且邮件头显示:“received by shmail[192.168.11.] for jwu@sh.abc.com”

发送给 user@bj.abc.com,通过服务器 mail.bj.abc.com 转发。



1.6. 地址伪装

我遇到的一个需要地址伪装的例子是,一个应用软件需要频繁在用户之间发送邮件,公司的邮件服务器要求身份认证,而该软件不支持,于是配置了一个内部邮件服务器作为该软件要求的SMTP服务器。但是问题又来了,如果发件人地址属于公司的邮件地址,则邮件回被退回,仍旧报告发件人需要身份验证。于是想到了将发件人地址伪装。

那么何为邮件的地址伪装呢?地址伪装只伪装邮件的发送者部分。凡是转发邮件的发送者地址属于"本地域"(不包含"@域名"只有用户名的地址,或者由 class{w})或者包含在 MASQUERADE_DOMAIN 的定义当中,则将发送者地址伪装为 MASQUERADE_AS 定义的地址。例如:采用如下配置后,user1@domain1.com 发送给 user2@domain1.com 的邮件,被重写为由 user1@domain2.com 发送给 user2@domain1.com;同样根据定义,本地域发出的邮件,也要将发送者的邮件地址写为MASQUERADE_AS 定义的地址,即 @domain2.com。配置如下:

FEATURE(masquerade_envelope)MASQUERADE_DOMAIN(domain1.com)MASQUERADE_AS(domain2.com)

FEATURE(masquerade_envelope) 很重要。如果没有定义该 Feature,则只修改邮件 header 部分的 From 地址,而不修改信封地址,邮件回复仍然回复到伪装前的地址。

常用的几个伪装规则:

MASQUERADE_AS(domain2.com)                 1MASQUERADE_DOMAIN(domain1.com)             2MASQUERADE_DOMAIN_FILE(`filename')         3FEATURE(allmasquerade)                     4FEATURE(masquerade_entire_domain)          5MASQUERADE_EXCEPTION(`host.domain1.com')   6EXPOSED_USER(`root majordomo')             7EXPOSED_USER_FILE(`filename')              8FEATURE(masquerade_envelope)               9
1

指出将要伪装成的域名

2

除了本地域以外,其它需要被替换的地址

3

除了本地域以外,其它需要被替换的地址,列在文件 filename 中

4

还伪装message header中的To:地址

5

若选择,则 *.domain1.com 都被转化为 domain2.com,否则只有 domain1.com 被转化为 domain2.com

6

当设置了伪装整个域时,需要排除的个别不要伪装的主机地址

7

个别用户不需要伪装,允许暴露出真实的邮件主机名,则在此设置。如 root, majordomo 用户。

8

同上,但用户名保存在文件中。

9

伪装message envelope部分的return address,当不能交付邮件并退回给发送者时会用到该地址

关于地址伪装的几个重要参考:

  • Sendmail Masquerade Capabilities

  • MASQUERADING AND RELAYING


1.7. DNS 和 Email

sendmail 使用类$w列出主机名。对于DNS中的A记录,必须在$w类中列出,但对于CNAME别名记录,DNS会自动检索出来。

如果DNS中有MX记录,则只需要在sendmail主机名中列出域名即可。

DNS的设置参见:《DNS 配置示例》。






第一部分 mail relay 规则详解  

一. 软件环境:Sendmail 8.9.3至8.12  
  
二. 默认情况下的relay规则  
  
在默认情况下,也就是安装完系统(Sendmail服务器)不做任何设置的情况下,则只能在 
本机上收发邮件, 网络上(局域网或Internet)的任何其它主机不能向该SMTP服务器发 
送邮件,若希望能实现发送,则需满足下面的任何一个条件即可(不需要同时满足):  
  
1. 发送者身份属于“本地或者被允许的发送者”。  
2. 接收者身份属于“本地或者被允许的接收者”。  
3. 发送者通过SMTP AUTH认证(自Sendmail 8.10起)  
  
也就是说,不管是邮件的发送者还是邮件接收对象只要其中之一属于本地或被允许的 
时候,Sendmail邮件服务器才允许relay你的邮件.那么什么是“本地/被允许的发送 
者”呢? 实际上只有一种,就是列在文件/etc/mail/relay-domains(默认安装后无 
此文件,你可以创建它)或者/etc/mail/access中的域名或者IP地址行,如:  
  
abc.com (/etc/mail/relay-domains)  
abc.com relay (/etc/mail/access)  
  
注:  
a.我们假定某公司域名为abc.com  
b.上面的两行含义相同,只是在不同的文件中所要求的语法不同而已,在/etc/mail 
/access文件中需要加上 relay.  
===先讨论域名的情况:  
  
回到前面所说的何谓“本地/被允许的发送者”,如果在relay-domains/access文件 
中列出的是域名,  
则对发送者的IP地址先查找/etc/hosts文件(一般是如此,因为默认情况下对Linux 
服务器来说,查找DNS是  
先查找/etc/hosts文件看是否有此IP地址对应的主机域名,如无再做反向DNS查找, 
如果能够反向查找出来,  
且查找出来的主机的域部分属于上面两个文件中列出的域名,再对该主机名做正向DNS 
查找出的IP地址  
(主机的A记录)与发送者IP地址相同,则允许relay邮件,这表明发送者属于被允许 
的发送者。  
  
也就是说,先看/etc/host.conf文件中的定义,一般是这样:  
order hosts,bind  
multi on  
  
其中的order行指明先查/etc/hosts,再找DNS数据库。现在举个例子:  
如下图:  
   
  
在内部LAN上有一台windows PC,简称机器A,主机名为jephe.abc.com向一台连接内部 
LAN和Internet的  
一台Sendmail SMTP服务器,简称机器B发送邮件,地址分别为192.168.11.12 和 192 
.168.11.5 ,  
SMTP服务器外部地址为1.2.3.4  
专线连接Internet.假定该公司域名为abc.com,机器B既是SMTP服务器也是DNS服务器 
,在此我们不考虑  
防火墙的设置,即在内部LAN方向上所有的机器对于192.168.11.5内部网卡接口可以 
自由进入(允许所有  
的通过192.168.11.5来自/去往192.168.11.0/24网段的TCP/IP包)。  
  
如果在机器B的/etc/mail/relay-domains或者/etc/mail/access文件中有一行  
abc.com  
或者  
abc.com relay  
当A向B发送邮件时,若B能在它的/etc/hosts中找到一行如  
192.168.11.12 jephe.abc.com  
则允许A向B发送邮件,也就是接收从A发来的所有邮件,不管是去向哪里,因为这种 
情况符合第一种relay  
规则,即发送者是被允许的发送者。此时不需要再查找DNS了,到此为止。邮件已经 
被接收。  
如果在/etc/hosts中找不到与192.168.11.12(发送者IP地址)对应的行,则再查找DNS 
,对192.168.11.12做  
反向解析,如果能在反向DNS数据库中找到对应192.168.11.12的主机记录,且找出来 
的主机名再从DNS中  
正向查找若两者一致,则允许relay,跟上面的情况一样,属于第一种被允许的relay 
规则。  
如:  
在DNS数据库中找到192.168.11.12对应的DNS主机名为jephe.abc.com.  
且又在@abc.com域的DNS中查找到对应于主机jephe的A类记录地址为192.168.11.12, 
则满足条件。  
发送者属于本地域,即被允许的发送者。  
  
需要注意的是,必须正反向解析都需要能解析且一致才行,否则不允许relay,且会在 
/var/log/maillog中  
记录一行警告信息说"may be forged"(可能被伪造的)  
  
但也并非所有记录"may be forged"信息到/var/log/maillog文件中的情况都不允许 
relay,也有的情况下  
虽然记录了一条警告消息说"may be forged",但邮件仍然被接收了,是在下面的情况 
下:  
  
例如: 在B机上/etc/mail/relay-domains中有下面两行  
abc.com  
yahoo.com  
  
[注:在此不再累述关于/etc/mail/access,因为前面已经说了在/etc/mail/relay- 
domains  
中的一行如  
abc.com  
相当于/etc/mail/access中一行  
abc.com relay  
故在下文中不再累述,只提/etc/mail/relay-domains或者/etc/mail/access.]  
  
若A向B发送邮件到 someone@yahoo.com . 在B机的/etc/hosts中没有相应的对应于192 
.168.11.12的记录行。  
且在B机(DNS服务器)上不能对IP地址192.168.11.12做反向查找,或者能做反向查 
找如查找出来为  
jephe.abc.com但在正向查找(对abc.com域的主DNS数据库中查找对应于主机jephe的 
A记录)中没有对应于  
主机jephe的A记录,或者有但找出来的IP地址不是192.168.11.12的话。  
但是。接收者是someone@yahoo.com,域yahoo.com在/etc/mail/relay-domains中。则 
还是允许relay。  
但就会记录警告消息may be forged到/var/log/maillog文件中,这种允许属于第二 
种mail relay规则:  
接收者是被允许的接收者。因此,只要是正反向DNS不一致总会记录该警告消息到maillog 
中。  
Sendmail不是单纯地查看反向DNS解析,而后正反都要匹配,否则不relay,为什么如 
此?在后面我们会举  
例说明。  
  
由此我们引出===什么是“本地的或者被允许的接收者”?  
  
这个比较简单,也就是接收者的email地址的域部分被列在/etc/mail/relay-domains 
或者/etc/mail/access  
文件中,如上面的情况,发到@yahoo.com域的任何接收者都被允许接收。  
注意一个范围问题,如果发送者的域名(根据前面说的/etc/hosts或者正反向DNS一 
致的解析)被列在这两个  
文件中,则该发送者可以发送给任何人的邮件,都能被接收,但若不是这种情况,则 
只能发送到接收者的  
email地址的域名在这两个文件中的那些接收者。后者的情况接收对象的范围要比前 
者小。  
  
再引出另一个值得注意的问题,就是在文件relay-domains或者access中列出的域名 
既是针对发送者来说的,也  
是针对接收者而言的。对于发送者来说,检查/etc/hosts,和正反向DNS,对于接收 
者而言,仅检查接收者邮件  
地址的域部分。  
  
还有,对于第二种mail relay规则,还多一种情况,即:  
若接收者的域名部分被列在/etc/sendmail.cw中,则该接收者也属于本地接收者。  
  
(默认情况下,sendmail.cw是在/etc下,当然你也可以直接更改/etc/sendmail.cf中 
的sendmail.cw路径)  
然后检查别名文件aliases (具体路径靠你的定义)去扩展别名。  
  
举个例子:  
   
  
假若公司abc.com在北京,上海和深圳有分公司,总部在北京,放一台mail 服务器  
  
在北京电信局,且其它各分公司,上海,北京,深圳都各自用专线连到当地的ISP。 
   
所有外部进入发到someone@abc.com的邮件都首先经过存放在北京电信局的mail.abc 
.com  
邮件主机,在该邮件服务器上的/etc/sendmail.cw中有一行abc.com,则发到@abc.com 
的邮件  
经过mail.abc.com时检查别名文件aliases.  
若有三行如下:  
  
shuser:shuser@sh.abc.com  
bjuser:bjuser@bj.abc.com  
szuser:szuser@sz.abc.com  
  
则发到shuser@abc.com,bjuser@abc.com和szuser@abc.com的邮件分别被别名为  
shuser@sh.abc.com,bjuser@bj.abc.com和szuser@sz.abc.com,然后分发到各分公司 
的Sendmail SMTP  
邮件服务器。  
  
注意:Sendmail检查别名文件是不停地做检查直到不能再做为止。具体是这样的,象 
上面的文件中的  
的三行,如果mail.abc.com收到一封信是shuser@abc.com,发现abc.com在sendmail 
.cw中,则接收该邮件  
(为什么?因为接收者的email地址的域部分在sendmail.cw文件中则是本地接收者, 
relay规则第二点)  
本地接收者则检查别名文件,别名到shuser@sh.abc.com,然后再把别名出来的email 
地名域部分,现在是  
sh.abc.com,与sendmail.cw中的列出的域比较,若仍符合则继续别名下去直到不能 
符合条件为止。  
  
现在引出一个问题就是注意不要使得别名检查循环下去,象上面的情况下,若加sh. 
abc.com到sendmail.cw中  
则出现别名检查循环而出错。  
现在,经过别名之后如何再发送邮件呢?一般的发送邮件过程是这样的:  
  
若上面的服务器mail.abc.com收到一封发到shuser@abc.com的信,则先经过别名为shuser 
@sh.abc.com后  
  
1. Sendmail请求DNS给出主机sh.abc.com的CNAME记录,如有,假若CNAME到shmail.abc 
.com,则再次请求  
DNS查找看是否有shmail的CNAME记录,直到没有为止  
2. 现在我们假定没有任何CNAME记录存在,仍然是shuser@sh.abc.com.则Sendmail请 
求DNS给出sh.abc.com的  
MX记录,并得到一个这样的记录:  
sh MX sh.abc.com  
3. Sendmail请求DNS给出sh.abc.com的A记录(IP地址),返回值为1.2.3.4  
4. 与1.2.3.4建立SMTP连接,然后发送邮件.  
  
前面说明了在/etc/mail/relay-domains或者/etc/mail/access中有域名的情况,若只 
有IP地址呢?  
若  
  
192.168.11.12  
或者  
192.168.11.12 relay  
  
则直接就是单纯地指发送者机器的IP地址. 可以是内部网段的保留地址  
A类: 10.0.0.0--10.255.255.255 (10.0.0.0/8)  
B类: 172.16.0.0-172.31.255.255 (172.16.0.0/12)  
C类: 192.168.0.0--192.168.255.255 (192.168.0.0/16)  
也可以是外别真实IP地址,如果如此,由直接允许一个拨号上来的真实IP地址relay邮 
件.  
注意下面的两个问题:  
  
问题1: 公司对移动用户的考虑.  
在上面的图二中的左边部分实际就是图一.以图一为例.假若上海公司某员工不在公司 
里时,用笔记本拨  
上海电信163上网,该员工不能简单地设置发送邮件服务器为sh.abc.com(1.2.3.4).既 
使你的Outlook  
Express中设置的邮件地址为jephe@abc.com .为什么?  
  
因为Sendmail根本不检查你的发送者邮件地址,而是你拨号上来的IP地址,但是你拨号 
上来的IP地址是动态  
随机分配的,而且由该IP地址反向解析出来的域名是ISP的域名,不是@abc.com ,实际 
上,在你拨号上来得到  
一个IP地址后向sh.abc.com发送邮件时,建立到1.2.3.4的25端口的TCP连接时,Sendmail 
只知道你的IP地址,  
然后在应用层收到数据后反向检查DNS查找该IP地址对应的域名,但是它是ISP的域名 
.与你的组织毫无关系.  
而且大多数ISP没有为拨号IP地址段设置反向DNS查找记录.  
  
故对那些拨到ISP的公司员工,需要用公司的服务器作为发送邮件服务器的话,公司的 
邮件服务器没法配置  
使得仅仅允许公司的员工做它做为发送邮件服务器,没法仅仅relay公司的在外的需拨 
到ISP的员工的信.  
  
当前的解决办法:  
a. 公司设置自己的拨入服务器,仅仅公司员工可以用自己的用户名和密码拨入后发送 
邮件.  
b. SMTP-After-POP3方法, 修改POP3程序,拨到ISP后先收一次自己的信,POP3检测到 
收信者IP地址后  
再动态地加这个IP地址到relay-domains或者access文件中,允许relay默认半个小时 
.  
c. sendmail 8.10加入了SMTP用户认证功能,发送邮件时提示输入用户名和密码后允 
许relay.  
  
问题2: 为什么必须正反向解析一致,为什么may be forged?  
假若一黑客组织操纵了一个ISP机构,如果你的Sendmail仅仅检查反向DNS解析出来的 
域名,如是你的公司域名  
则允许relay mail的话,则被黑客集团操纵的ISP机构可以把其所拥有的IP地址段在自 
己的反向DNS数据库中  
设置反向解析出来的域为你的公司域名,然后你的sendmail不加区别地relay它.认为 
该ISP的用户为自己的  
本地/被允许的发送者,则后果可想而知.  
  
上面介绍了Sendmail控制mail relay的几个文件:  
sendmail.cw  
access  
relay-domains  
aliases  
总结一下:  
<< Sendmail 怎样才会 relay your mail? >>  
条件一: 发送者是被允许的发送者:  
这要看文件/etc/mail/relay-domains或者/etc/mail/access两文件中列出的域名和 
IP地址行,  
对IP地址,就检查发送者的IP地址是否允许,若不符合,且有域名在里面,则检查/etc/ 
hosts和正反向DNS  
解析看是否有对应记录,看反向解析出来的域名是否符合条件.  
条件二: 本地/被允许的接收者.  
同样地是要看/etc/mail/relay-domains或者/etc/mail/access文件,看接收者邮件地 
址的域部分是否  
列在上述两文件中,另外还多一项检查文件就是sendmail.cw,列在该文件中的域名被 
认为是本地接收者.  
检查别名文件进行扩展.  
  
其它情况都拒绝relay.  
  
第二部分 sendmail 配置文件  
为了解释所有的配置文件,下面列出的M4源文件enable了所有的本书提到的配置文件 
如下:  
=====================================  
include(`../m4/cf.m4')  
define(`confDEF_USER_ID',``8:12'')  
OSTYPE(`linux')  
undefine(`UUCP_RELAY')  
undefine(`BITNET_RELAY')  
define(`confAUTO_REBUILD')  
define(`confTO_CONNECT', `1m')  
define(`confTRY_NULL_MX_LIST',true)  
define(`confDONT_PROBE_INTERFACES',true)  
  
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')  
define(`ALIAS_FILE',`/etc/mail/aliases')  
define(`confPRIVACY_FLAGS',`authwarnings,needmailhelo,noexpn,novrfy')  
FEATURE(`smrsh',`/usr/sbin/smrsh')  
FEATURE(`mailertable',`hash -o /etc/mail/mailertable')  
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable')  
FEATURE(`domaintable',`hash -o /etc/mail/domaintable')  
FEATURE(`genericstable',`hash -o /etc/mail/genericstable')  
GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain')  
FEATURE(allmasquerade)  
FEATURE(masquerade_envelope)  
MASQUERADE_AS(mydomain.com)  
FEATURE(redirect)  
FEATURE(always_add_domain)  
FEATURE(use_cw_file)  
FEATURE(local_procmail)  
MAILER(procmail)  
MAILER(smtp)  
FEATURE(access_db)  
FEATURE(`blacklist_recipients')  
========================================  
所有的配置文件如下:  
/etc/mail/mailertable  
/etc/mail/domaintable  
/etc/mail/genericstable  
/etc/mail/genericsdomain  
/etc/mail/virtusertable  
  
我们以上面图二中的最左边的上海部分的网络结构为例子来说明上面五个配置文件的 
适用规则和用法.  
你不用在意我举的例子中的网络环境,不管举什么例子,你只要搞懂了各个文件的在什 
么情况下适用就行.  
重新画图如下:  
  
   
  
/etc/mail/virtusertable用法  
1.假如在sh.abc.com上/etc/sendmail.cw中有下面两行:  
public.sta.net.cn  
sh.abc.com  
且/etc/mail/aliases中有下面两行(假定/etc/sendmail.cf中路径为/etc/mail/aliases 
)  
admin:jwu@sh.abc.com  
jwu:jwu@yahoo.com  
则当从[myPC]发送邮件到admin@public.sta.net.cn (outgoing server:sh.abc.com 
)时.  
这封信最终被发往哪里去了?  
  
===>答: 一般情况下,最终应被发送到jwu@yahoo.com信箱中.为什么?  
因为经过了两次别名检查.最后yahoo.com不在/etc/sendmail.cw文件中,故不再检查 
别名.直接  
发送到jwu@yahoo.com.  
  
2.但不完全如此,在下面的情况下有例外(并非一定要做别名检查到底的).  
若在/etc/mail/virtusertable中有下面的行  
@sh.abc.com %1@[192.168.11.1]  
且 /etc/sendmail.cw中有  
sh.abc.com  
且/etc/mail/aliases中有一行  
jwu: wat@yahoo.com  
  
则发到jwu@sh.abc.com的信是解析到wat@yahoo.com还是jwu@[192.168.11.1]呢?  
====>答: 解析到jwu@[192.168.11.1]  
  
再来看个例子:  
3.若还是上面的图三, /etc/mail/virtusertable 中有  
@sh.abc.com %1@[192.168.11.1]  
/etc/sendmail.cw中有  
sh.abc.com  
public.sta.net.cn  
/etc/mail/aliases中有:  
admin:jwu@sh.abc.com  
jwu:wat@yahoo.com  
则发到admin@public.sta.net.cn的信最终被交到哪里wat@yahoo.com还是jwu@[192. 
168.11.1]?  
===>答: jwu@[192.168.11.1]  
  
结论:  
a.当接收者邮件地址的域部分在/etc/sendmail.cw中又在/etc/mail/virtusertable 
中时,  
优先检查virtusertable文件,应用该文件中的定义规则.(例子2)  
b.要应用virtusertable规则,则接收者邮件地址的域部分必须在/etc/sendmail.cw文 
件中存在(例子2和3)  
c.若接收者邮件地址的域部分在/etc/sendmail.cw文件中但不在virtusertable文件 
中有相应的定义  
则先只应用sendmail.cw中的定义去扩展别名,一旦扩展出的别名接收者邮件的域部分 
在virtusertable  
中有定义行时则决不再别名下去,马上运行virtusertable中的定义规则(例子3)  
  
  
/etc/mail/mailertable用法  
注意: 并不是只要邮件送到该服务器且接收得的域部分在mailertable中有relay定 
义就可以被relay,  
仍然需要满足文章前面提到的两个前提条件,athen与SH不一样之处就是athena上有 
/etc/mail/access定义  
relay所有发到xxx@sg.globalsources.com的邮件而SH没有。  
  
跨越DNS的MX的记录,优先于MX记录,可以与MX记录指定的主机设定不同.  
4.如果 /etc/mail/mailertable有  
sh.abc.com relay:[192.168.11.1]  
且/etc/sendmail.cw中有  
sh.abc.com  
且/etc/mail/virtusertable中有  
@sh.abc.com %1@[192.168.11.1]  
则发到jwu@sh.abc.com的信去向是哪里?  
===>答: 运用virtusertable规则,转变为jwu@[192.168.11.]后再发送到内部主机shmail 
   
  
但a.如果没有/etc/mail/virtusertable则查找本地别名文件  
b.如果/etc/sendmail.cw也没有或为空,则检查/etc/mail/mailertable发送到  
jwu@sh.abc.com的信到内部主机shmail(192.168.11.1)  
  
注:转变为jwu@[192.168.11.1]再发送和把发往jwu@sh.abc.com的信发到192.168.11 
.1主机是不一样的  
概念. 如果从邮件头信息来看,则前者是received by shmail[192.168.11.1] for jwu 
@[192.168.11.1]  
;而后者是 received by shmail[192.168.11.] for jwu@sh.abc.com  
  
结论:  
a. 优先级顺序是virtusertable>sendmail.cw>mailertable>DNS MX记录  
b. mailertable的运用不需要接收者邮件地址的域部分在sendmail.cw中存在.  
c. mailertable用来跨越DNS,优先于DNS的MX记录.  
  
/etc/mail/domaintable 用法  
在任何情况下,domaintable都是最优先检查的,作用有二:一主要是防止对自己公 
司的域名的误打,  
二是对自己公司新旧域名的替换。例子5如下:  
5. 若/etc/mail/domaintable中有yahoo.com sh.abc.com  
且/etc/sendmail.cw中有sh.abc.com  
且/etc/mail/virtusertable中有@sh.abc.com %1@[192.168.11.1]  
且/etc/mail/mailertable中有 sh.abc.com relay:[192.168.11.1]  
则发到jwu@yahoo.com的信最后发到哪里去了。  
===> 转变为jwu@[192.168.11.1].  
因为首先检查domaintable文件,jwu@yahoo.com被进行域替换为jwu@sh.abc.com.然 
后发现  
sh.abc.com在/etc/sendmail.cw中且在virtusertable中,则优先检查virtusertable 
中的规则转变  
邮件地址为jwu@[192.168.11.1]  
假如上面的情况下,/etc/sendmail.cw中没有sh.abc.com行,则被域替换后则去检查 
mailertable中的规则  
,然后发送邮件地址jwu@sh.abc.com到192.168.11.1服务器。  
  
无论在哪里情况下(指mailertable还是virtusertable),最后收件人收到信后检查 
邮件头信息时,在  
message header中的to:行都是jwu@sh.abc.com. 你在message header中找不到任何 
jwu@yahoo.com的信息,  
但在message envelope中的第一个received行中有jwu@yahoo.com的记录。  
  
结论:  
1.无论什么时候,domaintable都是优先检查,且没有任何附加条件,无条件检查, 
与sendmail.cw中是否有某  
域名无关。  
2.一般地用来做域名更换,假如你的公司@abc.com可能被员工误打为abd.com,则放 
入下面的行到  
/etc/mail/domaintable  
abd.com abc.com  
  
/etc/mail/genericstable and /etc/mail/genericsdomain 的用法  
  
作用: 重写发送者邮件地址,考虑下面的图四:  
  
   
考虑上面的情况,在公司LAN上有两台PC,A 和 B.在内部的邮件服务器C上的帐号分别 
为  
jwu@domain.com 和 tom@domain.com,通过PPP方式连入ISP,且两个人在ISP  
上各自有自己的邮件地址jephe@isp.net和tomyh@isp.net.现在需要做到:  
如果jwu要发送一个封件给tom,则希望被服务器C收到并直接在本地交付给B,且发送 
者  
邮件地址为jwu@domain.com,但若jwu要发送一个信给外部互联网上某用户,则希望 
被对方  
收到后的发送者邮件地址为jephe@isp.net,即在ISP上的邮件帐号。  
====》则需要服务器C上的Sendmail能做到这一点。这就要用到genericstable  
和  
genericsdomain.在下面的条件同时满足时才能做到。  
  
先考虑不管是发送给tom还是互联网上某用户都更改为jephe@isp.net的情况:  
1. jwu在自己的PC A机上的Outlook Express中设置客户端邮件地址为  
jwu@domain.com  
2. 服务器C在/etc/mail/genericstable中设置下面的行  
jwu jephe@isp.net  
3. 服务器C在/etc/mail/genericsdomain中有下面的行  
domain.com  
上述三个条件同时满足时,则jwu向C发信给任何人时,发送者邮件地址都重写为  
jephe@isp.net,同样的情况应用于tom.  
假如要求发送给本地用户如tom时发送者邮件地址为jwu@domain.com,则没有基于  
M4的解决方案,你需要找到/etc/sendmail.cf中的下面行删除两行。  
S10  
R<@> $n errors to mailer-daemon  
R@ <@ $*> $n temporarily bypass Sun bogosity  
R$+ $: $>50 $1 add local domain if needed  
R$* $: $>94 $1 do masquerading <-- delete this line  
#  
# Header sender rewriting  
#  
S30  
R<@> $n errors to mailer-daemon  
R@ <@ $*> $n temporarily bypass Sun bogosity  
R$+ $: $>50 $1 add local domain if needed  
R$* $: $>93 $1 do masquerading <-- delete this line  
  
再举个例子,考虑下面的图五  
   
  
在SMTP服务器上设置下面的:  
/etc/mail/genericstable  
jwu jwu@sources.com  
/etc/mail/genericsdomain  
test.com  
如果该SMTP服务器从互联网上收到一封发送者邮件地址为jwu@test.com的信  
,则发送者邮件地址被重写为jwu@sources.com,且message envelope中的return address 
也是  
jwu@sources.com  
  
结论:  
a.当发送者邮件地址的用户部分和域部分被分别列在/etc/mail/genericstable和/etc 
/mail/  
genericsdomain两个文件中时,发送者邮件地址被重写为/etc/mail/genericstable中 
被定义的  
邮件地址.  
b.不管是从局域网发进来的还是从互联网上进来的,只要是经过Sendmail服务器处理 
时就检查规则  
  
第三部分 Sendmail Masquerading  
常用的几个伪装规则:  
1.MASQUERADE_AS(yourdomain.com)  
2.FEATURE(allmasquerade)  
3.FEATURE(masquerade_envelope)  
4.MASQUERADE_DOMAIN(mydomain.com)  
5.FEATURE(masquerade_entire_domain)  
  
MASQUERADE_AS(yourdomain.com) 指出其它所有的伪装规则起作用后伪装成哪个域名 
。  
默认情况下仅伪装from:行和reply to:行的邮件地址.  
  
FEATURE(allmasquerade) 伪装message header中的to:地址  
FEATURE(masquerade_envelope) 伪装message envelope部分的return address,当不 
能交  
付邮件并退回给发送者时会用到该地址.  
  
问题一:伪装在什么情况下发生?  
当下列条件同时满足时实现伪装:  
a. 客户端Outlook Express中的地址的域部分在/etc/sendmail.cw文件中,即为本地 
域.  
b. 客户端直接发送邮件到sendmail服务器或者是sendmail服务器收到某个从互联网 
进来的邮件  
,但from行指出的发送者邮件地址的域部分在/etc/sendmail.cw中  
也就是只要经过了这台Sendmail邮件服务器的话,  
=====>然后伪装发送者邮件地址的域部分为 MASQUERADE_AS(yourdomain.com) 中指 
定的域  
yourdomain.com  
  
举个例子:  
如果/etc/sendmail.cw中有一行  
yahoo.com  
且设置了MASQUERADE_AS(domain.com)  
且发送者客户端设置了邮件地址为 jwu@yahoo.com.则  
经过了这台装有Sendmail的SMTP服务器时,发送者邮件地址被重写成jwu@domain.com 
   
如果接收者是jwu@yahoo.com,且设置了FEATURE(allmasquerade),则也重写接收者地 
址为  
jwu@domain.com  
  
再举个例子:  
如果MASQUERADE_AS(domain.com)被设置了,且设置了MASQUERADE_DOMAIN部分,则伪 
装整个域中  
的所有主机。例如设置了如下:  
MASQUERADE_AS(masq.com)  
MASQUERADE_DOMAIN(foo.org)  
MASQUERADE_DOMAIN(bar.com)  
FEATURE(masquerade_entire_domain)  
则*foo.org和*bar.com都被转化为masq.com,否则只有foo.org和bar.com被转化为masq 
.com.  
  
第四部分 常见问题处理方法  
  
1. 我有一个用户离开了公司,但仍然收到许多关于他/她的邮件,我怎么让别人知道此 
人已经使用  
新的邮件地址.  
===>加下面的行到M4宏配置文件中  
" FEATURE(`redirect')dnl "  
然后加下面的行到aliases文件中  
olduser: him@new.address.REDIRECT  
所有发到旧的邮件地址的人将收到一个新邮件地址的通知消息.  
  
2.为什么我更改了上面各种配置文件后仍然不起作用?  
在任意配置文件更改后都要运行makemap,例如:  
#makemap hash mailertable < mailertable  
但是对于sendmail.cw和relay-domains文件的更改要用下面的命令重启Sendmail  
#killall -HUP sendmail  
对aliases文件的更改要运行  
#newaliases  
  
3. 我按要求配置了所有的文件,发现我仍然不能发送邮件.为什么?  
首先保证你的Sendmail后台正在运行.用#ps -aux | grep sendmail检查  
若在运行,再检查看你能否#telnet mailserver 25.若仍不能看能否#ping mailserver 
   
注意:sendmail连接在TCP的端口25上进行,且TCP连接是双向的,你要检查路由表,  
看能否对进来的一个TCP连接产生的回复包能正确地沿相反方向回复给发送者.  
  
4.我怎么检查一封邮件的发封过程?  
在Sendmail邮件服务器上执行下面的命令.  
# echo testing | /usr/sbin/sendmail -v someone@somedomain.com  
  
0 0