linux技术文档.docx
《linux技术文档.docx》由会员分享,可在线阅读,更多相关《linux技术文档.docx(27页珍藏版)》请在冰豆网上搜索。
linux技术文档
SendmailRelay规则及配置文件用法详解
来源:
ChinaUnix博客 日期:
2006.02.1511:
01 (共有0条评论)我要评论
Sendmailrelay规则及配置文件用法汇总
第一部分mailrelay规则详解
一.软件环境:
Sendmail8.9.3至8.12
二.默认情况下的relay规则
在默认情况下,也就是安装完系统(Sendmail服务器)不做任何设置的情况下,则只能
在本机上收发邮件,
网络上(局域网或Internet)的任何其它主机不能向该SMTP服务器发送邮件,若希望
能实现发送,则需满足下
面的任何一个条件即可(不需要同时满足):
1.发送者身份属于“本地或者被允许的发送者”。
2.接收者身份属于“本地或者被允许的接收者”。
3.发送者通过SMTPAUTH认证(自Sendmail8.10起)
也就是说,不管是邮件的发送者还是邮件接收对象只要其中之一属于本地或被允许
的时候,Sendmail邮件服务
器才允许relay你的邮件.那么什么是“本地/被允许的发送者”呢?
实际上只有一种,就是列在文件/etc/mail/relay-domains(默认安装后无此文件,
你可以创建它)或者
/etc/mail/access中的域名或者IP地址行,如:
(/etc/mail/relay-domains)
relay(/etc/mail/access)
注:
a.我们假定某公司域名为
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文件中的定义,一般是这样:
orderhosts,bind
multion
其中的order行指明先查/etc/hosts,再找DNS数据库。
现在举个例子:
如下图:
在内部LAN上有一台windowsPC,简称机器A,主机名为向一台连接内
部LAN和Internet的
一台SendmailSMTP服务器,简称机器B发送邮件,地址分别为192.168.11.12和
192.168.11.5,
SMTP服务器外部地址为1.2.3.4
专线连接Internet.假定该公司域名为,机器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文件中有一行
或者
relay
当A向B发送邮件时,若B能在它的/etc/hosts中找到一行如
192.168.11.12
则允许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主机名为.
且又在@域的DNS中查找到对应于主机jephe的A类记录地址为192.168.11.
12,则满足条件。
发送者属于本地域,即被允许的发送者。
需要注意的是,必须正反向解析都需要能解析且一致才行,否则不允许relay,且会
在/var/log/maillog中
记录一行警告信息说"maybeforged"(可能被伪造的)
但也并非所有记录"maybeforged"信息到/var/log/maillog文件中的情况都不允
许relay,也有的情况下
虽然记录了一条警告消息说"maybeforged",但邮件仍然被接收了,是在下面的情
况下:
例如:
在B机上/etc/mail/relay-domains中有下面两行
[注:
在此不再累述关于/etc/mail/access,因为前面已经说了在
/etc/mail/relay-domains
中的一行如
相当于/etc/mail/access中一行
relay
故在下文中不再累述,只提/etc/mail/relay-domains或者/etc/mail/access.]
若A向B发送邮件到someone@.在B机的/etc/hosts中没有相应的对应于
192.168.11.12的记录行。
且在B机(DNS服务器)上不能对IP地址192.168.11.12做反向查找,或者能做反向
查找如查找出来为
但在正向查找(对域的主DNS数据库中查找对应于主机
jephe的A记录)中没有对应于
主机jephe的A记录,或者有但找出来的IP地址不是192.168.11.12的话。
但是。
接收者是someone@,域在/etc/mail/relay-domains中。
则还是允许relay。
但就会记录警告消息maybeforged到/var/log/maillog文件中,这种允许属于第
二种mailrelay规则:
接收者是被允许的接收者。
因此,只要是正反向DNS不一致总会记录该警告消息到
maillog中。
Sendmail不是单纯地查看反向DNS解析,而后正反都要匹配,否则不relay,为什么
如此?
在后面我们会举
例说明。
由此我们引出===什么是“本地的或者被允许的接收者”?
这个比较简单,也就是接收者的email地址的域部分被列在
/etc/mail/relay-domains或者/etc/mail/access
文件中,如上面的情况,发到@域的任何接收者都被允许接收。
注意一个范围问题,如果发送者的域名(根据前面说的/etc/hosts或者正反向DNS
一致的解析)被列在这两个
文件中,则该发送者可以发送给任何人的邮件,都能被接收,但若不是这种情况,
则只能发送到接收者的
email地址的域名在这两个文件中的那些接收者。
后者的情况接收对象的范围要比
前者小。
再引出另一个值得注意的问题,就是在文件relay-domains或者access中列出的域
名既是针对发送者来说的,也
是针对接收者而言的。
对于发送者来说,检查/etc/hosts,和正反向DNS,对于接
收者而言,仅检查接收者邮件
地址的域部分。
还有,对于第二种mailrelay规则,还多一种情况,即:
若接收者的域名部分被列在/etc/sendmail.cw中,则该接收者也属于本地接收者。
(默认情况下,sendmail.cw是在/etc下,当然你也可以直接更改/etc/sendmail.
cf中的sendmail.cw路径)
然后检查别名文件aliases(具体路径靠你的定义)去扩展别名。
举个例子:
假若公司在北京,上海和深圳有分公司,总部在北京,放一台mail服务器
在北京电信局,且其它各分公司,上海,北京,深圳都各自用专线连到当地的ISP
。
所有外部进入发到someone@的邮件都首先经过存放在北京电信局的mail.
邮件主机,在该邮件服务器上的/etc/sendmail.cw中有一行,则发到
@的邮件
经过时检查别名文件aliases.
若有三行如下:
shuser:
shuser@
bjuser:
bjuser@
szuser:
szuser@
则发到shuser@,bjuser@和szuser@的邮件分别被别名为
shuser@,bjuser@和szuser@,然后分发到各分公
司的SendmailSMTP
邮件服务器。
注意:
Sendmail检查别名文件是不停地做检查直到不能再做为止。
具体是这样的,
象上面的文件中的
的三行,如果收到一封信是shuser@,发现在
sendmail.cw中,则接收该邮件
(为什么?
因为接收者的email地址的域部分在sendmail.cw文件中则是本地接收者
,relay规则第二点)
本地接收者则检查别名文件,别名到shuser@,然后再把别名出来的
email地名域部分,现在是
,与sendmail.cw中的列出的域比较,若仍符合则继续别名下去直到不
能符合条件为止。
现在引出一个问题就是注意不要使得别名检查循环下去,象上面的情况下,若加
到sendmail.cw中
则出现别名检查循环而出错。
现在,经过别名之后如何再发送邮件呢?
一般的发送邮件过程是这样的:
若上面的服务器收到一封发到shuser@的信,则先经过别名为
shuser@后
1.Sendmail请求DNS给出主机的CNAME记录,如有,假若CNAME到shmail.
则再次请求
DNS查找看是否有shmail的CNAME记录,直到没有为止
2.现在我们假定没有任何CNAME记录存在,仍然是shuser@.则Sendmail
请求DNS给出的
MX记录,并得到一个这样的记录:
shMX
3.Sendmail请求DNS给出的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.12relay
则直接就是单纯地指发送者机器的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上网,该员工不能简单地设置发送邮件服务器为(1.2.3.
4).既使你的Outlook
Express中设置的邮件地址为jephe@.为什么?
因为Sendmail根本不检查你的发送者邮件地址,而是你拨号上来的IP地址,但是你拨
号上来的IP地址是动态
随机分配的,而且由该IP地址反向解析出来的域名是ISP的域名,不是@,实
际上,在你拨号上来得到
一个IP地址后向发送邮件时,建立到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.sendmail8.10加入了SMTP用户认证功能,发送邮件时提示输入用户名和密码后
允许relay.
问题2:
为什么必须正反向解析一致,为什么maybeforged?
假若一黑客组织操纵了一个ISP机构,如果你的Sendmail仅仅检查反向DNS解析出来
的域名,如是你的公司域名
则允许relaymail的话,则被黑客集团操纵的ISP机构可以把其所拥有的IP地址段在
自己的反向DNS数据库中
设置反向解析出来的域为你的公司域名,然后你的sendmail不加区别地relay它.认
为该ISP的用户为自己的
本地/被允许的发送者,则后果可想而知.
上面介绍了Sendmail控制mailrelay的几个文件:
sendmail.cw
access
relay-domains
aliases
总结一下:
>
条件一:
发送者是被允许的发送者:
这要看文件/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()
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.假如在上/etc/sendmail.cw中有下面两行:
且/etc/mail/aliases中有下面两行(假定/etc/sendmail.cf中路径为
/etc/mail/aliases)
admin:
jwu@
jwu:
jwu@
则当从[myPC]发送邮件到admin@(outgoingserver:
sh.abc.
com)时.
这封信最终被发往哪里去了?
===>答:
一般情况下,最终应被发送到jwu@信箱中.为什么?
因为经过了两次别名检查.最后不在/etc/sendmail.cw文件中,故不再检
查别名.直接
发送到jwu@.
2.但不完全如此,在下面的情况下有例外(并非一定要做别名检查到底的).
若在/etc/mail/virtusertable中有下面的行
@%1@[192.168.11.1]
且/etc/sendmail.cw中有
且/etc/mail/aliases中有一行
jwu:
wat@
则发到jwu@的信是解析到wat@还是jwu@[192.168.11.1]呢?
====>答:
解析到jwu@[192.168.11.1]
再来看个例子:
3.若还是上面的图三,/etc/mail/virtusertable中有
@%1@[192.168.11.1]
/etc/sendmail.cw中有
/etc/mail/aliases中有:
admin:
jwu@
jwu:
wat@
则发到admin@的信最终被交到哪里wat@还是
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文
件中有相应的定义
则先只应用se