一、前言
雖然現在QQ、微信等即時聊天工具原來越盛行,但是在企業與企業之間大部分還是會使用郵件系統進行信息交換。所以作為運維人員,更需要了解這個技術的原理。下面會慢慢介紹郵件的組件功能,將其組成部分。以及郵件的工作原理。
小貼士:郵件系統是一個比較復雜的系統,過程比較繁瑣,但了解之后對郵件系統搭建將會起到很大的作用。所以請耐心查閱,讓螃蟹慢慢跟您介紹。
二、郵件服務器與DNS之間的關系
最開始互聯網傳遞郵件十分簡單。因為最開始的計算機都是大型機主機,并保持24小時不停機,用戶也是實時在線,而且每臺主機都有固定的IP地址。
如果www.pangxie.com主機中的eric用戶想法郵件給www.windchaser.com主機里的wqp用戶,他只需要以發件人為 eric@www.pangxie.com 收件人為 wqp@www.windchaser.com 發送郵件即可。
但是隨著小型電腦PC盛行,電腦PC無需24小時開機,導致用戶不可能一直在線。如果在eric想發郵件給wqp的時候,這時wqp用戶所在的電腦早已關機,那么eric將無法傳遞郵件給到wqp用戶。
基于這種情況下,我們就迫切需要一臺郵件服務器為所在域內的所有電腦或服務器統一接收發和管理郵件。
演變到后來,我們現在發送郵件將不需要再直接寫一臺主機了,而是@域名的格式即可。但是這樣有存在一個問題,域本身是無法接收郵件的。所以我們必須找到域中用來處理郵件的服務器是誰,這時就需要和DNS聯系了。
DNS根據MX記錄來查詢郵件交換器的。 MX:Mail eXchange
當DNS上存在多個MX記錄的主機的時候怎么辦,如何判斷哪臺才是主服務器,哪臺是輔助的服務器呢?這時就是根據DNS的郵件級判斷了。DNS上定義的值越小,其優先級越高。但是如果過域里有多臺郵件交換器,他們之間工作是負載均衡,還是熱備機備份呢?請看下圖介紹
①當發件方需要發送郵件給對方郵件服務器,需要向DNS請求查詢對方郵件服務器的MX記錄。 ②DNS通過查詢MX表信息。 ③將查詢到的MX信息返回給發送方。 ④發送方根據優先級,將郵件投遞給對方優先級高的郵件服務器(mail1)。 ⑤如果主郵件服務器過于繁忙,或者不在線的時候,會將郵件投遞給輔的郵件交換器(mail2)上。 ⑥待主郵件服交換器空閑下來后,mail2會將代替接收下來的郵件再轉給主郵件交換器(mail1)。
小貼士:輔助交換器接受到郵件并不能保存郵件。而是這個輔助交換器會等到主郵件交換器空閑的時候把代替它接受下來的郵件在轉給主郵件交換器。所以任何郵件處理都是主郵件交換器處理的。所以我們實際情況下,如果有2臺服務器做郵件交換器,性能比較高的應該為主的。
三、郵件傳輸所需的程序
MUA(Mail User Agent):功能是向外發送郵件的程序,以及提供用戶瀏覽與編寫郵件的功能。
MTA(Mail Transfer Agent):(可以理解為smtpd服務器)幫忙將用戶的郵件傳遞出去或接收進來。
MDA(Mail Delivery Agent):將接收下來的郵件存放到對應用戶郵筒當中的程序。
通過分析MTA所收到郵件的表頭或內容,來判斷此郵件是屬于哪個用戶,然后決定將此郵件投遞給哪個用戶的郵筒里
MRA(Mail Retrieval Agent):通過MRA服務器提供的郵政服務協議(POP)來接收自己的郵件
四、郵件發送過程
①用戶eric想發送郵件給wqp,通過終端登錄到mail.pangxie.com服務器上,編寫一篇郵件,以發件人為eric@pangxie.com,收信人為wqp@windchaser.com發送郵件 ②mail.windchaser.com主機調用smtp程序準備向外發送郵件 ③smtp看到是通過域名發送郵件,smtp會調用DNS客戶端 ④DNS客戶端會向DNS服務器查詢smtp所需求的域名信息 ⑤DNS服務器通過查詢MX記錄查找到域名所指向的郵件服務器信息。 ⑥DNS服務器將所查詢到的信息返回給DNS客戶端 ⑦smtp收到DNS對方MX信息之后,開始和對方郵件服務器通過TCP/IP三次握手,最終和郵件服務器里的smtpd服務建立聯系后,將郵件傳遞給了mail.windchaser.com服務器主機。 #小貼士:smtpd是郵件服務器的守護進程,監聽在TCP的25號端口 ⑧當smtpd收到mail.pangxie.com主機發來的郵件,如果是本地用戶的郵件,它將會繼續⑨,否則它會將它再繼續傳遞出去(這個就是開放式中繼) ⑨當smtpd接收下來郵件之后,發現此郵件目標正是本地用戶,它會調用MUA,將此郵件存放到郵筒(MailBox)里去。此郵筒的路徑一般為/var/spool/mail下以此用戶的名字命名的文件 ⑩wqp用戶使用終端登錄到mail.windchaser.com服務器上,通過mail命令查收郵件 ?查收的郵件會自動移至用戶家目錄一個叫mbox的文件夾。
五、開放式中繼代理(open relay)
如果eric發的郵件不是發給wqp@windchaser.com,而是發給peng@a.com,但是這封郵件被本地的smtp程序發給了mail.windchaser.com服務器了。mail.windchaser.com服務器接收了此郵件后發現不是自身域里的用戶,就會通過查詢DNS后找到a.com對應的MX記錄所指向的郵件服務器,然后再次轉發出去。這個就是中繼代理的功能。
但是我們會發現一個問題,為什么eric的smtp程序沒有直接將郵件投遞給a.com域里的郵件服務器呢?原因是因為以前的互聯網的網絡是很不可靠的,為了保證郵件能順利的傳遞給對方,每個郵件服務器都是開放中繼代理功能。如果mail.pangxie.com郵件服務器認為自己的通路不太可靠,而發現mail.windchaser.com的通路比較可靠,那么它就會將郵件投遞給mail.windchaser.com服務器,mail.windchaser.com服務器收取郵件后發現不是本地域里的用戶,就會友好的將此郵件再次投遞出去,最終投遞給a.com域。而windchaser.com就是開放式中繼的服務器。開放式中繼固然方便了正常郵件的發送,但是也造成了另一個負面的地方,那就是垃圾郵件。
六、電腦客戶端(MUA)發送郵件
在之前我們介紹了MUA,發現用戶想發送郵件都是通過終端連接到服務器上,然后在使用編輯器發送郵件。但是在我們日常工作中卻不會是這樣。例如我們在使用QQ郵箱、126郵箱時候,就不可能直接連接上它們服務器上發送郵件,而是通過電腦上的客戶端發送郵件。
具體流程如下:
①用戶在電腦中打開MUA程序。代表程序有Outlook、Foxmail。 ②當用戶編寫好郵件之后,在發送郵件之前注明了為我們提供向外發送郵件功能的郵件服務器地址,開始調用本地的smtp程序。 ③本地smtp根據用戶所提供的郵件服務器地址通過smtp協議開始和郵件服務器(mail.windchaser.com)建立連接,將郵件發送給本地域郵件服務器。 ④郵件服務器收到此郵件后,開始檢查郵件的目標地址是否是本地域用戶。如果是則執行第④步,如果不是執行第⑤步。 ⑤通過MDA分析郵件的表頭等信息,最終將郵件投遞到公共的郵筒里(MailBox)。 ⑥通過查詢DNS,解析目標郵件服務器對應的MX記錄,最后將郵件投遞出去。之后的步驟和上面一致,這里不再多做介紹。
小貼士:這里可以發現,其實mail.magedu.com也是有開放了中繼功能,所以郵件服務器還是需要開放本地網絡的中繼功能。僅僅為本地網絡中的客戶端中繼郵件,而mail.a.org發現收件人是本地域里的用戶,會無條件接收下來。
七、通過MUA接收郵件(POP3,IMAP4)
由本地的smtpd服務接收下來郵件,由MDA投遞放到用戶對應的郵筒里去。這時會建立另一個服務,這個服務器能夠實現讓用戶通過賬號密碼連接此服務,此服務能夠根據用戶的賬號密碼驗證用戶的身份,并在在驗證之后以用戶的身份到到郵筒里去取出用戶的郵件,并且把它返回給用戶,這個就叫做MRA(郵件檢索或郵件取回代理) 而整個服務就是pop3或imap4服務。
詳細流程如下:
①本地電腦調用MUA程序。 ②wqp用戶將自己的賬號和密碼,通過pop3協議去連接POP3服務。 ③POP3服務通過驗證用戶身份,驗證通過之后,調用MRA程序,使用用戶的賬號信息提交給MailBox。 ④MailBox根據MRA程序請求,取出用戶的郵件,最終將郵件返回給用戶。
小貼士:這個流程就說明為什么我們在配置MUA的時候不止需要配置發送的郵件服務器,也要配置接收郵件的服務器。
八、webmail,通過網頁形式收發郵件
在使用網頁形式收發郵件前,郵件服務器必須首先建立web服務器,通常是通過CGI腳本為用戶提供腳本。
用戶就能不在通過MUA客戶端程序才能發送和接收郵件,而只需要在本地打開瀏覽器,輸入對應服務器地址,并提供用戶的賬號密碼,當郵件服務器認證通過之后,CGI腳本就會把用戶賬號信息傳送給MRA,由MRA到MailBox收取對應用戶的郵件,然后再網頁界面展示給用戶。
如果用戶需要發郵件的話,在瀏覽器中點擊寫郵件,就會打開一個編輯器,寫完之后點擊發送,我們CGI就會調用本地的smtp,將郵件發給MTA,由MTAX向外進行發送。這個程序就叫做WebMail
九、關于發送郵件的身份驗證
雖然看上去郵件發送流程已經完備了,但是還是存在另一問題,那就是我們在郵件發送流程中,域里的郵件服務器并沒有對發送郵件的用戶身份進行驗證,而僅僅是對內網的IP地址進行中繼代理放行。那么假設公司有人在外地工作,那么該用戶的所用網絡肯定不是內網的IP地址,郵件服務器檢測到不是允許中繼的IP地址,將拒絕將郵件進行轉發的??墒撬_實是我們公司的用戶,這樣肯定不和常理。并且還要注意一點,由于IP地址是可以偽裝的,有可能會因為內部人員對公司郵件服務器進行破壞。所以認證用戶身份是必不可少的。但是由于smtp過于簡單,所以他沒有對發送用戶進行認證功能,這時就需要借助額外的機制,這個機制就是SASL。
SASL:Simple Authentication Security Layer簡單認證安全層,是一種協議,是一個庫文件 ,用戶為其他沒有認證功能的服務提供認證功能
提供SASL這個功能的軟件叫cyrus-sasl,是一個通用組件
小貼士:SASL默認功能是不開啟的
詳細認證過程請看下圖:
①用戶向服務器請求發送郵件,并將用戶賬號密碼提供給郵件服務器 ②郵件服務器調用SASL程序 ③SASL只是一個認證框架,本身并沒有認證功能。所以需要尋找額外的認證機制。從認證機制中比對用戶的賬號密碼,認證通過則執行第⑤步,否則執行第④步 ④認證不通過,郵件服務器拒絕轉發此郵件 ⑤認證通過,郵件服務器根據DNS解析MX記錄后,將郵件投遞到目標郵件服務器。
小貼士:常用的認證機制還有plain,login,mysql,ldap,這些認證機制都需要一個模塊來實現,哪種機制就表明要去哪個庫去找賬號密碼的。
十、關于發送和接收郵件的加密
如果你發送的郵件具有商業秘密或者軍事秘密的郵件,不希望別人能查看的到,這時需要對郵件進行加密處理。但是smtp過于簡單,根本沒有對郵件進行加密的功能。所以在郵件傳遞過程中,smtp、pop3、imap4都是明文的。由于此三個協議都屬于不同的程序,如果僅對其中一個程序加密是無法保證郵件是安全的。所以需要分開對加密。
對于pop3和imap4,由于處理方式都是在自己域里,所以相互之間通過協商后可以使用pop3s,imaps加密方式對收件方式進行加密。但是對于smtp相對很難,因為在郵件傳遞過程中,smtp不單單會在自身域里傳遞,而且也會與其他郵件服務器之間傳遞,所以直接使用加密某個smtps協議很難實現。
所以smtp需要使用基于S/MIME,GPG的程序對郵件發送過程進行加密。
加密方法如下:
小貼士:加密過程是屬于另一個較大的知識范疇,這里不做詳細介紹。日后將會更新此相關博客,請耐心等待哈(*^__^*)
十一、關于垃圾郵件和病毒郵件的過濾
由于smtp自身比較簡單,而現在對郵件用戶危害較大的注意有2種,垃圾郵件和病毒郵件。
常用的反垃圾郵件有spam assassin
常用的反病毒郵件有clamav病毒郵件防護網關
但smtp并不能調用這兩種組件來為防范病毒和垃圾郵件,他還需要借用caller機制實現。而caller能夠實現讓郵件發過來后先要反病毒郵件過濾器過濾一次,要防垃圾郵件過濾一次,如果沒有問題了就再向外發。
小貼士:著名的caller有mailscanner、mmedefang、amavised-new。
詳細郵件過濾過程如下圖:
①eric用戶向郵件服務器(mail.pangxie.com)請求發送郵件 ②郵件服務器通過查詢DNS的MX記錄最終將郵件發往mail.windchaser.com郵件服務器 ③mail.windchaser.com郵件服務器收到郵件之后先調用caller程序 ④caller調用反病毒郵件檢測程序,對郵件進行病毒檢測 ⑤caller調用反垃圾郵件檢測程序,對垃圾郵件進行檢測 ⑥如果反病毒郵件程序和反垃圾郵件程序檢測結果無誤,則mail.windchaser.com服務器將此郵件接收下來放到用戶的郵筒里。
十二、總結
1、郵件傳輸所需的程序:MUA、MTA、MRA、MDA
2、由于smtp過于簡單,所以為完善整個郵件過程中需要額外的程序和應用。例如:DNS、web、pop3、imap4、pop3s、imaps、SASL、caller等
3、eric@pangxie.com發送給wqp@windchaser.com的完成過程
備注:此博客為本人學習總結的,寫的并不太詳細,寫的不好或者不對的地方還希望能多多見諒。希望能和各位多多交流。
原創文章,作者:螃蟹,如若轉載,請注明出處:http://www.www58058.com/7049
庖丁解牛,文章名字也起的生動有趣,增色不少,非常贊
@stanley:還好還好,謝謝老師鼓勵