郵件服務器運作原理

http://blog.chinaunix.net/uid-291705-id-2134410.html

郵件服務器運作原理

既然要使用 e-mail ,當然就需要郵件主機服務器囉 (Mail Server )!不然你的信要怎樣寄出去呢?事實上,mail server 的原理說難不難,但是說簡單嗎~似乎又有點難以理解ㄋㄟ~,所以,底下我們要來談一談他的原理部分,然後再針對主機的設定來進行說明咯!底下,我們首先要講的,就是『Mail server 系統與 DNS 系統有什麼關連性?』這個部分新手最容易被搞混哩,是否要架設 mail server 就『宿命』的一定得架設 DNS 主機在你的主機上面嗎


Mail與 DNS 系統的相關性:

一直以來,Mail server 與 DNS 系統就是分不開的,怎麼說呢?今天如果你要寄電子郵件的話,那麼就得藉由郵件主機幫你將信件送出去,對吧!那麼我們在 DNS 那個篇幅裏面也談到了相當多的概念了,就是,人腦實在無法記憶住計算機網絡的 IP 數據,因此,纔會有所謂的 Domain Name System,DNS 主機,這個 DNS 主要的功能之一,就是將主機名稱轉譯成爲 IP ,我想,這裏您應該也已經瞭解了,對吧!如果是『不瞭解』,那麼不要往下看了,請前往 簡易 DNS 服務器 去瞧一瞧,瞧完了再回來繼續吧!OK!好了,既然如此的話,那麼使用郵件主機來寄信,並且不想要背主機所在的 IP ,那蛣M就一定需要讓你的主機名稱可以經由 DNS 系統來找到你的 IP 囉!對吧!沒錯,如果你真的要提供一個 Internet 上面的郵件主機,最好還是註冊一個合法的主機名稱,比較好記憶ㄋㄟ~

好了,接下來要討論的就是,既然我的主機需要 DNS 來轉譯主機名稱使成爲 IP ,那麼我真的就得必須要架設 DNS嗎?當然不是!要注意的是,我們剛剛提到的是『我就得在 Internet 上面註冊一個合法的主機名稱來對應 IP 』而不是『一定得要架設 DNS在我的主機上面!』這個很重要,因爲有太多的新手被 mail server 與 DNS server 的關係搞錯亂了!如果到這裏又混亂了!那麼請,真的,一定,回到 DNS 服務器那篇去慢慢的再從頭讀一次,否則.....也就是說,我們需要的是『合法註冊過的主機名稱』就是了!所以,你可以使用動態 IP 去申請一個動態 IP 的領域名稱,也可以使用各大 ISP 提供的各項功能來註冊,反正只要能夠註冊一個領域名稱就是了!當然,你也可以自行去註冊一個 DNS 主機,並且在你的主機上面建立 DNS 系統,但這並非是必要的!

那麼,假設我的主機名稱對應 IP 已經成功的在 Internet 上面完成合法註冊了,這樣就好了嗎?是這樣沒錯啦!確實,只要有主機名稱對應到 IP ,亦即是有 A ( Address ) 這個 DNS 的標誌後,那麼就可以架設 mail server 了,並且,一般來說,應該不會有問題的!然而, DNS 系統本身還有其它的功能可以支持 mail server ,使 mail server 更穩定與具有更佳的避免信件遺失功能,所以,就有 MX 這個 DNS 的標誌產生啦!MX 這個 DNS 設定中的標誌,主要就是要給 mail server 用的,基本上, MX 就是 Mail eXchanger 的縮寫,他可以讓 Internet 上面的信件馬上找尋到 Mail 主機的位置,此外,由於 MX 後面可以接數字,因次,一個 domain 或者是一部主機,可以有多個 MX 標誌,這有什麼好處呢?主要的好處就是可以讓,當主要的 mail server 掛點時,由於有 mx 標號,因此,信件不會直接退回,而是跑到下一個 MX 設定的主機去,並且暫存在該處,等到主要的 mail server 起來之後,這個 MX 設定的主機就會將信件給他傳送到目的地!如此一來,甚至可以達到異地備援的功效呢!不只如此喔!MX 的功效還很多!最大的優點就是有點類似 router 的功能,我們或許可以稱之爲 郵件路由 吧!當有了 MX 標誌之後,由於這是 DNS 的設定,所以當你要傳送 mail 的時候,那麼就可以直接依據 DNS 的 MX 標誌直接將信件傳送到該設定的 mx 郵件主機,而不需要去尋問到底郵件要寄到哪裏去!這功能相當的不錯的!因爲可以讓你的郵件很快的而且正確的送達到目的地呢!此外,由於可以設定多個 mx ,因此,假設『此路不通』,也就是先使用的 mx 郵件主機不通的時候,那麼信件就會往下一個 mx 郵件主機傳送!這樣可以避免信件被退信的機會!當然就更加的穩定囉!不過,這裏也要特別強調, MX 『一定』要設定正確,否則,呵呵!反而會讓你的信件永遠在 Internet上面流浪呢

