Sendmail relay規則及配置檔案用法彙總 sendmail配置 (轉)
Sendmail relay規則及配置檔案用法彙總 sendmail配置 (轉)[@more@]Send relay規則及用法彙總
推薦:Einstein 發表日期:2000年10月11日 閱讀次數:390
--------------------------------------------------------------------------------
第一部分 mail relay 規則詳解
一. 環境: 8.9.3
二. 預設情況下的relay規則
在預設情況下,也就是完(Sendmail)不做任何設定的情況下,則只能在本機上收發,上(或Inte)的任何其它主機不能向該SMTP伺服器傳送郵件,若希望能實現傳送,則需滿足下面的任何一個條件即可(不需要同時滿足):
1. 傳送者身份屬於“本地或者被允許的傳送者”。
2. 接收者身份屬於“本地或者被允許的接收者”。
也就是說,不管是郵件的傳送者還是郵件接收只要其中之一屬於本地或被允許的時候,Sendmail才允許relay你的郵件.那麼什麼是“本地/被允許的傳送者”呢?
實際上只有一種,就是列在檔案/etc/mail/relay-ains(預設安裝後無此檔案,你可以建立它)或者/etc/mail/access中的域名或者行,如:
abc.(/etc/mail/relay-domains)
abc.com relay (/etc/mail/access)
注:
a.我們假定某公司域名為abc.com
b.上面的兩行含義相同,只是在不同的檔案中所要求的語法不同而已,在/etc/mail/access檔案中需要加上relay.
===先討論域名的情況:
回到前面所說的何謂“本地/被允許的傳送者”,如果在relay-domains/access檔案中列出的是域名,則對傳送者的IP地址先查詢/etc/hosts檔案(一般是如此,因為預設情況下對伺服器來說,查詢是先查詢/etc/hosts檔案看是否有此IP地址對應的主機域名,如無再做反向DNS查詢,如果能夠反向查詢出來,且查詢出來的主機的域部分屬於上面兩個檔案中列出的域名,再對該主機名做正向DNS查詢出的IP地址(主機的A記錄)與傳送者IP地址相同,則允許relay郵件,這表明傳送者屬於被允許的傳送者。
也就是說,先看/etc/host.conf檔案中的定義,一般是這樣:
order hosts,bind
multi on
其中的order行指明先查/etc/hosts,再找DNS。現在舉個例子:
如下圖:
內部LAN ¦ Internet
¦ PC¦ ----------->¦sendmail server¦
(192.168.11.12) SMTP (192.168.11.5)¦(1.2.3.4)
(A) 傳送郵件 (B)
jephe.abc.com sh.abc.com
( 圖一 )
在內部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網段的包)。
如果在機器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
.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,為什麼如此?在後面我們會舉例說明。
由此我們引出===什麼是“本地的或者被允許的接收者”?
這個比較簡單,也就是接收者的地址的域部分被列在/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 (具體路徑靠你的定義)去擴充套件別名。
舉個例子:
Internet
-------------------------¦-------------------------
(eth0:1.2.3.4)¦ Beijing Telecom ¦ ¦
[SMTP server] [SMTP server] [SMTP server] [SMTP server]
sh.abc.com mail.abc.com bj.abc.com sz.abc.com
(eth1:192.168.11.5) (DNS) ¦ ¦
¦ ____ ¦ ¦
____¦____¦_PC_¦ ___ __¦_____ _____¦______
(LAN) ¦ (LAN) (LAN)
¦(192.168.11.1)
[mailhost]
(圖二)
假若公司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).既使你的 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_)
FEATURE(`blacklist_recipients')
========================================
所有的配置檔案如下:
/etc/mail/mailertable
/etc/mail/domaintable
/etc/mail/genericstable
/etc/mail/genericsdomain
/etc/mail/virtusertable
我們以上面圖二中的最左邊的上海部分的網路結構為例子來說明上面五個配置檔案的適用規則和用法.你不用在意我舉的例子中的網路環境,不管舉什麼例子,你只要搞懂了各個檔案的在什麼情況下適用就行.
重新畫圖如下:
-----------------Internet-----------------
¦ (1.2.3.4)
[SMTP server] sh.abc.com
¦ (192.168.11.5)
¦
¦ jephe.abc.com(192.168.11.12)
_____¦_____________________[myPC]______[shmail](192.168.11.1)____
[shanghai internal LAN] shmail.abc.com
(圖三)
/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用法
跨越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 的用法
作用: 重寫傳送者郵件地址,考慮下面的圖四:
[PC]A (jwu)
¦
¦ C PPP Link
_____LAN_______________[SMTP/POP3 server]------- ISP-------Internet
¦ jwu@domain.com @isp.net
¦ tom@domain.com jephe@isp.net
[PC]B (tom) tomyh@isp.net
(圖四)
考慮上面的情況,在公司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 #
# 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
再舉個例子,考慮下面的圖五
_______________[SMTP Server]_______DDN_Link_____Internet
(圖五)
在SMTP伺服器上設定下面的:
/etc/mail/genericstable
jwu jwu@s.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檢查若在執行,再檢檢視你能否# mailserver 25.若仍不能看能否# mailserver 注意:sendmail連線在TCP的埠25上進行,且TCP連線是雙向的,你要檢查表,看能否對進來的一個TCP連線產生的回覆包能正確地沿相反方向回覆給傳送者.
4.我怎麼檢查一封郵件的發封過程?
在Sendmail郵件伺服器上下面的命令.
# echo testing ¦ /usr/sbin/sendmail -v someone@somedomain.com
原作者:Jephe
來源:不詳
推薦:Einstein 發表日期:2000年10月11日 閱讀次數:390
--------------------------------------------------------------------------------
第一部分 mail relay 規則詳解
一. 環境: 8.9.3
二. 預設情況下的relay規則
在預設情況下,也就是完(Sendmail)不做任何設定的情況下,則只能在本機上收發,上(或Inte)的任何其它主機不能向該SMTP伺服器傳送郵件,若希望能實現傳送,則需滿足下面的任何一個條件即可(不需要同時滿足):
1. 傳送者身份屬於“本地或者被允許的傳送者”。
2. 接收者身份屬於“本地或者被允許的接收者”。
也就是說,不管是郵件的傳送者還是郵件接收只要其中之一屬於本地或被允許的時候,Sendmail才允許relay你的郵件.那麼什麼是“本地/被允許的傳送者”呢?
實際上只有一種,就是列在檔案/etc/mail/relay-ains(預設安裝後無此檔案,你可以建立它)或者/etc/mail/access中的域名或者行,如:
abc.(/etc/mail/relay-domains)
abc.com relay (/etc/mail/access)
注:
a.我們假定某公司域名為abc.com
b.上面的兩行含義相同,只是在不同的檔案中所要求的語法不同而已,在/etc/mail/access檔案中需要加上relay.
===先討論域名的情況:
回到前面所說的何謂“本地/被允許的傳送者”,如果在relay-domains/access檔案中列出的是域名,則對傳送者的IP地址先查詢/etc/hosts檔案(一般是如此,因為預設情況下對伺服器來說,查詢是先查詢/etc/hosts檔案看是否有此IP地址對應的主機域名,如無再做反向DNS查詢,如果能夠反向查詢出來,且查詢出來的主機的域部分屬於上面兩個檔案中列出的域名,再對該主機名做正向DNS查詢出的IP地址(主機的A記錄)與傳送者IP地址相同,則允許relay郵件,這表明傳送者屬於被允許的傳送者。
也就是說,先看/etc/host.conf檔案中的定義,一般是這樣:
order hosts,bind
multi on
其中的order行指明先查/etc/hosts,再找DNS。現在舉個例子:
如下圖:
內部LAN ¦ Internet
¦ PC¦ ----------->¦sendmail server¦
(192.168.11.12) SMTP (192.168.11.5)¦(1.2.3.4)
(A) 傳送郵件 (B)
jephe.abc.com sh.abc.com
( 圖一 )
在內部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網段的包)。
如果在機器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
.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,為什麼如此?在後面我們會舉例說明。
由此我們引出===什麼是“本地的或者被允許的接收者”?
這個比較簡單,也就是接收者的地址的域部分被列在/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 (具體路徑靠你的定義)去擴充套件別名。
舉個例子:
Internet
-------------------------¦-------------------------
(eth0:1.2.3.4)¦ Beijing Telecom ¦ ¦
[SMTP server] [SMTP server] [SMTP server] [SMTP server]
sh.abc.com mail.abc.com bj.abc.com sz.abc.com
(eth1:192.168.11.5) (DNS) ¦ ¦
¦ ____ ¦ ¦
____¦____¦_PC_¦ ___ __¦_____ _____¦______
(LAN) ¦ (LAN) (LAN)
¦(192.168.11.1)
[mailhost]
(圖二)
假若公司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).既使你的 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_)
FEATURE(`blacklist_recipients')
========================================
所有的配置檔案如下:
/etc/mail/mailertable
/etc/mail/domaintable
/etc/mail/genericstable
/etc/mail/genericsdomain
/etc/mail/virtusertable
我們以上面圖二中的最左邊的上海部分的網路結構為例子來說明上面五個配置檔案的適用規則和用法.你不用在意我舉的例子中的網路環境,不管舉什麼例子,你只要搞懂了各個檔案的在什麼情況下適用就行.
重新畫圖如下:
-----------------Internet-----------------
¦ (1.2.3.4)
[SMTP server] sh.abc.com
¦ (192.168.11.5)
¦
¦ jephe.abc.com(192.168.11.12)
_____¦_____________________[myPC]______[shmail](192.168.11.1)____
[shanghai internal LAN] shmail.abc.com
(圖三)
/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用法
跨越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 的用法
作用: 重寫傳送者郵件地址,考慮下面的圖四:
[PC]A (jwu)
¦
¦ C PPP Link
_____LAN_______________[SMTP/POP3 server]------- ISP-------Internet
¦ jwu@domain.com @isp.net
¦ tom@domain.com jephe@isp.net
[PC]B (tom) tomyh@isp.net
(圖四)
考慮上面的情況,在公司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 #
# 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
再舉個例子,考慮下面的圖五
_______________[SMTP Server]_______DDN_Link_____Internet
(圖五)
在SMTP伺服器上設定下面的:
/etc/mail/genericstable
jwu jwu@s.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檢查若在執行,再檢檢視你能否# mailserver 25.若仍不能看能否# mailserver 注意:sendmail連線在TCP的埠25上進行,且TCP連線是雙向的,你要檢查表,看能否對進來的一個TCP連線產生的回覆包能正確地沿相反方向回覆給傳送者.
4.我怎麼檢查一封郵件的發封過程?
在Sendmail郵件伺服器上下面的命令.
# echo testing ¦ /usr/sbin/sendmail -v someone@somedomain.com
原作者:Jephe
來源:不詳
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989764/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sendmail配置AI
- REDHAT 7.1 sendmail配置FAQ (轉)RedhatAI
- 安裝和配置sendmailAI
- ebs12 sendmail配置AI
- 在紅旗Linux Server4.1中配置sendmail(轉)LinuxServerAI
- HP-UX啟動停止配置sendmail服務方法UXAI
- sendmail settingAI
- go Casbin配置檔案,以及匹配規則Go
- [Developer] Oracle sendmail procedure(1)(轉載)DeveloperOracleAI
- sendmail出現"MXlistforhostnamepointsbacktohostname"問(轉)AI
- nginx配置location總結及rewrite規則寫法Nginx
- Linux下的sendmail簡介(轉)LinuxAI
- Android Studio軟體的快捷鍵用法彙總及常用配置Android
- 用sendmail傳送HTML格式的郵件(轉)AIHTML
- 把JavaMail包裝成簡單的Sendmail (轉)JavaAI
- apache 配置檔案的配置(轉)Apache
- linux下關閉sendmailLinuxAI
- [Linux] mutt+msmtp sendmailLinuxAI
- rman configure配置彙總及原理
- 認識 Linux 檔案屬性及檔案配置(轉)Linux
- 在Perl中使用sendmail傳送MIME郵件 (轉)AI
- Git忽略提交規則.gitignore配置總結Git
- MyBatis配置檔案總結MyBatis
- mysql relay log引數彙總MySql
- sendmail的log裡面maybeforged是什麼意思?(轉)AI
- Redhat中sendmail只監聽127.0.0.1怎麼辦(轉)RedhatAI127.0.0.1
- git config檔案總結及git alias配置Git
- vim配置及基本用法
- Kafka 配置引數彙總及相關說明Kafka
- [Shell] monitor oracle alert.log file and sendmailOracleAI
- MySQL 配置檔案位置及命名。MySql
- 靜態路由規則配置路由
- Git忽略提交規則 - .gitignore配置運維總結Git運維
- Git配置配置檔案Git
- solaris 10的fsck 相關用法及.rhosts另hosts.equiv檔案配置UI
- 理解Linux配置檔案(轉)Linux
- Apache 配置檔案說明(轉)Apache
- Spring Boot 配置檔案總結Spring Boot