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