一般來說,郵件地址的寫法爲: [email protected] 的寫法,在小老鼠 ( @ ) 前面的指的是『賬號』,至於 @ 後面的則是主機的名稱!當你寄出這樣的一封信時,首先,你的郵件主機會先去 DNS 系統尋找 server.name 這個主機名稱對應的 IP 與 MX 標誌,若有 mx 標誌,那麼這封 e-mail 將會把信先送到該 mx 主機,然後再由該 mx 主機將信件送達目的地 ( 就是 server.name 這個主機啦 ) ,而如果有多個 mx 標誌時,那麼這封 e-mail 會送到最優先的 mx 主機去(也有可能這部主機就是目的地主機喔!),然後交給該主機來處理囉!而如果沒有 mx 標誌的話,那麼在查得 IP 之後,信件纔會慢慢的送達該郵件主機囉!在送達到郵件主機後,該主機則以前面的『賬號』將信件發送到各個使用者的郵件目錄下!所以囉,爲什麼說 mail 與 DNS 系統相關性很高呢?嘿嘿!由上面的說明您應該就不難了解啦! ^_^


郵件的傳送流程、MUA、MTA、MDA

約略瞭解了 DNS 與 mail server 之間的關係之後,在接下來我們要了解的是,那麼 mail 到底是如何傳送到目的郵件主機的呢?底下我們分成『寄信』與『收信』兩個主要的郵件主機使用方式來加以介紹囉!先說明一下關於『寄信』的部分好了,通常我們都是使用桌上型計算機來寄信的,舉個例子來說好了,如果你以 Netscape 或者 Kmail 或者 OutLook Express 來寄信的時候,那麼那封信到底是怎麼送出去的呢?可以參考一下底下的圖示來說明:
 


圖一、電子郵件以郵件主機寄送信件示意圖

 
先來說明一下什麼是 MUA, MTA 與 MDA 什麼的,再來說信件怎麼傳送的好了!

·  MUA( Mail User Agent ):顧名思義, MUA 就是『郵件使用者代理人』,華特(what)?郵件還需要代理人,怎麼回事呢?喔!這是由於通常我們 Client 端的計算機都無法直接寄信的(不然幹嘛要郵件主機?),所以,需要透過MUA 來幫我們傳達信件,不論是送信還是收信,Client 端的用戶都需要透過各個操作系統提供的 MUA 才能夠使用郵件系統。舉個例子來說, Windows 裏面的 OutLook Express, Netscape 裏面的 mail 功能與 KDE 裏面的 Kmail 都是MUA 啦! MUA 主要的功能就是收受郵件主機的電子郵件,以及提供使用者瀏覽與編寫郵件的功能!

·  MTA( Mail Transfer Agent ) : MUA 是用在 Client 端上面的軟件,那麼這個 MTA 就是用在郵件主機上面的軟件啦!他也是主要的郵件服務器喔!這個 MTA 就是『郵件傳送代理人』的意思。也來顧名思義一下,既然是『傳送代理人』,那麼使用者寄出的信,與使用者要收信時,就是找他 ( MTA ) 就對啦!因爲他要負責幫我們使用者傳送嘛!沒錯!基本上, MTA 的功能有這些:


 

1. 收受外部主機寄來的信件:既然是郵件主機,那麼『接收信件』想必就是主要的功能囉!呵呵,答對了!所以囉, MTA 最主要的功能就是收受外部來的信件,只要這個信件裏面有 MTA 內部的賬號時,那麼這封信就會被 MTA 收下來;

