文章目錄
postfix(郵件服務器)
郵件的整個收發流程
郵件相關協議
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議, 工作在TCP的25端口。它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。跟名字一樣smtp非常簡單,無法做到認證,郵件存放等功能。
POP3(Post Office Protocol)郵局協議第3版,工作在TCP的110端口。本協議主要用於支持使用客戶端遠程管理在服務器上的電子郵件。POP 協議支持“離線”郵件處理。其具體過程是:郵件發送到服務器上,電子郵件客戶端調用郵件客戶機程序以連接服務器,並下載所有未閱讀的電子郵件。這種離線訪問模式是一種存儲轉發服務,將郵件從郵件服務器端送到個人終端機器上,一般是PC機或 MAC。一旦郵件發送到 PC 機或MAC上,郵件服務器上的郵件將會被刪除。但目前的POP3郵件服務器大都可以“只下載郵件,服務器端並不刪除”,也就是改進的POP3協議。
IMAP4(Internet Mail Access Protocol)因特網郵件訪問協議第4版,工作在TCP的143端口。IMAP4協議與POP3協議一樣也是規定個人計算機如何訪問網上的郵件的服務器進行收發郵件的協議,但是IMAP4協議同POP3協議相比更高級。IMAP4支持協議客戶機在線或者離開訪問並閱讀服務器上的郵件,還能交互式的操作服務器上的郵件。IMAP4協議更人性化的地方是不需要像POP3協議那樣把郵件下載到本地,用戶可以通過客戶端直接對服務器上的郵件進行操作(這裏的操作是指:在線閱讀郵件 在線查看郵件主題 大小 發件地址等信息)。用戶還可以在服務器上維護自己郵件目錄(維護是指移動)新建 刪除重命名共享 抓取文本 等操作)。IMAP4協議彌補了POP3協議的很多缺陷。
郵件相關名詞
一般情況下,我們把電子郵件程序分解成傳輸代理,投遞代理和用戶代理。用戶代理用來接受用戶的指令,將用戶的信件傳送至信件傳輸代理.而投遞代理則從信件傳輸代理取得信件傳送至最終用戶的郵箱.當用戶試圖發送一封電子郵件的時候,他並不能直接將信件發送到對方的機器上,用戶代理必須試圖去尋找一個信件傳輸代理,把郵件提交給它。信件傳輸代理得到了郵件後,首先將它保存在自身的緩衝隊列中,然後,根據郵件的目標地址,信件傳輸代理程序將找到應該對這個目標地址負責的郵件傳輸代理服務器, 並且通過網絡將郵件傳送給它。對方的服務器接收到郵件之後,將其緩衝存儲在本地,直到電子郵件的接收者查看自己的電子信箱。
1)MTA(Mail Transfer Agent)
郵件傳輸代理工具,通過SMTP協議所指定的服務器,就可以把E-mail寄到收信人的服務器上了,整個過程只要幾分鐘。SMTP服務器則是遵循SMTP協議的發送郵件服務器,用來發送或中轉發出的電子郵件。常用的MTA有:
SendMail:郵件的鼻祖。
Qmail:一個數學家開發,作爲Linux下面主流的郵件系統內核,大量著名的商業郵件系統都是在Qmail內核下開發,比如Hotmail。
Postfix:IBM安全專家開發,模塊化設計,並且比sendmail兼容效率更高。
Exim:是基於GPL協議的開放源代碼軟件,由英國劍橋大學的Philip Hazel開發。
Exchange:微軟公司的一套電子郵件服務組件,是個消息與協作系統。
2)MDA(Mail Delivery Agent)
郵件投遞代理,投遞代理則從信件傳輸代理取得信件傳送至最終用戶的郵箱。常用的MDA有:
ProcMail:Postfix默認的郵件投遞工具。
MailDrop:相對比較專業的投遞代理工具。
3)MRA(Mail Retrieval Agent)
郵件取回代理,使用POP3或IMAP4協議工作。一般用於從用戶信箱取回郵件到郵件用戶代理客戶端。常用的MRA有:
Dovecot:是一個開源的支持IMAP和POP3協議的收郵件服務器(自帶SASL功能)。
4)MUA(Mail User Agent)
郵件用戶代理工具。常用的MUA有:
OE:Windows舊版本自帶的工具。
Outlook:Office套件帶的工具。
FoxMail:騰訊公司的郵件客戶端工具。
Thunderbird:雷鳥是Linux下的客戶端工具。
Mutt:Linux下的字符界面客戶端工具。
5)WebMail
基於Web的電子郵件收發系統,扮演郵件用戶代理角色,一般而言,WebMail系統提供郵件收發、用戶在線服務和系統服務管理等功能。WebMail的界面直觀、友好,不需要藉助客戶端,免除了用戶對E-mail客戶軟件(如:Foxmail、Outlook等)進行配置時的麻煩,只要能上網就能使用WebMail,方便用戶對郵件進行接收和發送。WebMail使得E-mail在Internet上的應用廣泛。常用的Webmail有:
Openwebmail:臺灣開發的。
Squirrelmail:Centos系統自帶。
Extmail,Extman:國內開發的也被稱爲EMOS系統。
6)Mail Relay
郵件中繼,先要明白一個概念,一封郵件只要不是發送給本域內用戶的,比如從當前域發送到另一個域,或從當前域發送到另一個域然後轉到另外一個域的,這就屬於中繼。但是一般郵件服務器都會允許本地或本域內的用戶進行中繼。不然就只能在本域內發送郵件而不能給外部郵箱發送郵件。Postfix默認只能基於IP地址做中繼認證。
7)SASL(simple authentication secure layer)
簡單認證安全層,是一種用來擴充C/S模式驗證能力的機制。在Postfix可以利用SASL來判斷用戶是否有權使用轉發服務,或是辨認誰在使用你的服務器。
常用的Sasl有:
cyrus-sasl:Redhat系列自帶的SASL認證框架。
dovecot-sasl:dovecot組件帶的SASL認證框架。
courier-authlib:這是一個帶有MTA,MDA以及SASL認證的軟件,但是一般只是用它的SASL功能。
Postfix介紹
Postfix是Wietse Venema在IBM的GPL協議之下開發的MTA(郵件傳輸代理)軟件。是爲了改良sendmail郵件服務器而產生的。其特點:
- postfix是免費的:postfix想要作用的範圍是廣大的Internet用戶,試圖影響大多數的Internet上的電子郵件系統,因此它是免費的。
- 更快:postfix在性能上大約比sendmail快三倍。一部運行postfix的臺式PC每天可以收發上百萬封郵件。
- 兼容性好:postfix是sendmail兼容的,從而使sendmail用戶可以很方便地遷移到postfix。Postfix支持/var[/spool]/mail、/etc/aliases、 NIS、和 ~/.forward 文件。
- 更健壯:postfix被設計成在重負荷之下仍然可以正常工作。當系統運行超出了可用的內存或磁盤空間時,postfix會自動減少運行進程的數目。當處理的郵件數目增長時,postfix運行的進程不會跟着增加。
- 更靈活:postfix是由超過一打的小程序組成的,每個程序完成特定的功能。你可以通過配置文件設置每個程序的運行參數。
6.安全性:postfix具有多層防禦結構,可以有效地抵禦惡意入侵者。如大多數的postfix程序可以運行在較低的權限之下,不可以通過網絡訪問安全性相關的本地投遞程序等等。
Postfix服務器工作原理
郵件服務器工作在兩種情況下:一種是相同域內轉發;二是不同域內轉發。所以MTA(postfix)內部一般都會有服務端(smtpd)、客戶端(smtp)和MDA。smtpd郵件服務器非常簡單,只負責轉發郵件別的什麼功能也沒有並且發送方不管是什麼地址都可以從smtpd服務器轉發到目標地址。
根據上圖分別闡述一下郵件服務器兩種工作機制:
相同域內轉發:用戶A通過工具連接到SMTPD服務端,然後發送一份郵件,而目標收件人是B用戶。當SMPTD收到郵件後判斷髮現是同域內的用戶,就會直接啓動MDA進程把郵件投進用戶郵箱中,當用戶通過MUA工具(如mail命令)就可以直接收到郵件。
不同域內轉發:用戶A通過工具連接到SMTPD服務端,然後發送一份郵件,而目標收件人是C用戶。當SMPTD收到郵件後判斷髮現是不同域內用戶,就會啓動SMTP客戶端來轉發此郵件。SMTP收到請求後就會解析對方MX記錄,然後連接對方SMTPD服務器並把郵件發送過去。當對方SMTPD發現此郵件就是本域內的郵件後也會調用MDA進程把郵件投遞進用戶郵箱中,當用戶通過MUA工具(如mail命令)就可以直接收到郵件。
配置postfix
配置過程中,建議開啓smtp的認證功能(必須輸入用戶名和密碼),否則任意一封郵件都會轉發到你的郵箱,容易被人寫一個腳本一直往你郵箱發送垃圾內容,導致你郵箱無法正常使用。
postfix一般都是已經裝好並啓動起來的,所以只需要修改main.cf即可,查看是否啓動:systemctl is-active postfix 爲active即是啓動的:
postfix可以查看所有的選項有800多個,但是main.cf裏只有很少的幾個條目,格式爲:
key1=value1,value11(多個參數用,隔開)
key2=value2
key3=key1,value3(也可以調用參數key*)
注:每行的內容都要頂頭寫,不能有空格,負責會認爲是上一行的延續。
postfix的配置文件結構
postfix的配置文件位於/etc/postfix下,安裝完postfix以後,我們可以通過ls命令查看postfix的配置文件:
[root@mail postfix]# ls
install.cf main.cf master.cf postfix-script
這四個文件就是postfix最基本的配置文件,它們的區別在於:
mail.cf:是postfix主要的配置文件。
Install.cf:包含安裝過程中安裝程序產生的postfix初始化設置。
master.cf:是postfix的master進程的配置文件,該文件中的每一行都是用來配置postfix的組件進程的運行方式。
postfix-script:包裝了一些postfix命令,以便我們在linux環境中安全地執行這些postfix命令。
postfix的基本配置
postfix大約有100個配置參數,這些參數都可以通過main.cf 指定。配置的格式是這樣的,用等號連接參數和參數的值。如:
myhostname = mail.mydomain.com
等號的左邊是參數的名稱,等號的右邊是參數的值; 當然,我們也可以在參數的前面加上$來引用該參數,如:
myorigin = $myhostname
雖然postfix有100個左右的參數,但是postfix爲大多數的參數都設置了缺省值,所以在讓postfix正常爲你服務之前,你
只需要配置爲數不多的幾個參數。下面我們一起來看一看這些基本的postfix參數。需要注意的是,一旦你更改了main.cf文件的內容,則必須運行
postfix reload命令使其生效。
1. myorigin
myorigin參數指明發件人所在的域名。如果你的用戶的郵件地址爲
[email protected]
,則該參數指定@後面的域名。缺省地, postfix使用本地主機名作爲myorigin,但是建議你最好使用你的域名,因爲這樣更具有可讀性。比如:安裝postfix的主機爲 mail.domain.com則我們可以這樣指定myorigin:
myorigin = domain.com
當然我們也可以引用其他參數,如:
myorigin = $mydomain
2. mydestination
mydestination參數指定postfix接收郵件時收件人的域名,換句話說,也就是你的postfix系統要接收什麼樣的郵件。比如:你的用戶的郵件地址爲
[email protected]
, 也就是你的域爲domain.com, 則你就需要接收所有收件人爲
[email protected]
的郵件。與myorigin一樣,缺省地,postfix使用本地主機名作爲 mydestination。如:
mydestination = mynetworks的郵件。
來自客戶端主機名符合relay_domains及其子域的郵件。
缺省地,postfix接受符合以下條件的郵件:
目的地爲mydestination的郵件。
目的地爲mynetworks參數定義的範圍則接受該客戶端的連接請求,並轉發該郵件。
check_client_access
maptype:mapname:根據客戶端的主機名、父域名、ip地址或屬於的網絡搜索access數據庫。如果搜索的結果爲REJECT 或者
‘[45]XX text’ 則拒絕該客戶端的連接請求;如果搜索的結果爲OK、RELAY
或數字則接受該客戶端的連接請求,並轉發該郵件。。可以用access_map_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲
554)。
reject_maps_rbl:如果客戶端的網絡地址符合$maps_rbl_domains參數的值則拒絕該客戶端的連接請求。可以用maps_rbl_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲554)。
示例:
smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client
該參數的缺省值爲:
smtpd_client_restrictions =
也即接收來自任何客戶端的SMTP連接。
是否請求HELO命令
可以通過smtpd_helo_required參數指定客戶端在SMTP會話的開始是否發送一個HELO命令。你可以指定該參數的值爲yes或no。缺省值爲:
smtpd_helo_required = no
HELO主機名限制
可以通過smtpd_helo_restrictions參數指定客戶端在執行HELO命令時發送給postfix的主機名。缺省地,
postfix
接收客戶端發送的任意形式的主機名。可以指定一個或多個參數值,中間用逗號隔開。限制規則是按照查詢的順序進行的,第一條符合條件的規則被執行。可用的規
則有:
reject_invalid_hostname:如果HELO命令所帶的主機名參數不符合語法規範則拒絕客戶機的連接請求。可以用invalid_hostname_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲501)。
permit_naked_ip_address:RFC要求客戶端的HELO命令包含的ip地址放在方括號內,你可以用permit_naked_ip_address參數取消該限制。因爲有的mail客戶端不遵守該RFC的規定。
reject_unknown_hostname:如果客戶端執行HELO命令時的主機名在DNS中沒有相應的A 或 MX
記錄則拒絕該客戶端的連接請求。可以用invalid_hostname_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲450)。
reject_non_fqdn_hostname:如果客戶端執行HELO命令時的主機名不是RFC規定的完整的域名則拒絕客戶端的連接請求。可以用invalid_hostname_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲504)。
check_helo_access
maptype:mapname:根據客戶端HELO的主機名、父域名搜索access數據庫。如果搜索的結果爲REJECT 或者 ‘[45]XX
text’ 則拒絕該客戶端的連接請求;如果搜索的結果爲OK、RELAY
或數字則接受該客戶端的連接請求。可以用access_map_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲554)。
示例:
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname
RFC 821信頭限制
RFC 821對郵件的信頭做了嚴格的規定,但是廣泛使用的sendmail並不支
持該規定,所以對於該參數我們只能說不,即:
strict_rfc821_envelopes = no
通過發件人地址進行限制
可以用smtpd_sender_restrictions參數通過發件人在執行MAIL FROM命令時提供的地址進行限制。可以指定一個或多個參數值,中間用逗號隔開。限制規則是按照查詢的順序進行的,第一條符合條件的規則被執行。可用的規則有:
reject_unknown_sender_domain:如果MAIL FROM命令提供的主機名在DNS中沒有相應的A 或 MX
記錄則拒絕該客戶端的連接請求。可以用unknown_address_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲450)。
check_sender_access maptype:mapname:根據MAIL
FROM命令提供的主機名、父域搜索access數據庫。如果搜索的結果爲REJECT 或者 ‘[45]XX text’
則拒絕該客戶端的連接請求;如果搜索的結果爲OK、RELAY
或數字則接受該客戶端的連接請求。可以用access_map_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲554)。可以通過該參數
過濾來自某些不受歡迎的發件人的郵件。
reject_non_fqdn_sender:如果MAIL FROM命令提供的主機名不是RFC規定的完整的域名則拒絕客戶端的連接請求。可以用non_fqdn_reject_code 參數指定返回給客戶機的錯誤代碼(缺省爲504)。
缺省地,postfix接受來自任何發件人的郵件。
示例:
smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain
通過收件人地址進行過濾
可以用smtpd_recipient_restrictions參數通過發件人在執行RCPT TO命令時提供的地址進行限制。缺省值爲:
smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains
可以指定一個或多個參數值,中間用逗號隔開。限制規則是按照查詢的順序進行的,第一條符合條件的規則被執行。可用的規則有:
check_relay_domains:如果符合以下的條件,則接受SMTP連接請求,否則拒絕該連接,可以用relay_domains_reject_code 參數指定返回給客戶機的錯誤代碼(缺省爲504)。
客戶端主機名符合virtual_maps
permit_auth_destination:不管客戶端的主機名,只要符合以下的條件,就
接受SMTP連接請求:
解析後的目標地址符合virtual_maps
reject_unauth_destination:不管客戶端的主機名,只要符合以下的條件,就拒絕該客戶端SMTP連接請求:
解析後的目標地址符合virtual_maps
check_recipient_access:根據解析後的目標地址、父域搜索access數據庫。如果搜索的結果爲REJECT 或者
‘[45]XX text’ 則拒絕該客戶端的連接請求;如果搜索的結果爲OK、RELAY
或數字則接受該客戶端的連接請求。可以用access_map_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲554)。
reject_unknown_recipient_domain:如果收件人的郵件地址在DNS中沒有相應的A 或 MX 記錄則拒絕該客戶端的連接請求。可以用unknown_address_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲450)。
reject_non_fqdn_recipient:如果發件人在執行RCPT TO命令時提供的地址
不是完整的域名則拒絕其SMTP連接請求。可以用The non_fqdn_reject_code參數指定返回給客戶機的錯誤代碼(缺省爲504)。
posftfix的性能控制
之所以對postfix的性能進行控制,是爲了在遇到郵件風暴時保證postfix可以正常運行。通常,我們可以通過對下列postfix
參數的配置來調節postfix的性能,這些參數都是通過mail.cf配置文件進行配置的,修改以後不要忘了運行postfix
reload命令來使配置生效。
1. 進程數限制
可以通過default_process_limit 參數來控制postfix系統同時可以運行的最大進程數目。缺省值是50個。
2. 對同一目標主機的併發連接限制
當向同一目標主機發出SMTP連接時,postfix初始化發出兩個SMTP連接,如果投遞成功則增加併發的SMTP連接數目,遇到擁塞時又減少併發連接的數目。postfix中通過以下的參數對同一目標主機的併發連接進行控制:
initial_destination_concurrency:控制對同一目標主機的初始化併發連接數目。缺省值爲2。
default_destination_concurrency_limit:控制初始化連接後對同一目標主機的最大併發連接數目。缺省值爲10。
local_destination_concurrency_limit:控制對同一本地收件人的最大同時投遞的郵件數目。缺省值爲2,因爲對本地同一收件人投遞郵件時投遞工作只能一個接一個的進行,所以設得在大也沒用。
3. 對同一封郵件的收件人數目限制
通過default_destination_recipient_limit參數來控制postfix的投遞代理(如
smtp進程)可以將同一封郵件發送給多少個收件人。缺省值爲50。也可以用明確指出該投遞代理的參數來覆蓋該缺省值。如用smtpd_recipient_limit來指定smtp投遞代理可以將同一封郵件發送給多少個收件人,該參數的缺省值爲1000。
4. 推遲投遞控制
通過defer_transports參數,我們可以推遲投遞該參數指定的郵件直到postfix明確的提出投遞要求。下面我們看一個例子:
有一個小型的局域網,用戶都將郵件發送給局域網內部的一臺postfix郵件服務器,然後通過在該服務器上撥號將郵件發送出去。這時我們可以這樣指定該參數的值:
defer_transports = smtp
該語句表示postfix推遲投遞所有的郵件直到執行sendmail -q命令,這樣我們就可以在ppp的腳本中加上sendmail -q,以便在撥號成功後讓postfix開始投遞郵件。
使用圖形客戶端收發郵件
因爲接受協議是pop3/imap所以先安裝dovecot服務:yum install -y dovecot
安裝完畢後查看端口:
pop3中:未加密是110,加密後是995:
imap中:未加密的是143,加密後的是993:
把端口開通:firewall-cmd --add-port=143/tcp , firewall-cmd --add-port=110/tcp , firewall-cmd --add-port=143/tcp --permanent , firewall-cmd --add-port=110/tcp --permanent , firewall-cmd --list-all查看
因爲文件是存放在/etc/dovecot/中,查看支持協議:vi /etc/dovecot/dovecot.conf,找到protocols=。。。把註釋去掉:
然後爲了讓郵件能正常收發,需要對配置文件做一些必要設置:cd /etc/dovecot/conf.d:
vi 10-auth.conf,找到disable_plaintext_auth=yes,是否允許明文傳輸,把該行註釋取消並把yes改爲no:
vi 10-mail.conf,找到如下圖,把註釋取消,定義收到郵件後的存放路徑:
vi 10-ssl.conf,找到ssl=required,登錄是否ssl加密,把required改爲no:
啓動服務並檢查是否正常啓動:systemctl start dovecot , systemctl is-active dovecot,啓動正常後設置爲開機自啓:systemctl enable dovecot
windows下載foxmail工具或者類似工具亦可:(配置foxmail之前,需要先搭載郵箱服務器)
打開foxmail添加用戶:需要注意的是,這兒填寫的pop服務器,windows必須能夠正常解析,如果不能正常解析,則無法正常使用
如果不方便在windows上更改解析,則把pop服務器直接設置爲服務器ip地址:
添加完畢以後郵箱即可正常使用:
如果想要通過瀏覽器的方式收發郵件的話,需要安裝webmail,工具大致有以下幾種:
openwebmail , horde ,zimbra…
如果想要更加深層次的理解郵箱:找一份電子書”postfix權威指南“ 即可。