第一部分 mail relay 规则详解 一. 软件环境:Sendmail 8.9.3 二. 默认情况下的relay规则 在默认情况下,也就是安装完系统(Sendmail服务器)不做任何设置的情况下,则只能在本机上收发邮件, 网络上(局域网或Internet)的任何其它主机不能向该SMTP服务器发送邮件,若希望能实现发送,则需满足下 面的任何一个条件即可(不需要同时满足): 1. 发送者身份属于“本地或者被允许的发送者”。 abc.com (/etc/mail/relay-domains) 注: ===先讨论域名的情况: 回到前面所说的何谓“本地/被允许的发送者”,如果在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 或者 当A向B发送邮件时,若B能在它的/etc/hosts中找到一行如 192.168.11.12 jephe.abc.com 如: 在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中有下面两行 故在下文中不再累述,只提/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 则发到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记录,直到没有为止 前面说明了在/etc/mail/relay-domains或者/etc/mail/access中有域名的情况,若只有IP地址呢? 若 192.168.11.12 或者 则直接就是单纯地指发送者机器的IP地址. 可以是内部网段的保留地址 A类: 10.0.0.0--10.255.255.255 (10.0.0.0/8) 也可以是外别真实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. 公司设置自己的拨入服务器,仅仅公司员工可以用自己的用户名和密码拨入后发送邮件. 问题2: 为什么必须正反向解析一致,为什么may be forged? 假若一黑客组织操纵了一个ISP机构,如果你的Sendmail仅仅检查反向DNS解析出来的域名,如是你的公司域名 则允许relay mail的话,则被黑客集团操纵的ISP机构可以把其所拥有的IP地址段在自己的反向DNS数据库中 设置反向解析出来的域为你的公司域名,然后你的sendmail不加区别地relay它.认为该ISP的用户为自己的 本地/被允许的发送者,则后果可想而知. 上面介绍了Sendmail控制mail relay的几个文件: sendmail.cw 总结一下: 条件一: 发送者是被允许的发送者: 这要看文件/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了所有的本书提到的配置文件如下: ===================================== 我们以上面图二中的最左边的上海部分的网络结构为例子来说明上面五个配置文件的适用规则和用法. 你不用在意我举的例子中的网络环境,不管举什么例子,你只要搞懂了各个文件的在什么情况下适用就行. 重新画图如下:
/etc/mail/virtusertable用法 1.假如在sh.abc.com上/etc/sendmail.cw中有下面两行: ===>答: 一般情况下,最终应被发送到jwu@yahoo.com信箱中.为什么? 因为经过了两次别名检查.最后yahoo.com不在/etc/sendmail.cw文件中,故不再检查别名.直接发送到jwu@yahoo.com. 2.但不完全如此,在下面的情况下有例外(并非一定要做别名检查到底的). 则发到jwu@sh.abc.com的信是解析到wat@yahoo.com还是jwu@[192.168.11.1]呢? ====>答: 解析到jwu@[192.168.11.1] 再来看个例子: 3.若还是上面的图三, /etc/mail/virtusertable 中有 ===>答: jwu@[192.168.11.1] 结论: a.当接收者邮件地址的域部分在/etc/sendmail.cw中又在/etc/mail/virtusertable中时, 优先检查virtusertable文件,应用该文件中的定义规则.(例子2) /etc/mail/mailertable用法 跨越DNS的MX的记录,优先于MX记录,可以与MX记录指定的主机设定不同. 4.如果 /etc/mail/mailertable有 ===>答: 运用virtusertable规则,转变为jwu@[192.168.11.]后再发送到内部主机shmail 但a.如果没有/etc/mail/virtusertable则查找本地别名文件 注:转变为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 结论: /etc/mail/domaintable 用法 在任何情况下,domaintable都是最优先检查的,作用有二:一主要是防止对自己公司的域名的误打, 二是对自己公司新旧域名的替换。例子5如下: 5. 若/etc/mail/domaintable中有yahoo.com sh.abc.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/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中设置客户端邮件地址为 2. 服务器C在/etc/mail/genericstable中设置下面的行 3. 服务器C在/etc/mail/genericsdomain中有下面的行 上述三个条件同时满足时,则jwu向C发信给任何人时,发送者邮件地址都重写为 假如要求发送给本地用户如tom时发送者邮件地址为 jwu@domain.com,则没有基于M4的解决方案,你需要找到/etc/sendmail.cf中的下面行删除两行。
再举个例子,考虑下面的图五 _______________[SMTP Server]_______DDN_Link_____Internet 在SMTP服务器上设置下面的: /etc/mail/genericstable 如果该SMTP服务器从互联网上收到一封发送者邮件地址为jwu@test.com的信 ,则发送者邮件地址被重写为jwu@sources.com,且message envelope中的return address也是 jwu@sources.com 结论: a.当发送者邮件地址的用户部分和域部分被分别列在/etc/mail/genericstable和/etc/mail/ genericsdomain两个文件中时,发送者邮件地址被重写为/etc/mail/genericstable中被定义的邮件地址. 第三部分 Sendmail Masquerading 常用的几个伪装规则: 1.MASQUERADE_AS(yourdomain.com) 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文件中,即为本地域. =====>然后伪装发送者邮件地址的域部分为 MASQUERADE_AS(yourdomain.com) 中指定的域 yourdomain.com 举个例子: 如果/etc/sendmail.cw中有一行 再举个例子: 如果MASQUERADE_AS(domain.com)被设置了,且设置了MASQUERADE_DOMAIN部分,则伪装整个域中的所有主机。 例如设置了如下: 第四部分 常见问题处理方法 1. 我有一个用户离开了公司,但仍然收到许多关于他/她的邮件,我怎么让别人知道此人已经使用新的邮件地址. ===>加下面的行到M4宏配置文件中 2.为什么我更改了上面各种配置文件后仍然不起作用? 在任意配置文件更改后都要运行makemap,例如: 但是对于sendmail.cw和relay-domains文件的更改要用下面的命令重启Sendmail #killall -HUP sendmail 对aliases文件的更改要运行 #newaliases 3. 我按要求配置了所有的文件,发现我仍然不能发送邮件.为什么? 首先保证你的Sendmail后台正在运行.用#ps -aux | grep sendmail检查 若在运行,再检查看你能否#telnet mailserver 25.若仍不能看能否#ping mailserver 4.我怎么检查一封邮件的发封过程? |
自由广告区 |
分类导航 |
邮件新闻资讯: IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮 电子邮箱 | 反垃圾邮件|邮件客户端|网络安全 行业数据 | 邮件人物 | 网站公告 | 行业法规 网络技术: 邮件原理 | 网络协议 | 网络管理 | 传输介质 线路接入 | 路由接口 | 邮件存储 | 华为3Com CISCO技术 | 网络与服务器硬件 操作系统: Windows 9X | Linux&Uinx | Windows NT Windows Vista | FreeBSD | 其它操作系统 邮件服务器: 程序与开发 | Exchange | Qmail | Postfix Sendmail | MDaemon | Domino | Foxmail KerioMail | JavaMail | Winwebmail |James Merak&VisNetic | CMailServer | WinMail 金笛邮件系统 | 其它 | 反垃圾邮件: 综述| 客户端反垃圾邮件|服务器端反垃圾邮件 邮件客户端软件: Outlook | Foxmail | DreamMail| KooMail The bat | 雷鸟 | Eudora |Becky! |Pegasus IncrediMail |其它 电子邮箱: 个人邮箱 | 企业邮箱 |Gmail 移动电子邮件:服务器 | 客户端 | 技术前沿 邮件网络安全: 软件漏洞 | 安全知识 | 病毒公告 |防火墙 攻防技术 | 病毒查杀| ISA | 数字签名 邮件营销: Email营销 | 网络营销 | 营销技巧 |营销案例 邮件人才:招聘 | 职场 | 培训 | 指南 | 职场 解决方案: 邮件系统|反垃圾邮件 |安全 |移动电邮 |招标 产品评测: 邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端 |