2. 幫使用者傳送 ( 寄出 ) 信件:既然可以收信,那麼自然也就可以發信囉!沒錯啦!只要使用者具有合法的使用 MTA 的權力,那麼該使用者就可以利用這部 MTA 將他把信傳送出去!不過需要注意的是, MTA 會將信件送給目的地的 MTA 而不是目的地的 MUA 喔!不要搞錯了!(注:曾經有個朋友跟我說,要我傳數據給他,而因爲他要接收我的信件,所以他的計算機"指的是 Windows 那個 Client 端的計算機" 得一直開着,真是不方便!聽到這句話時,害我嚇了一跳~這個觀念是不對的~因爲使用者使用的是 MUA ,而信件『僅會送達到 MTA 主機上面』而已,收、發信件時,都需要透過 MTA 來幫忙處理的!所以,使用者在使用郵件編輯器"MUA"將數據編輯完畢之後,按下送出,並且成功的送到 MTA 之後,接下來的事情就是 MTA 的工作了,跟使用者的 Client 端這部計算機 "一點關係也沒有了" )

3. 讓使用者自己的信可以收回去:使用者可以將放置在郵件主機的信件收到自己的個人計算機上面收看。

 
大致的功能就是這些啦!通常我們所說的 Mail server ( 郵件服務器 ) 就是指 MTA 而言的!

·  MDA( Mail Delivery Agent ) : 『郵件遞送代理人』主要的功能就是將 MTA 所收受的信件,依照信件的流向 ( 送到哪裏去 ) 來將該信件放置到本機賬戶下的郵件檔案中 ( Mailbox )!或者是再經由 MTA 將這個信件送到下個 MTA 去!而如果信件的流向是到本機當中時,這個郵件代理人的功能可不止是將由 MTA 傳來的郵件放置到每個使用者的 Mailbox 而已,他還可以具有郵件分析 ( filtering ) 與其它相關的功能呢!這個功能很了不起喔!怎麼說呢?具兩個例子來說好了:


 

1. 如果你知道某個廣告信件的主旨都是固定的,例如『AV情色XXX』,你想將這種信件直接給他丟掉垃圾桶,可以嗎?當然可以囉!透過 MDA 郵件分析的功能,就可以將信件丟棄啦!

2. 如果有一天你要出差去,看樣子可能一個星期碰不到電子郵件了,但是你又不想讓一些朋友認爲你在耍大牌都不回信的....這個時候你就可以利用 MDA 的功能,讓郵件主機分析到,當要送給你這個使用者的賬號的信出現時,就自動回覆一封回信,讓寄件者知道你在忙碌中....呵呵!這樣的功能是否很不錯呢?還不止這樣喔!其它的等一下後面再提吧!

·  Mailbox :『郵件信箱』說穿了,就是在你主機上面的一個目錄下的,某個人『專用』的信件收受檔案啦!舉個例子來說,系統管理員 root ,在預設的情況下,他會有個信箱,預設的檔案是在/var/spool/mail/root 這個檔案就是了,一個賬號都會有一個自己的信箱喔!然後,當 MTA 收到 root 的信時,就會將該封信件存到 /var/spool/mail/root 這個檔案中囉!使用者可以透過程序來將這個檔案裏面的信件數據讀取回去喔!

好了,瞭解了 MUA, MTA 與 MDA 之後,再來說到那麼如何將信寄出去呢?可以分爲底下幾個步驟:

1.   Step1 使用者利用 MUA 寄信到 MTA 上面:通常我們使用 MUA ( 例如 Outlook express ) 寫信的時候,你總是要定義出幾個咚咚:

o     發信人與發信網站:對啦,總是要有這個信息纔行的嘛!這個發信網站就是等一下 Step 2 接收信件的那個 MTA 啦;

o     收信人與收信網站:是的,就是[email protected] 的樣式啦!那個 account 就是該 e-mail.server 裏面的賬號啦!

好了,你在圖一左上角的那部機器上面,也就是『本地端用戶使用計算機』利用 MUA 的功能 ( 例如Outlook express 好了 ) 寫好了信之後,按下MUA 的那個『傳送』的按鍵,MUA 就會依據你所定義的主機地址將信發送到 MTA 上面;
 

2.   Step2 MTA 收到自己的信件,交由 MDA 發送到該賬號的 MailBox 當中:如果在 Step 1 所收到的信件中,那個 e-mail.server 就是 MTA 自己,此時 MTA 會將該信件交由 MDA 去處理,將信件放置在收進者的信箱中;


 

