当前位置:操作系统 > Unix/Linux >>

Sendmailrelay规则及配置文件用法汇总

第一部分 mail relay

  规则详解

  一. 软件环境:Sendmail 8.9.3

  二. 默认情况下的relay规则

  在默认情况下,也就是安装完系统(Sendmail服务器)不做任何设置的情况下,则只能在本机上收发邮件, 网络上(局域网或Internet)的任何其它主机不能向该SMTP服务器发送邮件,若希望能实现发送,则需满足下面的任何一个条件即可(不需要同时满足):

  1. 发送者身份属于“本地或者被允许的发送者”。

  2. 接收者身份属于“本地或者被允许的接收者”。

  也就是说,不管是邮件的发送者还是邮件接收对象只要其中之一属于本地或被允许的时候,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.
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,