一.軟件環境:Sendmail8.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.comrelay(/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文件中的定義,一般是這樣:
orderhosts,bind
multion
其中的order行指明先查/etc/hosts,再找DNS數據庫。現在舉個例子:
如下圖:
內部LAN|Internet
|windowsPC|---------|sendmailserver|
(192.168.11.12)SMTP(192.168.11.5)|(1.2.3.4)
(A)發送郵件(B)
jephe.abc.comsh.abc.com
(圖一)
在內部LAN上有一台windowsPC,簡稱機器A,主機名爲jephe.abc.com向一台連接內部LAN和Internet的
一台SendmailSMTP服務器,簡稱機器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.comrelay
當A向B發送郵件時,若B能在它的/etc/hosts中找到一行如
192.168.11.12jephe.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中
記錄一行警告信息說"maybeforged"(可能被僞造的)
但也並非所有記錄"maybeforged"信息到/var/log/maillog文件中的情況都不允許relay,也有的情況下
雖然記錄了一條警告消息說"maybeforged",但郵件仍然被接收了,是在下面的情況下:
例如:在B機上/etc/mail/relay-domains中有下面兩行
abc.com
yahoo.com
[注:在此不再累述關于/etc/mail/access,因爲前面已經說了在/etc/mail/relay-domains
中的一行如
abc.com
相當于/etc/mail/access中一行
abc.comrelay
故在下文中不再累述,只提/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。
但就會記錄警告消息maybeforged到/var/log/maillog文件中,這種允許屬于第二種mailrelay規則:
接收者是被允許的接收者。因此,只要是正反向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,對于接收者而言,僅檢查接收者郵件
地址的域部分。
還有,對于第二種mailrelay規則,還多一種情況,即:
若接收者的域名部分被列在/etc/sendmail.cw中,則該接收者也屬于本地接收者。
(默認情況下,sendmail.cw是在/etc下,當然你也可以直接更改/etc/sendmail.cf中的sendmail.cw路徑)
然後檢查別名文件aliases(具體路徑靠你的定義)去擴展別名。
舉個例子:
Internet
-------------------------|-------------------------
(eth0:1.2.3.4)|BeijingTelecom||
[SMTPserver][SMTPserver][SMTPserver][SMTPserver]
sh.abc.commail.abc.combj.abc.comsz.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,然後分發到各分公司的SendmailSMTP
郵件服務器。
注意: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記錄,並得到一個這樣的記錄:
shMXsh.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.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上網,該員工不能簡單地設置發送郵件服務器爲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.公司設置自己的撥入服務器,僅僅公司員工可以用自己的用戶名和密碼撥入後發送郵件.
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(mydomain.com)
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
我們以上面圖二中的最左邊的上海部分的網絡結構爲例子來說明上面五個配置文件的適用規則和用法.
你不用在意我舉的例子中的網絡環境,不管舉什麽例子,你只要搞懂了各個文件的在什麽情況下適用就行.
重新畫圖如下:
-----------------Internet-----------------
|(1.2.3.4)
[SMTPserver]sh.abc.com
|(192.168.11.5)
|
|jephe.abc.com(192.168.11.12)
_____|_____________________[myPC]______[shmail](192.168.11.1)____
[shanghaiinternalLAN]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(outgoingserver: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.comrelay:[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主機是不一樣的
概念.如果從郵件頭信息來看,則前者是receivedbyshmail[192.168.11.1]forjwu@[192.168.11.1]
;而後者是receivedbyshmail[192.168.11.]forjwu@sh.abc.com
結論:
a.優先級順序是virtusertablesendmail.cwmailertableDNSMX記錄
b.mailertable的運用不需要接收者郵件地址的域部分在sendmail.cw中存在.
c.mailertable用來跨越DNS,優先于DNS的MX記錄.
/etc/mail/domaintable用法
在任何情況下,domaintable都是最優先檢查的,作用有二:一主要是防止對自己公司的域名的誤打,
二是對自己公司新舊域名的替換。例子5如下:
5.若/etc/mail/domaintable中有yahoo.comsh.abc.com
且/etc/sendmail.cw中有sh.abc.com
且/etc/mail/virtusertable中有@sh.abc.com%1@[192.168.11.1]
且/etc/mail/mailertable中有sh.abc.comrelay:[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),最後收件人收到信後檢查郵件頭信息時,在
messageheader中的to:行都是jwu@sh.abc.com.你在messageheader中找不到任何jwu@yahoo.com的信息,
但在messageenvelope中的第一個received行中有jwu@yahoo.com的記錄。
結論:
1.無論什麽時候,domaintable都是優先檢查,且沒有任何附加條件,無條件檢查,與sendmail.cw中是否有某
域名無關。
2.一般地用來做域名更換,假如你的公司@abc.com可能被員工誤打爲abd.com,則放入下面的行到
/etc/mail/domaintable
abd.comabc.com
/etc/mail/genericstableand/etc/mail/genericsdomain的用法
作用:重寫發送者郵件地址,考慮下面的圖四:
[PC]A(jwu)
|
|CPPPLink
_____LAN_______________[SMTP/POP3server]-------ISP-------Internet
|jwu@domain.com@isp.net
|tom@domain.comjephe@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在自己的PCA機上的OutlookExpress中設置客戶端郵件地址爲
jwu@domain.com
2.服務器C在/etc/mail/genericstable中設置下面的行
jwujephe@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$nerrorstomailer-daemon
R@$ntemporarilybypassSunbogosity
R$+$:$50$1addlocaldomainifneeded
R$*$:$94$1domasquerading
#
#Headersenderrewriting
#
S30
R$nerrorstomailer-daemon
R@$ntemporarilybypassSunbogosity
R$+$:$50$1addlocaldomainifneeded
R$*$:$93$1domasquerading
再舉個例子,考慮下面的圖五
_______________[SMTPServer]_______DDN_Link_____Internet
(圖五)
在SMTP服務器上設置下面的:
/etc/mail/genericstable
jwujwu@sources.com
/etc/mail/genericsdomain
test.com
如果該SMTP服務器從互聯網上收到一封發送者郵件地址爲jwu@test.com的信
,則發送者郵件地址被重寫爲jwu@sources.com,且messageenvelope中的returnaddress也是
jwu@sources.com
結論:
a.當發送者郵件地址的用戶部分和域部分被分別列在/etc/mail/genericstable和/etc/mail/
genericsdomain兩個文件中時,發送者郵件地址被重寫爲/etc/mail/genericstable中被定義的
郵件地址.
b.不管是從局域網發進來的還是從互聯網上進來的,只要是經過Sendmail服務器處理時就檢查規則
第三部分SendmailMasquerading
常用的幾個僞裝規則:
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:行和replyto:行的郵件地址.
FEATURE(allmasquerade)僞裝messageheader中的to:地址
FEATURE(masquerade_envelope)僞裝messageenvelope部分的returnaddress,當不能交
付郵件並退回給發送者時會用到該地址.
問題一:僞裝在什麽情況下發生?
當下列條件同時滿足時實現僞裝:
a.客戶端OutlookExpress中的地址的域部分在/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,例如:
#makemaphashmailertable
但是對于sendmail.cw和relay-domains文件的更改要用下面的命令重啓Sendmail
#killall-HUPsendmail
對aliases文件的更改要運行
#newaliases
3.我按要求配置了所有的文件,發現我仍然不能發送郵件.爲什麽?
首先保證你的Sendmail後台正在運行.用#ps-aux|grepsendmail檢查
若在運行,再檢查看你能否#telnetmailserver25.若仍不能看能否#pingmailserver
注意:sendmail連接在TCP的端口25上進行,且TCP連接是雙向的,你要檢查路由表,
看能否對進來的一個TCP連接産生的回複包能正確地沿相反方向回複給發送者.
4.我怎麽檢查一封郵件的發封過程?
在Sendmail郵件服務器上執行下面的命令.
#echotesting|/usr/sbin/sendmail-vsomeone@somedomain.com