3.   Step3 MTA 將信再轉送出去:如果由 Step 1 來的信件的收件人並不是 MTA 的內部賬號,那麼該封信將會被再轉送出去!由 Step 1 及 Step 3 的動作,我們也稱爲 Relay (郵件轉遞) 的功能喔!


 

4.   Step4 遠程 MTA 收受本地的 MTA 所發出的郵件:遠程的 MTA 會收受我們這部 MTA 的信件,並將該信件交給他的 MDA 來處理 ( Step 5 ) ,此時,信件會存放在遠程的 MTA 上面,等待使用者登錄讀取或者下載回去!

整個流程大致上就是這樣。這個時候,你由左上角的MUA 將信件寄出之後,最後信件將會存放在右邊那部 MTA 主機裏面喔還沒有到達你的朋友的計算機 ( 就是右邊的 MUA 那部計算機 ) !這個時候,就要繼續談到收信的動作了!收信的動作有點像這樣:
 


圖二、客戶端收受郵件主機的電子郵件示意圖

 
遠程用戶使用的計算機直接連接到他的 MTA ,跟 MTA 要求察看自己的 mailbox 是否有信件,而 MTA 透過 MDA 去檢查之後,如果有信件的話,就會將他傳送回使用者的 MUA 中!同時,根據 MUA 的不同設定, MTA 會選擇將該 mailbox 清除掉,或者繼續保留!若繼續保留的話,那麼下次使用者再次的接收信件時,保留的信件會再次的被下載,因此,通常使用者 MUA 都是預設刪除掉 MTA 上面的Mailbox 內容的!接下來我們得談一談,那麼寄信與收信使用的是什麼協議呢?


使用的協議

總是得了解一下使用的協議吶!我們在寄信的時候,亦即由 MUA 將信件發送到 MTA 的過程中,以及 MTA 將信轉遞到下一個 MTA 的功能,目前絕大部分的郵件主機都是使用SMTP ( Simple Mail Transfer Protocol ) 這個協議,port number 爲 25 啦!在寄信的時候,你的 MUA 會主動的連接 MTA 的port 25 ,然後將信經由 MTA 的 smtp 協議( port 25 ) 而送出去!而郵件主機 MTA 在轉遞的時候,也是經由下一部 MTA 的 port 25 來將信送出去的!所以囉,不論你是使用什麼 MUA 或 MTA 郵件架設軟件,只要大家都支持 smtp ,那麼信件就可以順利的流傳囉!

收信呢?收信則是 MUA 經由 POP ( Post Office Protocol ) 協議來連接到 MTA 的使用者 Mailbox,以讀取或者下載使用者在 Mailbox 當中的信件。,目前常用的 POP 協議爲 POP3 ( Post Office Protocol version 3 ),這個協議產生的 port number 爲 110 ,所以,你的 MUA 經由 MTA 的 port110 將信件由 MTA 的 mailbox 當中將信件收到本地端的 MUA 上面供你瀏覽!同樣的,只要 MTA 與 MUA 同時支持 POP3 這個協議,那麼信件就可以自由的收受了!此外,目前也很流行使用 IMAP 這個協議來收受信件。在 pop3 的收信協議中,一般來說,當 client 端收完了主機端的信件之後,則該信件會主動的被主機端所刪除!不過, IMAP則可以避免這個問題! IMAP 具有讓使用者 ( client客戶端 ) 自行定義信件放置的目錄功能,以及是否要儲存下載的信件之後,原信件是否保留在主機上面的功能!目前我們常見的 Web 接口的電子郵件使用,大部分就是以 imap 來達成的!

所以我們知道了!通常一部提供收發信件的 MTA ( 不考慮 Web 接口的郵件主機 ) 至少需要兩個協議,分別是 SMTP 與 POP3 !而且,只要你的 MUA 與 MTA 同時均支持SMTP 與 POP3 ,那麼彼此就可以溝通囉!這也是爲什麼你使用 Outlook express 寄出的信,但是你的朋友可以使用 Netscape 收下來的原因!總之,就是『網絡協議』的溝通啦!
 


什麼是 Relay 與認證機制

