郵件服務的理論知識
與電子郵件相關的協議有:pop3、imap4、smtp
其中最重要的是smtp
SMTP(simple Mail Transfer Protocol)是簡單郵件傳輸協議,因爲它簡單到郵件發出去後
只負責如何路由、如何選擇。當郵件到達目的地後如何到達用戶手中?它就不會參與了。所以
它只負責郵件傳輸相關的功能。smtp本身是基於tcp的協議,監聽tcp的25號端口
其實一封郵件從發出的那個用戶開始到最終到接受郵件的用戶手中,都經歷了哪些步驟?
跟哪些服務組件相關?
首先,我們來說下smtp服務與DNS的關係。電子郵件的地址通常是用戶名@一個域名,如[email protected]
在沒有pc機之前,所有主機都是MainFrame,叫大型機。所有的計算機用戶都是MainFrame上的用戶,在當時網絡誕生之後都一般是時時在線的就是不會關機,這時兩臺主機發郵件是很簡單的。
比如主機www.magedu.com上的用戶jerry向主機www.hehuan.com上的用戶tom發郵件的話,
其實非常簡單,jerry只需寫封郵件,發件人就是[email protected],收件人是[email protected]
當時就這麼簡單,username@FQDN。
pc機出現之後,用戶很可能就不是mainframe上的用戶了,可能是某個pc機上的用戶,
而這些pc機並不需要時時在線,假如說上面hehuan.com這個域中有一臺主機叫ns.hehuan.com,tom就是這臺主機上的用戶
發送方還是[email protected] 接收方就變成[email protected] ,而且如果jerry發郵件的給tom的時候
若tom不在線的話郵件是發不出去的,所以發送郵件的這臺主機會隔一段時間重試着發一次,在嘗試一定的次數之後
若還是發不出去,他就會認爲這臺主機不存在。於是這封郵件的就會被保留,因爲這臺主機壓根不存在,所以無法發送到tom。
所以電子郵件發展到後來,就不是讓每臺主機都有接受郵件的能力,而是專門提供一臺主機爲一個域內的所有的pc機或服務器
統一接受郵件。所以在hehuan.com這個域內專門有臺主機收發郵件。而且我們的郵件地址不再寫成[email protected]格式,而是寫成
[email protected]這樣的格式。然而域顯然是不能收發郵件的,我們必須找到這個域內誰是用來收發郵件的、誰是用來郵件處理的。
因此我們必須有一種機制用來保證讓對方的服務器知道這個域內到底是哪臺服務器負責郵件處理的
那如何來保證呢?這就要用到DNS了。DNS是如何實現標識一個域內的郵件服務器的?是靠MX記錄來實現的,即郵件交換器。
在DNS上一個域內的郵件交換器可以有多個,當有多個郵件交換器時如何標識誰是主的誰是輔的?比如說hehuan.com這個域內有兩個郵件交換器,mail和mail1,默認情況下,
當發送方解析對方MX記錄的時候得到的是兩臺主機,這時就不知道到底發送給那一臺。那麼如何判定發給那一臺?MX記錄是有優先級的,
優先級是0-99,數值越小優先級越高,反之越低。如果mail的優先級是5,mail1的優先級是10,那就發送給mail,當mail忙不過來或不在線的時候
發送方纔聯繫mail1,發送到這個輔助郵件交換器上,但並不是這個交換器接受郵件後就可以保存郵件了
這個輔助郵件交換器會等到主郵件交換器空閒的時候把代替它接受的郵件再轉發到主郵件服務器,所以輔助郵件交換器僅僅是在主的忙不過來的時候臨時的把郵件接受過來。
如果我們要配置一個互聯網上的服務器,那麼它和DNS是緊密集成起來的。
如果我們發送的是[email protected]這種格式,那麼這臺主機要有A記錄
如果我們發送的是[email protected]這種格式,要求對方的DNS不光有A記錄還要有MX記錄
所以要是後面這種格式,一次郵件發送到目標域中要進行幾次DNS查詢?兩次,一次查A記錄,一次是MX記錄
以上說明了:1、現在的郵件發送@後的是域名而不是主機名;2、郵件發送過程中與DNS服務的關係
郵件的發送的過程:整個傳送是明文的,並且是純ASCII碼,而且早期的互聯網絡
是不可靠的,因此郵件傳遞過程當中通常每臺服務器都是open relay 即開放式中繼。
stmp服務工作在對方tcp的25號端口,而工作在這個端口的服務叫stmpd,d是daemon即守護進程
當用mail命令接受郵件後,會在每個用戶的家目錄下生成一個文件mbox,專門放用戶自己看過的郵件,
但是smtpd進程沒有權限隨便進入別人的家目錄,當stmpd接收到郵件後,不是放在用戶的家目錄,而是放到爲每個用戶準備好的郵筒中去了
是誰的放到誰的裏邊。
沒有看過的郵件在/var/spool/mail文件中,只要用戶收到過郵件都會自動的生成一個用戶對應的文件,作爲用戶自身所未看文件的存放位置
# ls -l /var/spool/mail 看下屬性
將用戶的郵件放到用戶的郵箱當中的不是stmpd服務器本身的功能,還要藉助於
其他程序,這個程序我們通常叫它爲郵件投遞的程序,叫MDA
MUA:讓用戶能夠打開寫郵件,並且在寫完之後自動的向外發出的程序就是MUA全稱是郵件用戶代理。
MTP:郵件傳輸代理,接收到的郵件,如果目標域不是自己所負責的域,還可以再次轉發的,叫MTA.
當郵件發過來後發現是自己所負責的域,郵件接收下來之後怎樣放到用戶的郵筒
裏去,這就要用到MDA ,投遞代理。
smtp 沒有認證功能,可以藉助於SASL
SASL (Simple Authentication Security Layer)簡單認證安全層,庫,用於爲其它沒有
認證能力的服務提供認證功能。
實現SASL的功能的是軟件cyrus-sasl
怎樣認證?默認情況下把沒有認證功能smtp服務想象成一個礦業荒郊的一座房子,你就住在這個房子,任何人想進這個房子都易如反掌,爲了能夠提供一種防護機制,在
房子的外圍加上院牆,當別人向***這臺主機時,得先通過這個院牆才能到達服務器
可以把sasl看成是smtp外的一道防護機制,但是這個防護機制用不用要通過smtp服務器進行配置
用就配置,不用就默認是沒有這個功能。有了sasl之後用戶要想通過它發郵件,在用戶通過smtp發郵件的時候
會先要求用戶提供一個帳號並且把用戶帳號交給sasl進行驗證,如果用戶有個合法的帳號,
就能夠向外發送郵件,若沒有就不能發送。所以sasl爲smtp服務器提供了用戶認證能力。
但是sasl只是認證框架,只是有了認證能力,本身不做認證
要想認證還要藉助於額外的認證機制,常用的認證有:plain,login,mysql,ldap等,每個認證機制都需要一個認證模塊。
使用sasl框架的時候還要告訴它用的哪種機制認證的,哪種機制就決定了到哪個庫中去找用戶帳號的,
我們都知道,如果基於mysql認證,用戶的帳號密碼就放在mysql數據庫的表中
如果是ldap就放在ldap中;如果是plain或login,帳號和密碼就放在/etc/passwd 和 /etc/shadow中
這就是sasl實現了發信認證,避免所有用戶都能利用服務器向外發送郵件來避免垃圾郵件。
到現在爲止,看似完美了,考慮一下如果我們發送的是一個商業文件呢,smtp
能加密文件嗎.就算smtp能加密發送到服務器上了,那用戶接受郵件是不是通過pop3協議
imap協議來收郵件,這兩種協議是明文的。
pop3監聽在tcp的110端口
imap4監聽在tcp143端口
由於smtp是多段式的,它的加密過程未必是完整的,因爲發送方或接收方有一方不支持ssl
那發送的郵件就是明文的。
stmp基於ssl加密,固然能夠實現smtp協議叫smtps,但是安全性並不能得到解決
而接受郵件時就是在客戶端和服務器端建立聯繫,這時pop3和imap4就能夠完整的基於ssl
pop3基於ssl的協議叫pop3s 監聽在tcp的995端口
imap4基於ssl的協議叫imaps 監聽在993端口上
這兩個是不同的服務,只不過最終目的一樣,實現過程不同。
smtp通常在實現郵件傳輸的時候不用smtps協議,而使用S/MIME或者是GPG機制
MIME是多用途互聯網郵件擴展
S/MIME是安全的多用途互聯網郵件擴展
GPG 是PGP的實現
如何反垃圾郵件、病毒郵件?
開源界中反垃圾郵件的軟件有:spamassassin 垃圾郵件的過濾器
反垃圾郵件本身並不能反垃圾郵件,它是靠垃圾郵件的特徵庫
反病毒的開源軟件:clamav 是殺毒軟件,並不殺毒,只是判斷是否是病毒
smtp本身並不能調用病毒文件反病毒,也不能調用病毒文件過濾器反病毒
也不能調用反垃圾郵件來反垃圾郵件,需要藉助於額外的機制來實現
這個機制是caller
caller能實現郵件發過來後先用反垃圾郵件過濾一遍再用反病毒文件過濾一遍
如果沒問題了再向外發。
caller著名的有:mailscanner、mimedefang、amavisd-new
這幾個都可以讓smtp服務器去掉用clamav或spamassassin來實現反垃圾和反病毒的
比較常用的是amavisd-new
還可以在根上防護:這是客戶端黑名單
還可以根據對方的郵件服務器來發郵件,郵件服務器接受來自另外一個郵件服務器發
送來的郵件,最終接收方確實是這個郵件服務器所負責的域,我們應該無條件接收,但是我們發現這個用戶
經常發送垃圾郵件,可以拒收這個郵件,即把他列入服務器的黑名單,但是把一個客戶列入黑名單,只能在一臺服務器
上反垃圾郵件。目前來講還有一種基於DNS來做的叫RBL,也就是
當一個用戶向外發送郵件的時候,發往哪個域就需要解析這個域,爲了能夠
防範垃圾郵件,會反解對方的ip,反解出來的主機名是否和正解的A記錄匹配,若不匹配就拒絕接受
所以在互聯網上做郵件服務器的時候得有反解,若沒有反解就會拒決接收
這種機制就是防範adsl用戶創建郵件服務器向外發送郵件的,adsl用戶撥號獲得一個地址但事實上是沒有域名的。
一般來講就算有域名也無法反解,在互聯網上無法通過DNS反解,這是防範垃圾郵件的一種機制。
所以互聯網上郵件流量比較大,因此在某些意義上反解流量,比正解流量還要多就是因爲這個原因造成的。
每一封郵件接收方和發送方都要反解的,這只是一種機制;還有一種機制是
時時黑名單,直接在服務器上配置拒絕某個特定域內的郵件,或者是互聯網上有個專門
的組織,把那些經常發送垃圾郵件的服務器所在的域列到黑名單中,而我們接收郵件的時候
先去反解對方的主機名,這樣可以獲得對方的域名或主機名,然後拿着這個域名或主機名與列表比對,看看
這個域有沒有在這個黑名單列表中,如果有就拒絕接收,沒有的話就放行。
什麼叫時時黑名單?即列表會時時更新的,它會通過一些程序始終監控掃描着互聯網上哪些服務器會經常
往外發送垃圾郵件,一旦發現會把它放進黑名單列表,但不是永久的放在裏邊的,過一定的時間還會把過期的移除掉。
不會一直在列表中放着。
不過一般互聯網上的黑名單列表是收費的。
總結:
爲了反垃圾郵件我們有以下機制:
關閉開放式中繼、基於客戶端認證、用戶認證、使用專門的軟件、使用黑名單
爲了能讓用戶收發郵件,我們必須要求用戶在這個系統上有個帳號,如果這個帳號是
系統帳號的話,是不是就能登錄系統了,這樣是很不安全的。爲了避免這種情況
我們可以使用虛擬賬號。虛擬賬號的機制,密碼和帳號放在mysql和ldap中。
MUA軟件有:mutt、windows上的OE、Foxmail、Thunderbird evalution
MTA 軟件有提供smtpd服務的,非商業的: sendmail 、qmail、postfix、exim;Exchange,Lotus Notes Domono
postfix比sendmail安全性要高,穩定性要好,維護性要簡單方便,而且比sendmail有更高的效率,所以postfix取代了sendmail
Exchange依賴於Windows的AD所以只能用在Windows上
MDA:procmail郵件投遞代理、maildrop(開源)
MRA:cyrus-imap、 courier-imap、dovecot
SASL:cyrus-sasl
cyrus-sasl 默認情況下是不支持mysql和ldap的認證,要想基於他們的認證可以藉助於courier-authlib,來實現虛擬用戶的認證。