解決Postfix,Dovecot和MySQL的問題
本指南是Postfix,Dovecot和MySQL安裝指南的配套檔案。由於設定郵件伺服器非常棘手,因此我們建立了這套指南來幫助您解決可能遇到的任何問題。到本指南的末尾時,您將瞭解如何除錯Postfix,Dovecot和MySQL郵件伺服器的問題。
第一部分,故障排除檢查表,採用自上而下的故障排除方法來幫助您查詢郵件伺服器的特定錯誤。第二部分,逐步配置,使用自下而上的方法來向您展示基本郵件伺服器是如何執行的,然後逐步新增更多功能。
故障排除核對表
正確診斷問題是解決問題的第一步。乍一看,許多郵件伺服器錯誤看起來很普遍。通常問題的第一個跡象是您嘗試建立測試郵件帳戶但卻無法連線。本節是查詢郵件伺服器諸多錯誤的速成課程。我們建議按順序閱讀以下部分,因為故障排除技術是按從普遍到特殊排列的。
Postfix和Dovecot正在執行嗎?
有時您的郵件伺服器無法正常執行,因為所需的服務未執行。對於已執行很長時間的郵件伺服器,資源過度使用是導致服務停止的最可能原因。檢查您的資源使用以排除該問題並沒有什麼壞處。但是,當您剛剛設定新的郵件伺服器時,更有可能的是服務啟動問題是由配置錯誤引起的。一些配置錯誤 - 特別是語法錯誤 - 非常嚴重,足以阻止服務啟動。
要檢查Postfix和Dovecot是否正在執行並查詢啟動錯誤,請按照下列步驟操作:
- 執行此命令以檢查Postfix是否正在執行:
service postfix status
您應該看到以下輸出:
* postfix is running
- 接下來,執行此命令以檢查Dovecot是否正在執行:
service dovecot status
您應該看到類似於以下內容的輸出:
dovecot start/running, process 2241
- 檢查結果。如果您沒有看到輸出或輸出
stop/waiting
或not running
,則表示該服務未執行。下一步是嘗試重新啟動服務。 - 嘗試重新啟動服務。即使Postfix和Dovecot當前正在執行,重新啟動他們也是一個很好的故障排除手段,因為這樣你就可以檢查啟動訊息,這可以為你排除故障提供線索。輸入以下命令以重新啟動Postfix:
service postfix restart
您應該看到以下訊息:
* Stopping Postfix Mail Transport Agent postfix [ OK ] * Starting Postfix Mail Transport Agent postfix [ OK ]
- 執行以下命令重新啟動Dovecot:
service dovecot restart
您應該看到以下訊息:
dovecot stop/waiting dovecot start/running, process 31171
- 檢查結果。如果您收到錯誤,或者Dovecot的重新啟動訊息未包含新程序ID,則服務啟動將會被阻止。
- 如果您在重新啟動嘗試時收到特定錯誤,請上網搜尋相關解決方法。
- 檢查應用程式的啟動日誌以檢視更詳細的訊息。Postfix的停止和啟動訊息將被記錄
/var/log/mail.log
(及其所有其他訊息)。輸入以下命令以檢視日誌中的最新行:
tail /var/log/mail.log
在正常重啟時,您應該看到以下內容:
/var/log/mail.log May 22 15:41:59 godel postfix/master[19624]: terminating on signal 15 May 22 15:41:59 godel postfix/master[20232]: daemon started -- version 2.9.6, configuration /etc/postfix
- Dovecot的預設啟動日誌也在
/var/log/mail.log
。在正常重啟時,您應該看到以下內容:
/var/log/mail.log May 22 17:46:54 master: Warning: Killed with signal 15 (by pid=1 uid=0 code=kill) May 22 17:48:09 master: Info: Dovecot v2.0.19 starting up (core dumps disabled)
注意 如果您移動了Dovecot日誌,則會/var/log/dovecot.log改為使用正常的Dovecot啟動訊息。如果找不到Dovecot日誌,請使用以下命令找到它們: doveadm log find
- 如果您沒有看到這些正常的啟動訊息,請檢查錯誤。線上搜尋錯誤資訊。
- 如果在Dovecot啟動期間出現問題,您還應該檢查/var/log/upstart/dovecot.log。在正常啟動時,不會將任何內容記錄到此檔案中。但是,如果存在啟動問題,則會在此日誌中新增一個條目,這可能非常有用。要檢視此檔案,請執行以下命令:
tail /var/log/upstart/dovecot.log
這是一個示例,其中/etc/dovecot/conf.d/10-master.conf
已識別檔案中的語法錯誤:
/var/log/upstart/dovecot.log doveconf: Fatal: Error in configuration file /etc/dovecot/conf.d/10-master.conf line 36: Unexpected '}'
- 如果您發現語法錯誤,請開啟有問題的檔案並檢視提到的行(上例中的第36行)。在Dovecot設定過程中發生語法錯誤實際上相當普遍,因為有太多不同的檔案和許多巢狀括號。
- 使用Notepad ++或其他一些可以輕鬆匹配括號的程式來幫助您修復錯誤。或者,您可以恢復相應的預設配置檔案(如果您遵循主要設定指南,則使用.orig命名)。
檢查日誌
如果正在執行Postfix,Dovecot和MySQL,則下一個故障排除步驟是檢查郵件日誌。預設情況下,將記錄所有傳入和傳出連線以及任何關聯的錯誤/var/log/mail.log
。檢視日誌檔案最有用的方法之一是使用該tail
命令,該命令與-f
標誌結合使用時,會顯示日誌的最新部分,因為它已更新。
- 通過輸入以下命令開始跟蹤日誌:
tail -f /var/log/mail.log
- 給自己傳送測試訊息或建立與郵件伺服器的連線。
- 使用相關資訊檢視日誌。
- 要停止tail,請按 CTRL-C。
如果在日誌中看到錯誤或警告,請複製它。線上搜尋確切的錯誤(沒有特定於您的伺服器的詳細資訊),您可能會找到解決方案或其他疑難解答幫助。
啟用詳細日誌
預設郵件日誌可能不包含您需要的所有資訊。在這種情況下,下一步是為Postfix和Dovecot啟用詳細日誌記錄,並將Postfix和Dovecot日誌分成兩個單獨的檔案,更容易排序。Postfix日誌將記錄中繼到外部伺服器或從外部伺服器中繼的訊息,Dovecot日誌將記錄授權嘗試。
Dovecot
按照以下說明啟用Dovecot的詳細日誌記錄並將日誌位置更改為/var/log/dovecot.log
:
- 通過輸入以下命令開啟/etc/dovecot/conf.d/10-logging.conf檔案以進行編輯:
nano /etc/dovecot/conf.d/10-logging.conf
- 新增此行以設定日誌的新檔案路徑:
/etc/dovecot/conf.d/10-logging.conf log_path = /var/log/dovecot.log
- 取消註釋
auth_verbose
和mail_debug
行,然後將它們設定為yes
:
/etc/dovecot/conf.d/10-logging.conf auth_verbose = yes mail_debug = yes
- 儲存更改。
- 輸入以下命令重啟Dovecot:
service dovecot restart
Dovecot日誌現在將顯示有關授權嘗試和收件箱連線的更多資訊。您可以在以下位置檢視新日誌/var/log/dovecot.log
。請記住在完成故障排除後禁用詳細日誌記錄,以便伺服器不會填滿日誌。
Postfix
請按照以下說明為Postfix啟用詳細日誌記錄:
- 開啟位於
/etc/postfix/master.cf的
的檔案輸入入以下命令:
nano /etc/postfix/master.cf
- 新增
-v
到該smtp
行以啟用詳細日誌記錄:
/etc/postfix/master.cf # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== smtp inet n - - - - smtpd -v
- 儲存更改。
- 輸入以下命令重新啟動Postfix:
service postfix restart
Postfix日誌現在將顯示有關進出外部伺服器的訊息的更多資訊。您仍然可以檢視日誌/var/log/mail.log
。請記住在完成故障排除後禁用詳細日誌記錄,以便伺服器不會被填滿日誌。
檢查埠可用性
有時會發生電子郵件問題,因為郵件伺服器和郵件客戶端在相同的埠上沒有相互通訊。對於從客戶端到伺服器的郵件,反之亦然,兩者都必須使用相同的埠,並且這些埠也必須沿著兩者之間的網際網路路由開啟。如果您按照隨附的Postfix,Dovecot和MySQL安裝指南,您應該使用以下埠:
- 25,465或587用於外發郵件(SMTP)的TLS加密
- 993使用SSL加密傳入IMAP
- 995使用SSL加密進入POP3
首先,檢查郵件客戶端設定,確保選擇了正確的埠和安全設定。
接下來,使用Telnet工具檢查Linode上以及客戶端和Linode之間路由上的埠是否都已開啟。應該在您的Linode和家用計算機上執行相同的測試。首先,我們將介紹如何從兩個位置執行測試,然後我們將討論其含義。
從Linode端檢查
要測試您的Linode,請按照下列步驟操作:
- 建立與Linode的SSH連線。
- 執行以下命令,替換
12.34.56.78
為您的Linode的IP地址:
telnet 12.34.56.78 25
- 按CTRL-]退出Telnet ,然後輸入
quit
。 - 對埠465,587,993和995重複步驟2。
閱讀下面對Telnet結果的討論,並使用本節末尾顯示的輸出來分析您的結果。
從Mac端檢查
要在Mac上執行Telnet測試,請按照下列步驟操作:
- 開啟終端應用程式。
- 執行以下命令,替換
12.34.56.78
為您的Linode的IP地址:
telnet 12.34.56.78 25
- 按CTRL-]退出Telnet ,然後輸入
quit
。 - 對埠465,587,993和995重複步驟2。
閱讀下面對Telnet結果的討論,並使用本節末尾顯示的輸出來分析您的結果。
從PC端檢查
要在Windows計算機上執行Telnet測試,請按照下列步驟操作。您需要首先安裝Telnet,因為預設情況下它不附帶Windows:
- 開啟控制面板。
- 選擇程式。
- 從“ 程式和功能”中,選擇“ 開啟或關閉Windows功能”。
- 從選單中選擇Telnet Client。
- 單擊確定。
- 等待更改應用。
- 開啟命令提示符。
- 執行以下命令,替換12.34.56.78為您的Linode的IP地址:
telnet 12.34.56.78 25
- 按CTRL-]退出Telnet ,然後輸入
quit
。 - 對埠465,587,993和995重複步驟8。
閱讀下面關於Telnet結果的討論,並根據下面顯示的輸出分析您的結果。
分析結果
如果測試成功,您應該看到類似於以下內容的輸出:
Trying 12.34.56.78... Connected to li468-222.members.linode.com. Escape character is '^]'. 220 host.example.com ESMTP Postfix (Ubuntu)
要取消連線,請按CTRL-],然後輸入quit
。如果測試失敗,您將看到一條Connection refused
訊息,Telnet將自行退出。
如果您在Linode上執行測試並且它失敗了,您應該檢查您是否在郵件伺服器設定中正確配置了埠(請參閱設定指南的Dovecot部分中的步驟33-34 ),您已啟用埠465和587(請參閱設定指南的Postfix部分中的步驟26-30 ),並且您沒有阻止它們的任何防火牆規則。
如果您在Linode上執行測試並且成功,但是來自家用計算機的測試失敗,則表明您的家庭計算機和Linode之間的網路上的某些埠被阻止。它可能在您的路由器,您的ISP(Internet服務提供商),其他人的ISP等。診斷網路問題的最佳方法是生成MTR報告。
如果您的Linode和家用計算機上的Telnet測試都成功,並且您的郵件客戶端設定正確,您可以排除埠的任何問題。
驗證您的登入憑據
接下來,我們將專注於您的登入憑據。如果配置不正確,可能會導致問題:
- 您的郵件客戶端不接受使用者名稱和密碼
- 一遍又一遍地提示您輸入密碼
- 無法連線到郵件伺服器
第一步也是最簡單的步驟是在郵件客戶端中重新輸入使用者名稱和密碼。確保使用完整的使用者名稱,包括該@example.com
部分。使用者名稱和密碼區分大小寫。如果您確定已在郵件客戶端中正確輸入了資訊,則可能無法在伺服器端正確配置授權。
接下來要檢查的是您的使用者名稱和密碼是否正確輸入到正確的MySQL表中。您可以從主安裝文章執行MySQL測試,以確保您的表已正確設定。您還可以從mailserver.virtual_users表中刪除並重新新增相應的行,以確保正確輸入密碼。如果MySQL表中的資訊正確,則可能是Dovecot未配置為在正確的位置查詢授權憑據。
Dovecot包含一個管理工具,它非常有助於解決登入憑據問題。該doveadm user
命令允許您檢視每個電子郵件使用者的使用者名稱,使用者ID,組ID和郵箱位置的使用者資料庫結果。讀取此工具的輸出會告訴您Dovecot正在尋找授權使用者的資料庫。如果Dovecot沒有尋找預期的資料庫,您需要更改Dovecot中與授權相關的設定,以便它使用MySQL來查詢使用者,而不是其他使用者資料庫。
- 執行
doveadm
命令以查詢您的電子郵件使用者(包括@example.com
部件):
doveadm user [email protected]
如果一切正常,你應該看到這樣的輸出:
userdb: [email protected] uid : 5000 gid : 5000 home : /var/mail/vhosts/example.com/email1
相反,如果你得到:
userdb lookup: user [email protected] doesn't exist
這可能表明1)您沒有在MySQL表中正確輸入電子郵件地址 - 但我們只是檢查了它,所以它也可能是2)Dovecot沒有在正確的位置查詢您的使用者資料庫。
- 如果Dovecot無法在MySQL中找到使用者,它可能仍在尋找系統使用者而不是虛擬使用者。看看你是否得到了自己的SSH使用者的回覆:
doveadm user myuser
達夫科特應該不會找到你的系統使用者輸出。如果是,它將如下所示:
userdb: myuser system_groups_user: myuser uid : 1000 gid : 1000 home : /home/myuser
- 如果您確實獲得此類輸出,則需要調整與虛擬使用者相關的Dovecot設定。如果您沒有獲得系統使用者的輸出,這仍然表示您在與使用者相關的Dovecot設定中出現某種錯誤。返回主要設定指南的Dovecot部分,並特別注意與虛擬使用者和MySQL設定有關的部分。
逐步配置
對於某些故障排除方案,您可能會發現自上而下的方法無法幫助您找到問題的根本原因。有時,您需要的是自下而上的方法。
這裡提出的自下而上的方法打破了將郵件伺服器構建成較小塊的複雜任務。這有兩個好處。首先,每個部分僅關注一些郵件伺服器功能,幷包含較少的細節,這使其更容易理解。在專案結束時,您應該深入瞭解郵件伺服器的工作原理。其次,每個塊都為郵件伺服器添加了一定數量的可測試功能。這樣可以通過限制其可能位置的範圍來更輕鬆地查詢錯誤。例如,如果您的郵件伺服器在完成“基本Dovecot”後仍在工作,但在“虛擬域和使用者”之後未通過測試,則您知道該錯誤與您在該部分中所做的事情有關。
本指南的第二部分介紹了按功能組織的逐步郵件伺服器構建,從核心功能到更多外圍功能,並在每個步驟進行測試。您應該同時開啟主設定指南,因為我們將引用它。在閱讀主要設定指南時,您會注意到我們在這裡以不同的順序安裝專案。主要指南旨在簡化方法,避免多次編輯同一檔案。本指南側重於對每個元件的更深入理解,因此您有時需要跳轉到主要指南的不同部分以供參考。成功完成一個階段後,我建議您進行系統級備份,以便輕鬆回到之前!
警告 請記住,此處介紹的早期版本是可用的,但出於安全性和功能原因,不應將其視為生產準備,主要是因為密碼以純文字格式傳送,和/或未啟用傳出SMTP。
在本節中,我們將提供相應的Postfix和Dovecot文件的連結。這些都是很棒的起點。
設定
閱讀入門指南。在安裝郵件伺服器之前,請按照該部分中列出的步驟操作。
您可能還希望以root使用者身份登入伺服器,因此您不必為每個命令鍵入“sudo”。您可以輸入以下命令以root身份登入:
su
基本的Postfix
在本節中,您將安裝Postfix並將其配置為在您的域中為您的系統使用者提供郵件,這是最基本的配置。您還將傳送測試訊息並使用Mailutils檢視它。
- 輸入以下命令安裝Postfix:
apt-get install postfix
- 當出現提示時,選擇“ Internet站點”進行配置。(有關此步驟和下一步,請參閱主要指南的 安裝包部分中的步驟6和7。)
- 輸入您的完全限定域名或解析為伺服器的任何域名。
- 開啟
/etc/postfix/main.cf
進行編輯,並將您的域新增到該mydestination
行。如果在安裝Postfix之前正確設定了主機名和主機檔案,則此列表應該已包含您的完全限定域名以及對localhost的多個引用,您可以將其保留原樣。
/etc/postfix/main.cf mydestination = example.com, localhost
- 輸入以下命令重新啟動Postfix:
service postfix restart
- 注意只要指令告訴您重新啟動Postfix,請使用該命令。替代dovecot的postfix指令何時告訴您重新啟動Dovecot的。向Linux系統使用者傳送測試訊息。這與您用於SSH的使用者相同。您應該使用格式< myuser#example.com >。
- 輸入以下命令安裝Mailutils:
apt-get install mailutils
- 輸入以下命令,使用Mailutils檢查郵件。您必須以自己的使用者身份登入,因此如果您之前以root使用者身份登入,則暫時退出root使用者。
- 輸入要閱讀的郵件編號。
- 如果要退出系統使用者的收件箱,請鍵入
quit
。
如果您成功向系統使用者傳送了測試訊息,則表明您已成功安裝Postfix並將其配置為最基本的郵件傳遞。預設情況下,它僅為系統使用者傳遞郵件,郵件儲存在名為的檔案中/var/mail/myuser
。
基本的Dovecot
在本節中,您將安裝Dovecot並進行設定,以便您可以通過IMAP或POP3連線檢查系統使用者的電子郵件,這是最基本的配置。本節基於Dovecot的基本配置指南,這是一個很好的參考。
- 通過輸入以下命令安裝Dovecot及其IMAP和POP3包:
apt-get install dovecot-core dovecot-imapd dovecot-pop3d
- 開啟
/etc/dovecot/conf.d/10-mail.conf
進行編輯,並將其設定為mail_location
如下所示的行。此設定應指示Dovecot在Postfix儲存郵件的同一位置查詢郵件,/var/mail/myuser
預設情況下應該這樣(Dovecot使用該變數%u
,所以路徑中使用了正確的使用者名稱)。郵箱格式指定為mbox
。
/etc/dovecot/conf.d/10-mail.conf mail_location = mbox:~/mail:INBOX=/var/mail/%u
- 同樣在
/etc/dovecot/conf.d/10-mail.conf
,設定mail_privileged_group
為mail
:
/etc/dovecot/conf.d/10-mail.conf mail_privileged_group = mail
- 在
/etc/dovecot/conf.d/10-auth.conf
,通過設定disable_plaintext_auth
為允許純文字身份驗證no
:
/etc/dovecot/conf.d/10-auth.conf disable_plaintext_auth = no
- 在
/etc/pam.d/dovecot
,告訴Dovecot使用標準的UNIX身份驗證。這意味著您的SSH使用者名稱和密碼也適用於郵件。編輯檔案,使其僅包含以下內容:
/etc/pam.d/dovecot auth required pam_unix.so nullok account required pam_unix.so
- 重啟Dovecot。
- 給自己發一條測試資訊。
- 檢視你的電子郵件。您可以使用Telnet或郵件客戶端。在此階段,您的電子郵件地址將是您的系統使用者(myuser#example.com),您的使用者名稱和密碼將與SSH相同(
@example.com
此階段不包含使用者名稱)。您的連線型別將是標準的(非安全),您的密碼將是明確的。您可能需要手動設定郵件客戶端,而不是通過嚮導。
注意 Telnet和郵件客戶端測試不適用
root
。使用其他系統使用者。
如果您通過IMAP或POP3連線成功檢查了郵件,則表明您已成功安裝Dovecot並將其配置為最基本的收件箱訪問。
虛擬域和使用者
既然Postfix和Dovecot正在執行,您應該設定虛擬域和使用者。擁有郵件的虛擬使用者是郵件伺服器安全性和便利性的重要一步,因為它無需為需要郵箱的每個人建立系統使用者。它還可以更輕鬆地將新域和使用者新增到郵件伺服器。
您需要在Postfix和Dovecot中進行與虛擬域和使用者相關的一些配置更改。Postfix和Dovecot都需要同時為虛擬域和使用者配置,因為您正在更改郵箱位置,需要在它們之間進行協調。以下是您將在本節中配置的內容的一般清單:
- 使用虛擬使用者資訊(使用者名稱,密碼,郵箱位置)建立兩個新的靜態檔案,一個用於Postfix,另一個用於Dovecot。(您不能使用相同的檔案,因為它們需要不同的引數和格式。)您之前不需要寫出自己的身份驗證資訊,因為Postfix和Dovecot只是從系統身份驗證中讀取,但您現在需要它虛擬使用者認證。最終,您將在MySQL資料庫中儲存此資訊,但現在將其設定為平面檔案更為簡單。
- 告訴Postfix和Dovecot使用虛擬使用者。
- 列出Postfix配置檔案中的虛擬域,而不是使用該
mydestination
行。 - 在新位置建立新郵箱。他們曾經在
/var/mail/myuser
,但現在他們將在/var/mail/vhosts/example.com/user/
。這有額外的好處,讓你在不同的域名擁有相同的使用者名稱:例如,你現在可以有[email protected]和[email protected]是兩個不同的郵箱。 - 告訴Postfix和Dovecot使用新的郵箱位置。
- 授予一個系統使用者(稱為
vmail
)訪問所有郵箱,而不是讓每個系統使用者擁有自己的郵箱。
在您完成本節時,您可能希望在虛擬使用者上引用Postfix的Virtual Readme和Dovecot的wiki頁面。
- 為Postfix建立虛擬使用者檔案。這將列出相對於
virtual_mailbox_base
引數的所有電子郵件地址及其交付位置(已配置/etc/postfix/main.cf
,我們將立即獲得)。我們正在呼叫該檔案/etc/postfix/virtual_users_list
,它看起來像這樣:
/etc/postfix/ virtual_users_list [email protected] example.com/email1/ [email protected] example.com/email2/
- 為Dovecot建立虛擬使用者檔案。這將以純文字形式列出您的所有電子郵件使用者名稱(僅使用電子郵件地址)及其密碼(顯然這不是生產就緒的)。它應該看起來像這樣:
/etc/dovecot/users [email protected]:{Plain}firstpassword [email protected]:{Plain}secondpassword
此列表允許Dovecot在授予虛擬使用者訪問其收件箱之前檢查虛擬使用者的使用者名稱和密碼。
- 編輯Postfix的主配置檔案,
/etc/postfix/main.cf
。刪除每個域除了local.host
從mydestination
引數。建立一個名為的新引數virtual_mailbox_domains
並新增您的域:
/etc/postfix/main.cf virtual_mailbox_domains = example.com, hostname, hostname.example.com, localhostexamplecom
注意
mydestination
和virtual_mailbox_domains
列表之間不能重疊。
- 同樣在
/etc/postfix/main.cf
,新增該行virtual_mailbox_base
並將其設定為/var/mail/vhosts
以便將郵件傳遞到新郵箱。每個使用者的路徑的最後部分位於virtual_users_list
步驟1 的檔案中。
/etc/postfix/main.cf virtual_mailbox_base = /var/mail/vhosts
- 同樣在
/etc/postfix/main.cf
,新增該行virtual_mailbox_maps
並將其設定為您在步驟1中建立的虛擬使用者檔案。它是一個“雜湊”型別檔案。如果你完全按照這個例子,它將是:
/etc/postfix/main.cf virtual_mailbox_maps = hash:/etc/postfix/virtual_users_list
但是,您可以virtual_mailbox_maps
根據需要為此檔案命名,並相應地設定引數。
/etc/postfix/main.cf
中的最後一項更改是設定新vmail
系統使用者。該使用者將擁有虛擬郵箱。新增以下新行:
/etc/postfix/main.cf virtual_minimum_uid = 100 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000
- 我們花點時間總結一下你剛剛做出的所有變化
/etc/postfix/main.cf
。您刪除所有域,除了localhost
從mydestination
引數,並增加了對虛擬域和使用者,這應該是這樣的(添加了一些新的線路#Virtual domains
,如果需要的註釋):
/etc/postfix/main.cf #Virtual domains virtual_mailbox_domains = example.com, host virtual_mailbox_base = /var/mail/vhosts virtual_mailbox_maps = hash:/etc/postfix/virtual_users_list virtual_minimum_uid = 100 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000
- 既然您已經在Postfix配置檔案中進行了所有更改,您應該確保Postfix使用以下命令讀取新設定:
postmap /etc/postfix/virtual_users_list
- 建立
vmail
使用者和組:
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /var/mail
/var/mail/vhosts/example.com/email1
為每個電子郵件地址建立目錄。你必須從製作vhosts
目錄開始,然後繼續努力。您可以使用mkdir
與-p
如果需要的標誌。- 將
/var/mail
目錄及其下面的所有內容更改為vmail
使用者和組:
chown -R vmail:vmail /var/mail
太棒了!現在,郵件傳遞實際存在正確的資料夾,擁有這些資料夾的使用者與我們告訴Postfix在向伺服器寫入新郵件時使用的資料夾相匹配。
- 重啟Postfix。
- 嘗試向自己傳送測試訊息。檢查
/var/log/mail.log
; 你應該看到這樣的東西:
/var/log/mail.log Mar 8 18:01:27 host postfix/virtual[4418]: E2C7528420: to=<[email protected]>, relay=virtual, delay=0.01, delays=0.01/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)
所說的部分relay=virtual
意味著您已經正確設定了虛擬域和使用者。
- 接下來是Dovecot。首先,更新
mail_location
in/etc/dovecot/conf.d/10-mail.conf
:
/etc/dovecot/conf.d/10-mail.conf passdb { driver = passwd-file args = username_format=%u /etc/dovecot/users } userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n }
注意
passdb
部分詳細介紹了電子郵件使用者如何進 該driver
行告訴Dovecot你正在使用一個平面檔案,args
行告訴它它在哪裡以及期望的格式。(這是/etc/dovecot/users
您在步驟2中建立的檔案。)userdb
行告訴Dovecot在哪裡可以找到伺服器上的郵件以及它應該用來訪問郵件檔案的系統使用者。由於每個郵箱的位置格式相同,因此userdb
可以是靜態的。您告訴它使用該vmail
使用者來訪問郵箱。最後,該home=
引數告訴Dovecot尋找郵件var/mail/vhosts/example.com/user
。此設定必須與Postfix設定中的virtual_mailbox_base
+/etc/postfix/virtual_users_list
相對路徑匹配。您必須告訴Dovecot在您告訴Postfix傳送郵件的同一個地方尋找郵件。
- 現在你只需要告訴Dovecot使用
auth-passwdfile.conf.ext
而不是auth-system.conf.ext
,所以它使用你在步驟2中建立的那個可愛的新密碼檔案。在/etc/dovecot/conf.d/10-auth.conf
,新增#
註釋掉系統使用者檔案,並刪除#
以啟用passwdfile配置檔案:
/etc/dovecot/conf.d/10-auth.conf #!include auth-system.conf.ext !include auth-passwdfile.conf.ext
- 重啟Dovecot。
- 給自己發一條測試資訊。
- 看看您是否可以使用IMAP或POP3檢視您的電子郵件; 您可以使用郵件客戶端或Telnet。您現在應該能夠使用您的電子郵件地址和電子郵件密碼登入,而不是您的系統使用者名稱和密碼。
注意 請記住,這三條路徑必須匹配:Postfix設定中的 virtual_mailbox_base+/etc/postfix/virtual_users_list 相對路徑mail_location,Dovecot中的路徑和Dovecot中的路徑home=。
如果您最近的測試有效,那麼您現在已經成功地將虛擬域和使用者設定為Postfix和Dovecot。
Dovecot的LMTP用於本地交付
現在您已經有虛擬域和使用者工作,現在是時候更新本地傳遞代理了。預設情況下,Postfix使用自己的內建LDA。我們將轉而使用Dovecot的LMTP(本地郵件傳輸協議)服務。為此,我們必須在Dovecot中設定一個Postfix可以使用的套接字。
有關官方文件,請參閱Dovecot關於LMTP的wiki文章。
dovecot-lmtpd
輸入以下命令進行安裝:
apt-get install dovecot-lmtpd
- 在
/etc/dovecot/dovecot.conf
,新增或修改該protocols
行,如下所示。如果您需要新增該行,可以在下面新增!include_try /usr/share/dovecot/protocols.d/*.protocol
。
/etc/dovecot/dovecot.conf protocols = imap pop3 lmtp
- 仔細編輯現有的
service lmtp
部分,/etc/dovecot/conf.d/10-master.conf
如下所示,這將啟用套接字:
/etc/dovecot/conf.d/10-master.conf service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } # Create inet listener only if you can't use the above UNIX socket #inet_listener lmtp { # Avoid making LMTP visible for the entire internet #address = #port = #} }
注意 確保計算括號。此部分中的額外或缺少括號將產生語法錯誤,阻止Dovecot啟動。
- 重啟Dovecot。
- 確保介面存在:
ls /var/spool/postfix/private/dovecot-lmtp
- 現在,告訴Postfix使用新套接字進行本地傳遞。在
/etc/postfix/main.cf
,設定此行:
/etc/postfix/main.cf virtual_transport = lmtp:unix:private/dovecot-lmtp
- 重啟Postfix。
- 給自己發一條測試資訊。確保您仍然可以收到郵件。
從Postfix到Dovecot的身份驗證切換
預設情況下,除非您直接登入伺服器,否則Postfix不允許您傳送電子郵件。這是一個很好的預設設定,因為您不希望成為垃圾郵件中心。但是,您希望稍微放鬆生產伺服器的設定,以便讓經過身份驗證的電子郵件使用者傳送郵件。作為前驅,您需要為Postfix設定身份驗證。由於當用戶想要檢查他們的電子郵件時,Dovecot已經在處理身份驗證方面表現出色,您也可以讓它為Postfix處理身份驗證。
這個過程與LMTP的過程非常相似,因為你首先在Dovecot中建立一個套接字然後告訴Postfix使用它。有關更多資訊,請參閱Dovecot關於Postfix和SASL的wiki文章。
- 仔細編輯
/etc/dovecot/conf.d/10-master.conf
看起來如下,這將啟用套接字:
/etc/dovecot/conf.d/10-master.conf service auth { # auth_socket_path points to this userdb socket by default. It's typically # used by dovecot-lda, doveadm, possibly imap process, etc. Its default # permissions make it readable only by root, but you may need to relax these # permissions. Users that have access to this socket are able to get a list # of all usernames and get results of everyone's userdb lookups. unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } unix_listener auth-userdb { mode = 0600 user = vmail #group = } # Postfix smtp-auth #unix_listener /var/spool/postfix/private/auth { # mode = 0666 #} # Auth process is run as this user. #user = $default_internal_user }
注意 請再次注意你的括號。
- 在該
service auth-worker
部分中,設定user
為vmail
。
/etc/dovecot/conf.d/10-master.conf service auth-worker { # Auth worker process is run as root by default, so that it can access # /etc/shadow. If this isn't necessary, the user should be changed to # $default_internal_user. user = vmail }
- 重啟Dovecot。
- 通過輸入以下命令檢查/ var / spool / postfix / private / auth是否存在:
ls /var/spool/postfix/private/auth
- 現在,您將配置Postfix以使用Dovecot的身份驗證。有關更多資訊,請參閱Postfix的Dovecot SASL指南和Postfix有關啟用SASL的指南。新增以下行
/etc/postfix/main.cf
。這告訴Postfix身份驗證型別,套接字的位置以及應該啟用SASL身份驗證:
/etc/postfix/main.cf smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes
- 重啟Postfix。
- 給自己傳送一條測試訊息,確保您仍然可以收到它。
如果您的測試成功,您剛剛將Dovecot的LMTP服務設定為您的本地傳遞代理。
SSL加密
現在已經設定了身份驗證,讓我們確保身份驗證過程是安全的。為此,您需要使用SSL或STARTTLS加密所有身份驗證嘗試。有關更多資訊,請參閱Dovecot關於SSL加密的wiki文章。
- 開啟
/etc/dovecot/conf.d/10-ssl.conf
進行編輯,然後設定ssl
為required
:
/etc/dovecot/conf.d/10-ssl.conf ssl = required
- 同樣在
/etc/dovecot/conf.d/10-ssl.conf
,檢查SSL證書和金鑰的路徑。預設情況下,它們應設定為Dovecot的證書和金鑰。如果這是你正在使用的,請保留這些設定。否則,請更新要使用的證書和金鑰的路徑。
/etc/dovecot/conf.d/10-ssl.conf ssl_cert = </etc/ssl/certs/dovecot.pem ssl_key = </etc/ssl/private/dovecot.pem
- 驗證您的SSL證書和金鑰是否位於上一步中指定的位置。
- 禁用純文字身份驗證。在
/etc/dovecot/conf.d/10-auth.conf
,設定以下行:
/etc/dovecot/conf.d/10-auth.conf disable\_plaintext\_auth = yes
- 禁用IMAP和POP3的未加密埠,以便伺服器不接受未加密的連線。在
/etc/dovecot/conf.d/10-master.conf
,設定:
/etc/dovecot/conf.d/10-master.conf service imap-login { inet_listener imap { port = 0 } ... } service pop3-login { inet_listener pop3 { port = 0 } ... }
- 離開
imaps
和pop3s
埠(他們被註釋掉了)。他們的預設設定很好; 您將能夠使用993進行安全IMAP,使用995進行安全POP3。 - 重啟Dovecot。
- 嘗試在埠110和143上連線到您的伺服器(我們建議使用Telnet)。這應該失敗,因為我們只是禁用了未加密的埠。
- 嘗試通過啟用SSL加密和埠993或995來檢查您的郵件。這應該會成功。
如果您無法在110和143上連線,並且可以在啟用了SSL的993和995上進行連線,則您已成功強制加密所有身份驗證連線。請注意,此時您將無法通過Telnet登入 - 您只是在測試埠。
SMTP
現在您已經安全地設定了身份驗證,您需要配置SMTP。現在,只有當郵件傳送到伺服器上的域或者系統使用者傳送時,Postfix才會中繼電子郵件,這對於收到的郵件就足夠了。但是,對於外發郵件,您需要簡化中繼限制,以便經過身份驗證的使用者可以在任何位置傳送電子郵件。
- 開啟
/etc/postfix/main.cf
進行編輯,然後新增smtpd_recipient_restrictions
如下所示的行:
/etc/postfix/main.cf smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
注意 smtpd_recipient_restrictions行列出了Postfix用於決定可以中繼哪些電子郵件的標準。permit_sasl_authenticated允許經過身份驗證的使用者傳送郵件,應該首先列出。接下來我們有permit_mynetworks,它允許已登入伺服器的使用者傳送郵件。最後,reject_unauth_destination阻止您的伺服器為未配置它的域提供郵件。永遠不要刪除最後的設定!這意味著始終允許經過身份驗證的使用者和本地使用者在任何地方傳送郵件。允許非身份驗證和非本地使用者僅向此伺服器負責的域傳送郵件。這些限制會阻止您的伺服器被用作可以將垃圾郵件從任何人傳送到任何地方的開放中繼。
- 您還需要強制加密傳出身份驗證。仍在
/etc/postfix/main.cf
,設定以下行:
/etc/postfix/main.cf smtpd_tls_cert_file=/etc/ssl/certs/dovecot.pem smtpd_tls_key_file=/etc/ssl/private/dovecot.pem smtpd_use_tls=yes smtpd_tls_auth_only = yes
注意 首先,您將告訴Postfix使用Dovecot的SSL證書和金鑰,因為如果傳入和傳出伺服器的證書不匹配,某些郵件客戶端將會阻塞。然後你告訴Postfix使用(僅)TLS加密。這意味著使用者可以在標準埠(25)上進行連線,但在允許使用者傳送任何身份驗證資訊之前,他們必須建立加密連線。
- 製作
/etc/postfix/master.cf
檔案的副本:
cp /etc/postfix/master.cf /etc/postfix/master.cf.orig
- 輸入以下命令開啟配置檔案以進行編輯:
nano /etc/postfix/master.cf
- 找到並取消註釋以
submission
和開頭的兩行smtps
。這將允許您在埠587和465上安全地傳送郵件,以及埠25(使用我們的SSL設定也是安全的)。您/etc/postfix/master.cf
檔案的第一部分應類似於以下內容
/etc/postfix/master.cf # # Postfix master process configuration file. For details on the format # of the file, see the master(5) manual page (command: "man 5 master"). # # Do not forget to execute "postfix reload" after editing this file. # # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== smtp inet n - - - - smtpd #smtp inet n - - - 1 postscreen #smtpd pass - - - - - smtpd #dnsblog unix - - - - 0 dnsblog #tlsproxy unix - - - - 0 tlsproxy submission inet n - - - - smtpd # -o syslog_name=postfix/submission # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING smtps inet n - - - - smtpd # -o syslog_name=postfix/smtps # -o smtpd_tls_wrappermode=yes # -o smtpd_sasl_auth_enable=yes # -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING
- 儲存您對
/etc/postfix/master.cf
檔案所做的更改。 - 重啟Postfix。
- 設定郵件客戶端以作為外發郵件伺服器連線到您的Linode。您應該使用TLS加密,或者如果您有此選項,則通過埠25,465或587使用STARTTLS。您的使用者名稱和密碼與傳入郵件的使用者名稱和密碼相同。嘗試傳送測試訊息。
注意 您將無法再使用Telnet進行測試。如果要執行手動測試以進行故障排除,可以使用openssl。您的命令應如下所示(您也可以在埠465和587上進行測試): openssl s_client -connect example.com:25 -starttls smtp
您的郵件伺服器現在非常可行且安全。如果您樂意將所有域和使用者儲存在平面檔案中,可以在此處停止。但是,為了使長期維護更容易,我們建議您將域,使用者和別名列表儲存在MySQL資料庫中。
MySQL for Virtual Domains,Users和Aliases
讓郵件伺服器加快速度的最後一步是使它與MySQL相容。
- 安裝MySQL和Postfix和Dovecot的必要元件:
apt-get install mysql-server postfix-mysql dovecot-mysql
- 建立三個MySQL表
virtual_domains
,virtual_users
以及virtual_aliases
與您的資料填充,按照整個MySQL的部分主安裝導軌上。如果您不想使用MySQL命令列,可以安裝phpMyAdmin並使用它。 - 開啟
/etc/postfix/main.cf
進行編輯。註釋掉現有virtual_mailbox_domains
和virtual_mailbox_maps
行,並新增以下內容:
/etc/postfix/main.cf #Virtual domains, users, and aliases virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
- 按照步驟11-25 字尾部分主要設定嚮導來建立
/etc/postfix/mysql-virtual-mailbox-domains.cf
,/etc/postfix/mysql-virtual-mailbox-maps.cf
和/etc/postfix/mysql-virtual-alias-maps.cf
檔案。您還將使用postmap
命令測試Postfix是否可以找到所有這些資訊。 - 現在為Dovecot。建立檔案
/etc/dovecot/conf.d/auth-sql.conf.ext
。您將建立一個新passdb
部分,指示Dovecot使用MySQL進行身份驗證。該userdb
部分將與我們之前的部分相同,因為郵箱不會移動。
/etc/dovecot/conf.d/auth-sql.conf.ext passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } u serdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n }
- 開啟
/etc/dovecot/dovecot-sql.conf.ext
以進行編輯,取消註釋下面顯示的行,並使用適當的MySQL連線資訊更新它們:
/etc/dovecot/dovecot-sql.conf.ext driver = mysql connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpass default_pass_scheme = SHA512-CRYPT password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
- 開啟
/etc/dovecot/conf.d/10-auth.conf
進行編輯。註釋掉該!include auth-passwdfile.conf.ext
行並取消註釋該!include auth-sql.conf.ext
行。這會將您的身份驗證從平面檔案切換到資料庫:
/etc/dovecot/conf.d/10-auth.conf #!include auth-system.conf.ext !include auth-sql.conf.ext #!include auth-ldap.conf.ext #!include auth-passwdfile.conf.ext #!include auth-checkpassword.conf.ext #!include auth-vpopmail.conf.ext #!include auth-static.conf.ext
- 將
/etc/dovecot/
目錄的所有者和組更改為vmail
和dovecot
遞迴:
chown -R vmail:dovecot /etc/dovecot
- 以
/etc/dovecot/
遞迴方式更改目錄的許可權:
chmod -R o-rwx /etc/dovecot
- 開啟
/etc/dovecot/conf.d/10-master.conf
以進行編輯,並在該service auth
部分中設定user = dovecot
,在該行下方# Auth process is run as this user.
:
/etc/dovecot/conf.d/10-master.conf service auth { ... # Auth process is run as this user. user = dovecot }
- 重啟Dovecot。
- 確認您仍然可以傳送和接收郵件。如果您遇到任何錯誤,請檢查您的日誌。
好了,現在您應該瞭解主要指南並擁有功能齊全的Postfix,Dovecot和MySQL郵件伺服器!