幾年以前,Linux環境下可以選擇的可以免費郵件伺服器軟體只有Sendmail,但是由於Sendmail的缺陷,一些開發者先後開發了若干種其他的郵件伺服器軟體。目前,運行在Linux環境下免費的郵件伺服器,或稱為MTA(Mail Transfer Agent)有若干種選擇,比較常見的有Sendmail、Qmail、Postfix、exim及Zmailer等等。本文希望透過對幾種影響相對來說比較大的主流Linux環境下的MTA的特點進行闡述,並對其優缺點一一金星分析比較,使用戶在選擇Linux環境下的免費MTA時有一個選擇的依據。
Postfix
Postfix是一個由IBM資助下由Wietse Venema 負責開發的自由軟體工程的一個產物,其目的是為用戶提供sendmail以外的郵件伺服器選擇。 Postfix力圖做到快速、易於管理、提供盡可能的安全性,同時盡量做到和sendmail郵件伺服器保持相容性以滿足使用者的使用習慣。起初,Postfix是以VMailer這個名字發布的,後來因為商標上的原因而改名為Postfix。
主要設計目標
Postfix工程的目標是實現一個郵件伺服器,提供給使用者除sendmail以外的選擇。其設計目標包括:
效能, Postfix要比同類的伺服器產品速度快三倍以上,一個安裝Postfix的桌上型電腦一天可以收發百萬封信件。 Postfix設計中採用了web伺服器的的設計技巧以減少進程創建開銷,並且採用了其他的一些文件訪問優化技術以提高效率,但同時保證了軟體的可靠性。
相容性. Postfix設計時考慮了保持Sendmail的相容性問題,以使移植變的更加容易。 Postfix支援/var[/spool] /mail, /etc/aliases, NIS, 及~/.forward等文件。然而Postfix為保證管理的簡單性,所以沒有支援設定檔sendmail.cf。
安全和健壯性。 Postfix設計上實現了程式在過量負載情況下仍然保證程式的可靠性。當出現本地檔案系統沒有可用空間或沒有可用記憶體的情況時,Postfix就會自動放棄,而不是重試使情況變的更糟。
靈活性。 Postfix結構上由十多個小的子模組組成,每個子模組完成特定的任務,例如透過SMTP協定接收一個訊息,發送一個訊息,本地傳遞一個訊息,重寫一個位址等等。當出現特定的需求時,可以用新版本的模組來取代舊的模組,而不需要更新整個程式。而且它也很容易實現關閉某個功能。
安全性。 Postfix使用多層防護措施防範攻擊者來保護本地系統,幾乎每個Postfix守護程序都能運行在固定低權限的chroot之下,在網路和安全敏感的本地投遞程序之間沒有直接的路徑—一個攻擊者必須先突破若干個其他的程序,才有可能存取本機系統。 Postfix甚至不絕對信任自己的佇列文件或IPC訊息中的內容以防止被欺騙。 Postfix在輸出發送者提供的訊息之前會先過濾訊息。而且Postfix程式沒有set-uid。
Postfix的一些特點
支援多傳輸域:sendmai支援在Internet, DECnet, X.400及UUCP之間轉送訊息。 Postfix則是靈活的設計為無須虛擬域(vistual domai)或別名來實現這種轉發。但是在早期的發布裡僅僅支持STMP和有限度地支持UUCP,但對於我國用戶來說,多傳輸域的支持沒有什麼意義。
虛擬域:在大多數通用情況下,增加對一個虛擬域的支援僅僅需要改變一個Postfix查找資訊表。其他的郵件伺服器通常需要多個層級的別名或重定向來獲得這樣的效果。
UCE控制(UCE,unsolicited commercial email): Postfix能限制哪個主機允許透過自身轉送郵件,並且支援限定什麼郵件允許接進。 Postfix實現通常的控制功能:黑名單清單、RBL查找、 HELO/發送者DNS核實。基於內容過濾目前沒有實作。
表查看: Postfix沒有實作位址重寫語言,而是使用了擴充的表格檢視來實現位址重寫功能。表可以是本機dbm或db檔案等格式。 [Cut-Page]
Postfix體系結構及與Sendmail的比較
Postfix是基於半駐留,互通的進程的體系結構,每個進程完成特定的任務,沒有任何特定的進程衍生關係(父子關係)。而且,獨立的進程來完成不同的功能相對於「單塊」程式具有更好的隔離性。此外,這種實現方式具有這樣的優點:每個服務如地址重寫等都能被任何一個Postfix部件所使用,無須進程創建等開銷,而僅僅需要重寫一個地址,當然並不是只有postfix採用這種方式。
Postfix是按照這種方式實現的:一個駐留主伺服器根據命令運行Postfix守護進程,守護進程完成發送或接收網路郵件訊息,在本地遞交郵件等等功能。守護程序的數目由配置參數來決定的,並且根據配置決定守護程序運行的次數(re-used times),當空閒時間到達配置參數指定的限度時,自動消亡。這種方法明顯地降低了進程建立開銷,但是單一進程之間仍然保持了良好的隔離性。
Postfix的設計目標就是成為Sendmail的替代者。由於這個原因,Postfix系統的許多部分,如本地投遞程式等,可以很容易地透過編輯修改類似inetd的設定檔來替代。
Postfix的核心是由十多個半駐留程序實現的。為了確保機密性的原因,這些Postfix進程之間透過Unix的socket或受保護的目錄之下的FIFO進行通訊。即使使用這種方法來保證機密性,Postfix進程並不會盲目信任其透過這種方式接收到的資料。
Postfix進程之間傳遞的資料量是有限制的。在很多情況下,Postfix進程之間交換的資料資訊只有佇列檔案名稱和接收者列表,或某些狀態資訊。一旦郵件訊息被儲存進入文件,其將在其中儲存到被一個郵件投遞程式讀出。
Postfix採用一些通常的措施來避免遺失資訊:在收到確認以前透過呼叫flush和fsync()來保存所有的資料到磁碟中。檢查所有的系統呼叫的回傳結果來避免錯誤狀況。
大多數建置郵件伺服器者都會選擇sendmail,公平的來講sendmail是一個不錯的MTA(Mail Transfer Agent),最初開發時Eric Allman的設計考慮主要放在了郵件傳遞的成功性。不幸的是,Sendmai開發時沒有太多考慮Internet環境下可能遇到的安全性的問題。 Sendmail在大多數系統上只能以根用戶身份運行,這意味著任何漏洞都可能導致非常嚴重的後果,除了這些問題之外,在高負載的情況Sendmail 運行情況不是很好。
安全
Postfix則並且一定要以root的身分執行,而只需要一個主(master)程式以root身分執行,其產生進程來處理存取、發出及本地郵件投遞工作。透過使用一系列模組部件,每個任務由一個單獨的程式來運行(這樣使審計變的容易一些)。例如發出郵件被卸載到一個佇列目錄,在這裡“pcikup”程序取到該郵件然後將郵件傳遞給“cleanup”程序,其再將郵件傳遞給“trivial-rewrite”,其負責處理郵件頭,最後若郵件目的是別的系統則將郵件傳遞給「smtp」程式。而且相對於Sendmail來說Postfix也比較容易設定chroot'ed環境。只要簡單地透過編輯master.cf(一般位於/etc/postfix內)檔案即可實現,並且Postfix將運行chroot'ed,以限定在其定義的佇列目錄之下(通常位於/var/spool/postfix) ,同樣可以在master.cf中對Postfix的單一模組設定進程限制。使用者可以限制Postfix以哪個使用者的身分運行,一般來說是以「postfix」使用者(概念上該使用者和Apache的nobody類似)運行,該使用者可以存取特定的佇列目錄。 Postfix其他的主要優點是起設定檔的清晰易懂性。
與Sendmail的比較如sendmail之類的郵件系統是按照一個單塊的結構設計實現的,該“單塊”程序實現所有的功能。當然這種結構有利於在系統的不同部分之間共享資料。但是這種結構容易出現一些致命的錯誤。而如qmail的郵件系統上使用一種分層次的結構,按照固定得順序運行不同功能的子模組進程,執行完畢之後就將其釋放。這種方法有良好的「絕緣」性,但是增加了進程創建開銷和進程間通訊開銷。但是透過合理的規劃子模組進程的運作順序可以將開銷保持在可以接受的範圍內。
使用其他的MTA取代Sendmail是一件非常麻煩的事情,用戶往往要花大量的時間去熟悉新的MTA的配置和使用。而使用Postfix,你可以利用很多以有的設定檔。如(access, aliases, virtusertable等等),只需要簡單的在master.cf中定義一下即可。此外,Postfix在行為上也很像Sendmail,使用者可以使用sendmail指令來啟動Postfix。
當然,使用一個軟體來取代另一個軟體需要解決特定的問題。部分原因是因為Postfix的安全特性,在設定Postfix時可能會遇到一些問題。最典型的問題是向root用戶發送郵件。 Postfix一般不提高自身的權限(向root使用者發送郵件所必須的)來投遞郵件。使用者需要在別名檔案中為root定義別名,如:root: someuser。這同樣會對若干個郵件列表模組產生影響,特別是SmartList。一般來說實現郵件清單最好使用Majordomo,它易於配置。
Sendmail一個很突出的問題就是可擴充性和效能問題。例如使用者若希望每天重新啟動Sendmail來實現自動更新設定檔(如為虛擬主機重定向郵件)就會出現問題。 Sendmail產生新的進程來處理發送和接收郵件,這些進程會一直存在直到傳輸結束,之後Sendmail才能退出,這樣你的腳本程式將不能正確的重起Sendmail。而對於Postfix,使用者則只需要發出指令postfix reload即可,Postfix將會重新載入其設定檔。
另外,對於有數以萬計的用戶的郵件伺服器來說,使用文件來儲存如匹配用戶發出郵件地址(例如bob發出的信的發信人修改為[email protected])。對於大量使用者來講,該檔案就會變的很巨大,進而影響系統的運作效率。而Postfix則可以和一個資料庫後台整合起來(目前只支援MySQL)來存放其配置信息,資料庫方式要比文件方式在可擴展性方面強大很多。
遵從IBM的開放原始碼版權許可證,使用者可以自由地散佈該軟體,進行二次開發。其唯一的限制就是必須將對Postfix所做的修改回傳給IBM公司。因為IBM資助了Wietse的開發。
與Qmail的比較
Qmail的缺點就是設定方式和Sendmail不一致,而且不容易維護。而且Qmail的版權許可證含義非常模糊,甚至沒有和軟體一起發布。應用作者的話:若你希望分發自己修改版本的Qmail,你必須得到我的許可。
Qmail qmail是有Dan Bernstein開發的可以自由下載的MTA,第一個beta版本0.70.7發佈於1996年1月24日,1997年2月發布了1.0版,目前版本是1.03。 [Cut-Page]
Qmail的特點
安全性為了驗證Qmail的安全性,Qmail的支持者甚至出資$1000懸賞尋找Qmail的安全漏洞,一年以後,該獎金沒有被領取,而被捐獻給自由軟體基金會。目前,Qmail的作者也出資$500來尋求Qmail的安全漏洞。
速度:Qmail在一個中等規模的系統可以投遞大約百萬封郵件,甚至在一台486一天上能處理超過10萬封郵件,起支援並行投遞。 Qmail支援郵件的並行投遞,同時可以投遞約20封郵件。目前郵件投遞的瓶頸在於SMTP協議,透過STMP向另外一台網路主機投遞一封電子郵件大約需要花費10多秒鐘。 Qmail的作者提出了QMTP(Quick Mail Transfer Protocol)來加速郵件的投遞,並且在Qmail中得到支援。 Qmail的設計目標是在一台16M的機器上最終達到每天可以投遞大約百萬級數目的郵件。
可靠性:為了確保可靠性,Qmail只有在郵件被正確地寫入到磁碟才返回處理成功的結果,這樣即使在磁碟寫入中發生系統崩潰或斷電等情況,也可以保證郵件不會丟失,而是重新投遞。
特別簡單的虛擬域管理,甚至有一個第三方開發的稱為vpopmail的add-on來支援虛擬POP域。使用這個軟體包,POP3用戶不需要有系統的正式帳戶。
使用ezmlm支援使用者自控制的郵件清單功能。
郵件使用者和系統帳戶隔離,為使用者提供郵件帳戶不需要為其設定係統帳戶,從而增加了安全性。
Sendmail vs Qmail
首先:sendmail是發展歷史悠久的MTA,目前的版本是8.10.2。當然,Sendmail在可移植性、穩定性及確保沒有bug方面有一定的保證。但是Internet上有很多貼文都是關於如果攻擊Sendmail,這對管理員來說是一個噩夢。 Sendmail在發展過程中產生了一群經驗豐富的Sendmail管理員,並且Sendmail有大量完整的文檔資料,除了Sendmail的寶典:O'Reilly's sendmail book written by Bryan Costales with Eric Allman以外,網絡上有大量的tutorial 、FAQ和其他的資源。這些大量的文件對於很好的利用Sendmail的各種特色功能是非常重要的。但是Sendmai目前來說是一個成熟的MTA。
當然,Sendmail具有一些缺點,其特色功能過多而導致設定檔的複雜性。當然,透過使用m4宏使設定檔的生成變的容易很多。但是,要掌握所有的設定選項是一件很不容易的事情。 Sendmail在過去的版本中出現過許多安全漏洞,所以讓管理員必須趕快升級版本。而Sendmail的流行性也使其成為攻擊的目標,這有好處也有壞處:這意味著安全漏洞可以很快地被發現,但同樣使Sendmail更加穩定和安全。另外一個問題是Sendmail一般缺省配置都是具有最小的安全特性,讓Sendmail往往容易被攻擊。如果使用Sendmail,應該確保明白每個開啟的選項的含義和影響。一旦你了解Sendmail的工作原理,就Sendmail的安裝和維護就變的非常容易了。透過Sendmail的設定文件,使用者實現完成一切可以想像得到的需求。
Qmail是一個選擇,其在設計實作中特別考慮了安全性問題。如果你需要一個快速的解決方案如,一個安全的郵件網關,則Qmail是一個很好的選擇。 Qmail和Sendmail的設定檔完全不同。而對於Qmail,其有自己的設定文件,配置目錄中包含了5-30個不同的文件,各個文件實現對不同部分的配置(如虛擬域或虛擬主機等)。這些配置說明都在man中有很好的文檔,但是Qmail的程式碼結構不是很好。
Qmail比Sendmail小很多,而且缺乏一些現今郵件伺服器所擁有的特色功能。如不像Sendmail,qmail不對郵件信封的發送者的網域進行驗證,以確保網域的正確性。自身不提供對RBL的支持,而需要add-on來實現。 ,而Sendmail支援RBL。同樣Qmail不能拒絕接收目的接收者不存在信件,而是先將郵件接收下來,然後返回查無此用戶的的郵件。 Qmail最大的問題就出在發送郵件給多個接收者的處理上。若發送一個很大的郵件給同一個網域中的多個用戶,Sendmail將只向目的郵件伺服器發送一個郵件拷貝。而Qmail將並行地連接多次,每次都發送一個拷貝給一個用戶。若用戶日常要發送大郵件給多個用戶,使用Qmail將浪費許多頻寬。可以這麼認為:Sendmail優化節省頻寬資源,Qmail優化節省時間。若使用者係統有很好的頻寬,Qmail將具有更好的效能,而如果使用者係統的頻寬資源有限,並且要傳送很多郵件清單訊息,則Sendmail效率更高一些。 Qmail不支援. forward(.forward在許多情況下對使用者很有用處);不使用/var/spool/mail,而是將郵件存放在使用者home目錄。以下是一些使用Qmail不容易完成的工作,要使用Qmail完成這些工作,可能需要使用者自己實作或使用第三方提供的不夠可靠的模組。
Qmail的原始碼相對於Sendmail來說要更容易理解,這對於希望深入到內部了解MTA機制的人員來說是一個優點。 Qmail在安全性方面也要穩定一些。 Qmail有很好的技術支持,但是沒有像Sendmail那樣被廣泛地應用和大量的管理員用戶群。 Qmail的安裝不像Sendmail那樣自動化,需要手動步驟。而且Qmail的文檔不如Sendmail那麼完整和豐富。
Qmail的add-ons比Sendmail少一些。一般來說對於經驗稍微少一些的管理員,選擇Qmail相對好一些。 Qmail要簡單一些,而且其特色功能能滿足一般使用者的需求。 Sendmail類似office套件,80%的功能往往都不被使用。這就使Qmail在某些場合可能被更受歡迎一些,其具有一些Sendmail所沒有的更流行和實用的特色功能,如:Qmail具有內建的pop3支援。 Qmail同樣支援如主機或使用者的偽裝、虛擬網域等等。 Qmail的簡單性也讓配置相對容易一些。
Qmail被認為相對於Sendmail更加安全和高效,運行Qmail的一台pentium機器一天可以處理大約200,0000條訊息。
qmail相對於其他的MTA則簡單很多,主要體現在:
(1)其他的MTA的郵件轉寄、郵件別名和郵件列表都是採用相互獨立的機制,而qmail採用一種簡單的轉送(forwarding)機制來允許使用者處理自己的郵件列表
(2)其他的MTA都提供快速而不安全的方式及慢的隊列方式的郵件投遞機制;而qmail發送是由新郵件的出現而觸發的,所以其投遞只有一種模式:快速的隊列方式
(3)其他的MTA其實包括一個特定版本的inetd來監控MTA的平均負載,而qmail設計了內部機制來限制系統負載,所以qmail-smtpd能安全地從系統的inet來運行
sendmail有很多的商業支持,而且由於大量的用戶群,在網路上有大量的潛在技術支援。而Qmail只有很有限的技術支援。有家公司inter7.com提供對Qmail的支持,該公司同樣提供了免費的add-ons,包括一個基於web的管理工具-QmailAdmin及一個透過vpopmail的對虛擬域的支持,甚至具有一個基於web的客戶借接口—SqWebMail。
Qmail還具有一些其他的缺點。如它不是完全遵從標準,它不支援DSN,作者認為DSN是即將消亡的技術,而Qmail的VERP可以完成同樣的工作,但又不像DSN依賴其他主機的支援。 Qmail另外一個問題是其不遵從支援7bit系統標準,而每次都發送8bit。若郵件接收一方不能處理這種情況,就會出現郵件亂碼的情況。
從安全性來講,Sendmail要比Qmail差一些,Sendmail在發展中出現過很多很著名的安全漏洞;而Qmail相對要短小精悍,但是仍然提供了基本的STMP功能。而Qmail的程式碼註解要少一些。 Qmail的一個很好的特點是其支援一種可選的基於目錄的郵件儲存格式,而不是使用一個很大的檔案來儲存使用者所有的郵件。若使用者的郵件伺服器進行許多的POP3服務,則這種郵件儲存格式可以提高效率。但是遺憾的是Pine本身並不支援這種儲存格式,如果需要可以使用一些補丁來達到這個目的。
Qmail的優點是:每個用戶都可以創建郵件列表而無須具有根用戶的權限,如用戶foo可以創建名為foo-slashdot, foo-linux,foo-chickens 的郵件列表,為了提供更好的功能,有一個叫ezmlm(EZ Mailing List Maker)的工具可以支援自動註冊和註銷、索引等Majordomo所具有的各種功能,但是都是CLI驅動的,只需要編輯很少的檔案。 Qmail非常適合在小型系統下工作,一般只支援較少的使用者或用來管理郵件清單。 Qmail速度快且簡單:Qmail是當你希望安全切容易配置的最佳的選擇;Qmail 可以在2個小時內搞定配置,而Sendmail可能在兩天內都搞不定。
rocketmail internic 等都使用qmail來構建
ZMailer
ZMailer是一個高效能、多進程的Unix系統郵件程式。 [ aka MTA per X.400 parlance ],其可從下面的伺服器ftp://ftp.funet.fi/pub/unix/mail/zmailer/ 自由下載。其也是依照單塊模式設計的。如Hotmail等郵件系統就是用Zmailer建構的。
Exim Exim是由Cambridge 大學開發的遵從GPL的MTA,其風格上類似與Smail 3,但是比Smail 3更加完善。目前最新版本是3.15。其主網站為http://www.exim.org/。其最大的特色就是設定簡單性,但是其安全性不如Qmail及Postfix。
以下是幾種MTA的特徵的比較,綜合的來講,Qmail和Postfix都是很不錯的MTA,選擇的標準往往是個人的喜好問題,Postfix發展歷史要比Qmail遲一些。
MTA 成熟性安全性特色性能Sendmail相容性模組化設計qmail medium high high high addons yes Sendmail high low high low x no Postfix low high high high yes yes exim medium low high medium yes no
當然除了這裡介紹的幾種MTA以外,還有Smail, Post.Office,the Sun Internet Mail Server (SIMS), MMDF, CommuniGate,PMDF, Netscape Messaging Server,Obtuse smtpd/smtpfwdd,Intermail,MD Switch等其他商業或者免費的MTA可以選擇。