圖一的寄信流程圖裏面的第三步驟 ( step 3 ) 中,我們知道, MTA 在分析收到的郵件之後,如果收件者不是本身主機的賬號,則會將該信件再傳送到下一個 MTA 上面,這個由MTA 幫忙轉信的功能就稱爲 Relay 啦。那麼在這個功能當中,您有沒有發現一件奇怪的事情啊!那就是:『是否任何人都可以使用我的 MTA 郵件主機服務器來傳送他的郵件呢?』這個問題涉及到 Mail Server 的設定技巧了!如果設定不良的話,例如早期的 Sendmail 版本中,他就沒有針對使用者來進行管制,也就是說,任何人都可以使用這樣的一部郵件主機來達到信件傳送的目的!這種主機我們稱爲『Open Relay』的電子郵件主機喔!這裏請仔細的思考一下,如果我的 MTA 對於寄信的人沒有一個限制的話,結果會如何呢?呵呵!沒有錯,結果就是任何人都可以使用你的 MTA 來發信了!那有什麼好可怕的?我們在前言的地方就已經稍微說過了,那個所謂的『廣告信、垃圾信件』的問題,而如果你的 MTA 沒有對寄信的人作限制的話,由於任何人都可以使用你的 MTA 來發信,你的 MTA 將會變的『很笨重!』什麼意思?那就是,你的 MTA 將會幫任何人寄信,如此一來,你的『網絡頻寬將會被廣告信件所用光!』結果將導致你的 MTA 變成『Open Relay 主機黑名單的一份子~』!!!
 
爲了避免這個問題,所以,目前所有新版的郵件主機服務器架設軟件 ( Mail server packages )預設的情況之下,都不會對外完全的開放 Relay 的功能的!預設通常僅『針對主機 ( localhost ) 開放 Relay 的功能』,不過,這樣的 MTA 是可以收受來自 Internet 上面的,註明收件者是我們 MTA 主機內部賬號的信件的,因此, MTA 在『收信』上面是沒有問題的!
 
但是關閉了 Relay 之後,雖然可以避免掉我們 MTA 主機被當成廣告信發送站,不過如此一來又造成了一些困擾!何解?因爲通常我們僅針對主機,或者一些規範的 IP 或者是網段等信任的主機來開放他們的 Relay 的功能,所以在這個設定的範圍內的 Client 端計算機可以自由的收發信件,至於沒有規範到的 IP 來源的寄信信件,將完全的擋掉。然而萬一您使用的是 ADSL 計時制的呢?又或者您是常常在外面出差的大老闆,則你的 IP 將『不會固定』,完蛋啦~怎麼辦?既不能完全開放 Relay ,又沒有固定 IP ,無解了嗎?呵呵!還好,有所謂的 郵件認證機制 來幫我們解決這個困境啦!
 
所謂的『郵件認證機制』就是在剛剛我們圖一的寄信流程圖中,在 MTA 當中加入需要檢查發信者的『賬號與密碼』比對的功能,當 MTA 接到來自 Client 端的傳信需求時,會檢查來自 Client 端的認證比對(賬號密碼),如果賬號與密碼比對正確,則開始接受信件並幫忙轉信,如果比對不正確則將該 MTA 並不會接受該封信件,直接在 Client 端顯示『不接受您的信件』之類的訊息喔!目前有相當多種的郵件認證機制,這裏我們偏向於介紹目前廣爲使用的SMTP 郵件認證這個機制。
 
所謂的 SMTP 郵件認證機制,顧名思義,就是在 smtp 這個協定上面動手腳的一個機制囉!亦即是在寄信的時候,(由 MUA 到 MTA 那個 step 1 的步驟中 ),我們的MTA 主機『一定要求檢驗 MUA 發信者的賬號與密碼!』這樣的功能!果真能做到這一點的話,那麼你的 MTA 就可以在經過認證之後,提供認證者的 Relay 功能,而不需要針對某些信任網域或 IP 來分別設定開放 Relay 的功能啦!因爲經由『認證』的機制,你的 MTA 會去分析寄信者的相關信息,通過後纔會接受信件並幫他們寄信,否則就不接受信件!呵呵!沒錯!就是這樣!透過這樣的機制,您將不需要規範 Relay 的 IP 或網段,直接交給SMTP 郵件認證來幫你管理你寄件者的 Relay 功能,從此以後,你的 Clients 就不會常常向你抱怨說 MTA 不穩定囉!
 
我們底下將介紹使用 cyrus-sasl 這種密碼驗證的認證機制囉!好了!底下我們將要介紹一下目前郵件服務器佔有率上面應該依然是第一的 sendmail 這個 mail server 的架設!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章