歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

Sendmail relay規則及配置文件用法匯總

  第一部分 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發送郵件到 [email protected] . 在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的話。 但是。接收者是[email protected],域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。 所有外部進入發到[email protected]的郵件都首先經過存放在北京電信局的mail.abc.com 郵件主機,在該郵件服務器上的/etc/sendmail.cw中有一行abc.com,則發到@abc.com的郵件 經過mail.abc.com時檢查別名文件aliases.    若有三行如下: shuser:[email protected] bjuser:[email protected] szuser:[email protected] 則發到[email protected],[email protected][email protected]的郵件分別被別名為 [email protected],[email protected][email protected],然後分發到各分公司的Sendmail SMTP 郵件服務器。 注意:Sendmail檢查別名文件是不停地做檢查直到不能再做為止。具體是這樣的,象上面的文件中的 的三行,如果mail.abc.com收到一封信是[email protected],發現abc.com在sendmail.cw中,則接收該郵件 (為什麼?因為接收者的email地址的域部分在sendmail.cw文件中則是本地接收者,relay規則第二點) 本地接收者則檢查別名文件,別名到[email protected],然後再把別名出來的email地名域部分,現在是 sh.abc.com,與sendmail.cw中的列出的域比較,若仍符合則繼續別名下去直到不能符合條件為止。    現在引出一個問題就是注意不要使得別名檢查循環下去,象上面的情況下,若加sh.abc.com到sendmail.cw中則出現別名檢查循環而出錯。 現在,經過別名之後如何再發送郵件呢?一般的發送郵件過程是這樣的:    若上面的服務器mail.abc.com收到一封發到[email protected]的信,則先經過別名為[email protected]後 1. Sendmail請求DNS給出主機sh.abc.com的CNAME記錄,如有,假若CNAME到shmail.abc.com,則再次請求 DNS查找看是否有shmail的CNAME記錄,直到沒有為止 2. 現在我們假定沒有任何CNAME記錄存在,仍然是[email protected].則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.25



   則直接就是單純地指發送者機器的IP地址. 可以是內部網段的保留地址 A類: 10.0.0.0--10.25



Copyright © Linux教程網 All Rights Reserved