Postfix虛擬網(wǎng)絡(luò)域名
近年來,用同一臺主機來搭建多個網(wǎng)域,已經(jīng)蔚然成風(fēng)。舉個實例來說,oreillynet.com和onlamp.com其實位于同一臺主機,但是從外界的觀點來看,它們似乎分別位于兩臺完全不同的主機上。一個系統(tǒng)通常有一個最具代表性的網(wǎng)絡(luò)域名,稱為正式網(wǎng)域,除此之外的其他網(wǎng)域,則被視為虛擬網(wǎng)域。每個虛擬網(wǎng)域都可以提供自己的網(wǎng)絡(luò)與郵件服務(wù),且外界看不出正式網(wǎng)域與虛擬網(wǎng)域的差別。
postfix如何投遞虛擬網(wǎng)域的郵件,決定了你需要哪些技術(shù)。有兩個重要因素影響你的postfix如何支持多個虛擬網(wǎng)域:
網(wǎng)域之間要有單獨的命名空間嗎?比方說,寫給info@oreilly.com和info@ora.com這兩個地址的郵件,是放在同一個郵箱還是各自單獨的郵箱?對于使用相同郵箱的情況,我們稱之為共享網(wǎng)域;而另一種情況則稱為獨立網(wǎng)域。
每位用戶都需要系統(tǒng)賬戶嗎?我們將區(qū)別“系統(tǒng)賬戶”與“虛擬賬戶”的不同。前者是真正的unix賬戶,可用來登錄服務(wù)器系統(tǒng);后者純粹用于辨識郵箱,不能登錄系統(tǒng),在/etc/passwd里也沒有對應(yīng)記錄。
我們將探討postfix對于虛擬網(wǎng)域郵件的四種處理方式:
共享網(wǎng)域搭配系統(tǒng)賬戶
獨立網(wǎng)域搭配系統(tǒng)賬戶
獨立網(wǎng)域搭配虛擬賬戶
虛擬網(wǎng)域搭配非postfix控制管理的特殊格式郵箱
應(yīng)該挑選哪一種技術(shù),主要決定因素是你所使用的POP/IMAP server。如果你的POP/IMAP server不能辨別虛擬網(wǎng)域,那么,很可能所有郵件地址需要系統(tǒng)賬戶。某些POP/IMAP servers天生就是為了支持多重網(wǎng)域而設(shè)計,而且郵件是存放在本地文件系統(tǒng)的某個特定目錄結(jié)構(gòu)下,還有些POP/IMAP server使用自己專屬的郵箱格式。對于posfix不支持的郵箱格式,postfix可使用LMTP將郵件交給POP/IMAP server。
不管采用哪一種技術(shù),你的正式網(wǎng)域的DNS是怎么設(shè)定的,所有虛擬網(wǎng)域的DNS都必須“依樣畫葫蘆”。
共享網(wǎng)域搭配系統(tǒng)賬戶
最簡單的虛擬網(wǎng)域模式,是每位用戶都可以收到每個網(wǎng)域的郵件。就用戶的感受而言,就好像同一個郵箱有多個地址一樣。這種模式的設(shè)定方法最簡單,只要將所有虛擬網(wǎng)域名稱都列在mydestination參數(shù),并像平常一樣為每一位用戶都創(chuàng)建自己的系統(tǒng)賬戶,他們就可以收到寫給任何網(wǎng)域的郵件。
這種模式使用LOCAL MDA來執(zhí)行投遞操作,因此,正式網(wǎng)域該有的功能,虛擬網(wǎng)域同樣一應(yīng)俱全,所有網(wǎng)域共享同一個別名文件,每位用戶都可以創(chuàng)建自己的.forward文件。舉例來說,假設(shè)我們希望oreillynet.com網(wǎng)域的郵件服務(wù)器兼任ora.com與oreilly.com這兩個網(wǎng)域的郵件交換站。第一步是設(shè)定那兩個虛擬網(wǎng)域的DNS,將它們的mx都指向此服務(wù)器;第二步是修改此服務(wù)器的mydestination參數(shù),完成修改之后,記得要讓postfix重新讀取其配置文件,讓你所做的改變生效;用戶現(xiàn)在可以收到寄給mydestination所列的任一網(wǎng)域的郵件。外界寫給info@ora.com或 info@oreilly.com的郵件,都會被投遞到同一個系統(tǒng)賬戶的郵箱。
獨立網(wǎng)域搭配系統(tǒng)賬戶
如果每個虛擬網(wǎng)域都要有自己的命名空間,設(shè)定方法就稍微復(fù)雜些。在獨立網(wǎng)域模式下,寫給info@ora.com的郵件不應(yīng)該被放在 info@oreilly.com的郵箱中。在這種情況下,虛擬網(wǎng)域不應(yīng)該被列在mydestination參數(shù)中,而應(yīng)該被列在 virtual_alias_domains參數(shù)中;你必須為每一個郵件地址分別創(chuàng)建對應(yīng)的系統(tǒng)賬戶。每一個系統(tǒng)賬戶的名稱都必須獨一無二,但是不要求一定要與郵件地址的人名部分相同,因為我們可以另外準(zhǔn)備一個查詢表來定義兩者之間的對應(yīng)關(guān)系。若要區(qū)別賬戶所屬網(wǎng)域,同時又要避免賬戶名稱重復(fù),最簡單的方法是將網(wǎng)域名稱當(dāng)成賬戶名稱的一部分。一種可行的命名法則,是使用類似info.ora.com和info.oreilly.com這樣的名稱來創(chuàng)建系統(tǒng)賬戶。不過,某些系統(tǒng)平臺的賬戶名稱被限制在8個字符以下,如果你的平臺不支持長名稱,就不能使用這種命名法則。
在postfix知道它應(yīng)該收下哪些網(wǎng)域的郵件,而你也為每一個地址都準(zhǔn)備好對應(yīng)的系統(tǒng)賬戶之后,下一步就是將virtual_ailas_maps指向虛擬別名表:
virtual_alias_maps = hash:/etc/postfix/virtual_alias
此查詢表定義了每一個虛擬網(wǎng)域郵件地址所對應(yīng)的實際郵件地址。
每當(dāng)你修改虛擬別名表后,別忘了使用postmap將該文件轉(zhuǎn)換成postfix可直接查詢的格式:
postmap virtual_alias
如果helene和frank能夠登錄服務(wù)器系統(tǒng),直接從服務(wù)器寄信出去,你可能還需要另外準(zhǔn)備一個規(guī)范映射表,好讓他們寄出去的郵件的寄件人地址被改寫成正確的地址。例如:
canoniacl_maps = hash:/etc/postfix/canonical
再次提醒,規(guī)范映射表也必須經(jīng)過postmap的轉(zhuǎn)換
獨立網(wǎng)域搭配虛擬賬戶
前兩種模式最大的缺點,就是每一個郵件地址都必須在服務(wù)器上有對應(yīng)的系統(tǒng)賬戶。雖然事前的設(shè)定過程不難,但是事后維護工作卻很麻煩。尤其當(dāng)虛擬網(wǎng)域的數(shù)量增加時,系統(tǒng)賬戶的維護工作更是苦不堪言。此外,從系統(tǒng)安全的角度來看,如果絕大部分用戶都只是利用服務(wù)器來收信而已,實在沒有必要賦予他們能夠登錄系統(tǒng)的能力。比較務(wù)實的做法,應(yīng)該是要求postfix將郵件投遞到本地系統(tǒng)上的一個虛擬郵箱目錄,在此目錄下,每一個虛擬郵件都有自己的郵箱文件,而用戶可通過支持虛擬郵箱的POP/IMAP server來取信。虛擬郵箱與一般郵箱的差別之處,在于郵件文件與系統(tǒng)賬戶之間不要求存在一比一的對應(yīng)關(guān)系。
使用虛擬郵箱模式時,你必須在virtual_mailbox_domains參數(shù)列出每一個虛擬網(wǎng)域的名稱:
virtual_mailbox_domains = ora.com, oreilly.com
如果你有許多虛擬網(wǎng)域,不妨將它們列在一個文件,然后將virtual_mailbox_domains指向該文件:
virtual_mailbox_domains = /etc/postfix/virtual_domains
/etc/postfix/virtual_domains文件的每一行,各包含一個虛擬網(wǎng)域的名稱。
每當(dāng)postfix收到寫給virtual_mailbox_domains所列的虛擬網(wǎng)域的郵件時,就交由virtual MDA執(zhí)行投遞操作。virtual的實質(zhì)是local MDA的“小型版本”,它以一種安全而且高效率的程序來進行投遞,其代價是犧牲了本地別名文件、forward文件、MLM餓支持。不過,這不是什么大缺點,因為我們?nèi)钥墒褂胿irtual_alias_maps參數(shù)來達到同樣的效果。
設(shè)定虛擬郵箱時,你應(yīng)該妥善安排郵件目錄的結(jié)構(gòu),使其符合POP/IMAP server的預(yù)期要求。支持虛擬郵箱的POP/IMAP server,多半假設(shè)所有虛擬郵箱都位于某一個基礎(chǔ)目錄下,在此目錄下,每一個虛擬網(wǎng)域都有一個與其網(wǎng)域名稱同名的子目錄。因此,如果有兩個虛擬網(wǎng)域,則它們的虛擬郵箱應(yīng)該分別被放在兩個子目錄下;
定義虛擬郵箱基礎(chǔ)目錄的參數(shù)是virtual_mailbox_base,你必須給出完整的目錄路徑;
virtual_mailbox_base = /var/vmail
virtual_mailbox_maps參數(shù)定義虛擬郵箱查詢表的位置;此查詢表描述每一位虛擬郵箱用戶的郵件地址以及對應(yīng)的郵箱文件的相對路徑文件名。郵箱文件的格式可以是mbox或maildir。如果你選擇maildir格式,郵箱文件名末端必須加一個“/"符合。
info@ora.com ora.com/info
info@oreilly.com oreilly.com/info
完成上述設(shè)定后,外界寫到info@ora.com和info@oreilly.com的郵件,就不會存放在同一個郵箱了。
#p#
郵箱文件的擁有權(quán)
Unix系統(tǒng)上的每一個文件都有主人,虛擬郵箱文件也不例外--雖然虛擬郵箱的“用戶”沒有系統(tǒng)賬戶。因此,用戶如何訪問郵箱文件,決定呢郵箱文件擁有權(quán)的歸屬。通常,POP/IMAP server的運行權(quán)限繼承于某個專屬的系統(tǒng)虛賬戶,并假設(shè)其權(quán)限足以訪問所有郵箱文件。因此,郵箱文件的擁有者應(yīng)該是POP/IMAP server所有的那個虛賬戶。但是,如果必要的話,postfix也容許你自己決定文件的擁有者。你可以讓每個郵箱文件都有自己的擁有者或是讓同網(wǎng)域的所有郵箱文件都同屬于一個擁有者,但不同網(wǎng)域的郵箱分屬不同的擁有者。
virtual_uid_maps于virtual_gid_maps參數(shù)決定了postfix的virtual MDA投遞郵件到虛擬郵箱時,應(yīng)該繼承的系統(tǒng)賬戶。假設(shè)所有虛擬郵箱都屬于同一個賬戶,則你可以使用static映射方式,直接指定virtual所要繼承的UID與GID;
virtual_uid_maps = static:1003
virtual_gid_maps = static:1005
這會使得virtual MDA以UID 1003、GID 1005的身份來訪問任何郵箱文件。如果你希望virtual以不同的UID身份來訪問不同的郵箱文件,你必須另外準(zhǔn)備一個查詢表,定義各個虛擬郵箱地址與UID之間的對應(yīng)關(guān)系,然后將virtual_uid_maps指向 此查詢表;
virtual_uid_maps = hash:/etc/postfix/virtual_uids
如果大部分的虛擬郵箱文件屬于固定的擁有者,但也有某些是屬于不同的UID,你可以混合使用static與查詢表:
virtual_uid_maps = hash:/etc/postfix/virtual_uids static:1003
virtual_gid_maps參數(shù)的用法與virtual_uid_maps完全相同。
定義郵箱文件與擁有者對應(yīng)關(guān)系的/etc/postfix/virtual_uids文件,其索引鍵是郵箱文件所屬的郵件地址,而對應(yīng)值是郵箱文件擁有者的UID(或GID)。舉例來說,如果我們希望ora.com網(wǎng)域的所有郵箱都屬于同一個UID,而oreilly.com的郵箱屬于另一個UID。
虛擬別名
即使是虛擬網(wǎng)域,postfix也能將其郵件投遞到本地郵箱,或是轉(zhuǎn)寄到其他站點。既然所有類型的收件地址都會被檢查是否為虛擬別名,所以,只要把轉(zhuǎn)寄地址放在virtual_alias_maps所指的文件即可。請確定virtual_alias_maps參數(shù)指向一個虛擬別名表:
virtual_alias_maps = hash:/etc/postfix/virtual_alias
/etc/postfix/virtual_alias文件包含了要被轉(zhuǎn)寄到他處的虛擬地址:
kdent@oreilly.com kyle.dent@onlamp.com
不要將同一個網(wǎng)域同時列在virtual_mailbox_domains和virtual_alias_domains中。對于同時含有郵箱與別名的虛擬網(wǎng)域,請使用virtual_mailbox_domains。如果所有地址都是別名,請使用virtual_alias_domains。
無限別名地址
無論是虛擬別名還是虛擬郵箱,它們的查詢表都可以含有一個“無限別名地址”--只有網(wǎng)域部分沒有人名部分的郵件地址。無限別名地址所對應(yīng)的郵箱(如果是虛擬郵箱的話)或轉(zhuǎn)寄地址(如果是虛擬別名的話),用來承接外界寄到該網(wǎng)域的不明用戶的郵件。無限別名地址應(yīng)該謹(jǐn)慎使用,因為它們一定會收到大量垃圾郵件。發(fā)送垃圾郵件者常用“字典攻擊法”來濫發(fā)垃圾郵件,所以你的郵件服務(wù)器會時常收到寄信給不明用戶的要求。如果設(shè)定了無限別名地址,等于是讓這些發(fā)送垃圾郵件者有機會塞爆你的郵箱。
無限別名虛擬郵箱
第一步是找出一個郵箱來承接所有寄給不明用戶的郵件。你可以使用現(xiàn)有的郵箱,或是另外創(chuàng)建一個新郵箱。決定好郵箱之后,在virtual_mailbox_maps所指的查詢表增加一筆無限別名地址記錄;
@ora.com ora.com/service
無限別名虛擬別名
無限別名虛擬別名的設(shè)定步驟,很類似無限別名虛擬郵箱。第一步,先選定一個郵箱地址來接收所有寄到不明別名等郵件,然后在virtual_alias_maps所指的查詢表定義無限別名所對應(yīng)的地址:
@ora.com customer.service@onlamp.com
除非你的系統(tǒng)沒有任何虛擬郵箱,否則不應(yīng)該設(shè)置無限別名虛擬別名。因為postfix會先展開虛擬別名,然后才檢查虛擬郵箱;如果你設(shè)置了無限別名虛擬別名,它將攔截掉所有的郵件,包括原本應(yīng)該投遞到虛擬郵箱的郵件。
在設(shè)置了無限別名的情況下,如果還希望虛擬郵箱能夠收到郵件,唯一辦法是將虛擬別名展開成虛擬郵箱地址。舉例來說,假設(shè)下面是虛擬郵箱查詢表的內(nèi)容:
info@ora.com ora.com/info
info@oreilly.com oreilly.com/info
那么,含有無限別名的虛擬別名表,應(yīng)該要含有上述虛擬郵箱的別名地址:
info@ora.com info@ora.com
info@oreilly.com info@oreilly.com
kdent@oreilly.com kyle.dent@onlamp.com
@ora.com customer.service@onlamp.com
如此一來,寄到info@oreilly.com的郵件,就不至于被@ora.com無限別名攔截掉了。
虛擬網(wǎng)域搭配特殊格式的郵箱
我們要討論的最后一種操作模式,是在一個使用特殊郵箱格式的系統(tǒng)上假設(shè)虛擬網(wǎng)域。在這類系統(tǒng)上,postfix本身不做投遞工作,而是使用LMTP協(xié)議將郵件托付給知道如何訪問特殊郵箱的程序。
因為postfix必須先收下郵件后才轉(zhuǎn)交給LMTP server,所以postfix必須知道它要收下哪些虛擬網(wǎng)域名稱的郵件。請將這些網(wǎng)域的名稱列于virtual_mailbox_domains參數(shù):
virtual_mailbox_domains = ora.com, oreilly.com
你還必須逐一列出每一個郵件地址,這樣postfix才能夠知道哪些收件地址是有效的,并拒收不明用戶的郵件。請將virual_mailbox_maps參數(shù)指向有效地址查詢表:
virtual_mailbox_maps = hash:/etc/postfix/virtual
因為postfix只需要知道地址的有效性而不參與投遞工作,所以/etc/postfix/virtual查詢表只有索引鍵的部分有意義,對應(yīng)值的部分沒有作用。然而,查詢表的格式不容許我們省略對應(yīng)值,所以仍必須隨便填入數(shù)據(jù);
為了讓postfix能將虛擬網(wǎng)域的郵件交給POP/IMAP server,我們還必須在main.cf的virtual_transport參數(shù)中指定正確的傳送方法,也就是LMTP server的socket是何種形式。假設(shè)LMTP server與postfix都位于同一臺機器,而且LMTP server使用unix-domain socket,其文件位置是/var/imap/socket/lmtp,則virtual_transport應(yīng)該這樣設(shè)定:
virtual_transport = lmtp:unix:/var/imap/socket/lmtp
現(xiàn)在,每當(dāng)postfix收到寄給virtual_mailbox_domains所列的任一網(wǎng)域的郵件,都會通過LMTP協(xié)議交給同機器上的POP/IMAP server來執(zhí)行投遞操作。
投遞到外部程序
先前說過,virtual MDA不能處理系統(tǒng)別名文件與個人的.forward文件。雖然使用virtual_alias_maps可彌補虛擬網(wǎng)域的地址別名問題,但是.forward文件的一項重要功能--傳遞郵件內(nèi)容給外部程序,還沒解決。這表示虛擬網(wǎng)域的地址沒有自動回信功能,也不能假設(shè)郵遞列表管理系統(tǒng)。本節(jié)將示范如何利用postfix的其他機制,讓寄到虛擬地址的郵件也可以傳給外部程序。第一個例子示范如何投遞郵件到一個自動回復(fù)程序,第二個例子以majordomo MLM來做示范。
自動回信程序的作用,主要是在沒有任何人員接入操作的情況下,自動處理外來郵件、儲存或處理來信信息,然后回信給原寄信人?;匦懦绦蚩梢允呛唵蔚哪_步,也可以是以C或任何語言寫成的復(fù)雜程序。
假設(shè)我們要提供一個供客戶請求信息的服務(wù),只要客戶寄信到特定地址,就回復(fù)一封含有請求信息的回信。我們不希望使用人工處理這種千篇一律的機械工作,所以,最好的辦法是寫一個自動回復(fù)程序。
將虛擬網(wǎng)域的郵件傳給自動回信程序
虛擬網(wǎng)域的郵件不能通過.forward機制傳給外部程序,因此,若想讓自動回信程序能收到虛擬地址的郵件,我們必須在master.cf中增加一個能投遞郵件到外部程序的特殊MDA,然后使用傳輸表將特定地址的郵件交給這個特殊的MDA處理。
許多自動回信程序一次只能處理一封來信,而且一次只能回一封信。對于每一種MDA,都有一個限制收件人數(shù)量的mda_destination_recipient_limit參數(shù),其中的mda是MDA在master.cf里的服務(wù)名稱。
自動回信程序的設(shè)計
如果你想設(shè)計自己的自動回信程序,有些重要考慮事項必須注意。首先,同時也可能是最重要的事項,就是程序的數(shù)據(jù)來源是網(wǎng)絡(luò)--一種不可信賴的數(shù)據(jù)源。千萬別假設(shè)你要處理的數(shù)據(jù)一定會是什么樣子,除了它們被可以安排成能征服你的系統(tǒng)之外。無論任何情況,都不應(yīng)該調(diào)用shell來處理不可信的外來數(shù)據(jù),讓外界有機會奪取你的系統(tǒng)的訪問權(quán)。
另一個要考慮的事項,是禮節(jié)教養(yǎng)問題。想像一下,如果自動回信程序的回信對象是一個含有幾千人的郵箱列表,將客戶請求的信息泄漏給幾千人,或是讓幾千人收到不相干的郵件,應(yīng)該都不是你原意見到的事。因此,在實際回信之前,最好先檢查寄件人地址是否為owner-list或list-request之類的形式。此外,還有一些地址恐怕也是你不想回復(fù)的,像postmaster、daemon、majordomo等。你的程序應(yīng)該將自己的信封地址設(shè)成空字符串,以免造成郵件循環(huán)。
許多郵件列表會利用precedence:標(biāo)題欄來注明它自己。它們通常使用bulk之類的值來表示郵件的性質(zhì)。你的回信程序應(yīng)該要檢查precedence:標(biāo)題欄的值,如果發(fā)現(xiàn)bulk、list或junk之類的字樣,就不必回信了。
最后,確定你的程序能記錄每封來信的處理狀況。一旦postfix將郵件托付給你的程序,你的程序就有檢查錯誤的責(zé)任,并為管理員提供可以在事后追查問題的線索。
在虛擬網(wǎng)域假設(shè)郵件列表管理系統(tǒng)
第二各例子,我們要示范如何在虛擬網(wǎng)域上設(shè)置一個郵件列表。
postfix與MLM之間的連接是通過別名文件:利用別名文件的:include;機制來展開列表,并將管理用途的別名對應(yīng)到實際地址與MLM管理程序。然而,只有l(wèi)ocal MDA才會處理系統(tǒng)的別名文件,virtual MDA沒有這方面的功能。
虛擬郵件列表的原理,是在本地網(wǎng)域下創(chuàng)建列表的相同版本,這各本地版本僅供系統(tǒng)內(nèi)部使用,外界用戶所用的仍是虛擬地址,他們并部知道本地版本的存在。在決定本地版本的名稱時,我們可設(shè)法將虛擬名稱包含在內(nèi),以便容納同系統(tǒng)上的其他虛擬網(wǎng)域列表。
通過上述文章的描述,我們可以清楚對Postfix虛擬網(wǎng)絡(luò)域名有個了解,希望大家在以后的學(xué)習(xí)、辦公中都能用到!
【編輯推薦】
- Postfix里的POP與Imap介紹
- Postfix的投遞過程詳解
- Postfix中的地址操作大全
- 教你如何設(shè)置Postfixadmin的自動回復(fù)
- 如何安裝PostfixAdmin
- 重裝網(wǎng)域服務(wù)器二招秘訣
- 2010年第三季度全球互聯(lián)網(wǎng)域名注冊總數(shù)接近2.02億
- 互聯(lián)網(wǎng)域名系統(tǒng)(DNS)安全到達里程碑