淺析郵件伺服器原理

上面的架構圖中包含兩組郵件系統、兩個客戶端和一個DNS伺服器,其中的郵件系統是企業中比較經典的架構形式,下面我將依據此圖來簡述郵件伺服器的工作流程。

名詞解釋:

  • MUA 接收郵件所使用的郵件客戶端,使用IMAP或POP3協議與伺服器通訊,常見的有:outlook、foxmail;
  • MTA 透過SMTP協議傳送、轉發郵件,常見的有:sendmail、postfix、qmail;
  • MDA 將MTA接收到的郵件儲存到磁碟或指定地方,通常會進行垃圾郵件及病毒掃描;
  • MRA 負責實現IMAP與POP3協議,與MUA進行互動;
  • SMTP 傳輸傳送郵件所使用的標準協議;
  • IMAP 接收郵件使用的標準協議之一;
  • POP3 接收郵件使用的標準協議之一;
  • MailBox 使用者郵箱;
  • cyrus-SASL及courier-authlib 提供使用者認證相關的支援。
  • SQL 資料庫,用於儲存使用者身份資訊

前面的架構圖中,MUA想傳送郵件,就要將郵件透過SMTP協議送到MTA上,MTA通常會要求使用者認證身份(也可不認證),認證通常使用SASL,認證源可以是像上面的架構圖中那樣使用SQL資料庫也可以使用其他方式。MTA收到郵件後會檢查郵件目的地址的郵件域,此時會產生兩種情況。
情況一,目的郵件域是本伺服器:
如果發現是本伺服器的郵件域則將郵件送到MDA,由MDA將其投遞到使用者的郵箱(MailBox)中。最後使用者在MUA上使用POP3/IMAP協議連結MRA,MRA通常也會要求使用者認證身份,其認證源同MTA一樣可以是SQL也可以是其他方式,若認證透過,則允許MUA讀取郵件資訊。
情況二,目的郵件域非本伺服器:
若是郵件域是其他郵件伺服器的,則MTA會傳送UDP報文向DNS伺服器查詢郵件域對應的郵件主機,並最終解析出其IP地址,隨後MTA會查詢本伺服器的轉發控制策略,若允許轉發,則將郵件轉發到該域對應的伺服器上,最終會重複情況一中MTA收到郵件後的處理方式。

CentOS 6下使用postfix搭建簡單郵件伺服器

介紹:
postfix是linux/unix下比較常用的開源免費郵件傳輸代理程式(MTA)。
下圖是postfix的logo,略顯猥瑣。。。

服務安裝:
通常情況下,CentOS預設都會安裝postfix。
如果你不確定你的系統中有沒有postfix可以使用如下命令檢視。

yum -qa | grep postfix

若沒有安裝則使用如下命令安裝。

yum install -y postfix

DNS配置:
郵件傳送是需要DNS解析支援的,DNS伺服器的配置方法參考此篇文章:

CentOS 6下使用BIND配置簡單DNS伺服器


最後要求DNS正向解析配置成類似如下形式,反向解析區域可不配置。“192.168.1.20”是我的郵件伺服器的IP地址,請按照實際情況來做更改。

主要配置檔案介紹:
postfix的配置檔案存放路徑為/etc/postfix,其中的主要的配置檔案有兩個,一個是main.cf另一個是master.cf。關於兩個配置檔案的說明,如下。

main.cf              //此配置檔案為postfix主配置檔案,決定了postfix的工作方式。
master.cf            //此配置檔案用以配置postfix中各個程式的工作引數,一般在做郵件系統最佳化時才會用到。

postfix配置:
在配置前,我們需要先關掉系統中sendmail(sendmail也是linux/unix下常用的郵件傳輸代理程式)的所有服務,避免二者產生衝突。
檢視是否安裝了sendmail。
rpm -qa | grep sendmail
如安裝了sendmail,則關閉sendmail服務,否則跳過這一步。

service sendmail stop
chkconfig sendmail off

編輯主配置檔案。

vim /etc/postfix/main.cf

查詢“myhostname”關鍵字,一般在第75行左右的位置,因軟體版本差異行號可能不同。

去掉其中一個前面的註釋,這裡是配置postfix伺服器的主機名,這個主機名必須是FQDN(完全合格域名,例如:mail.ibadboy.net)。

在第83行左右找到“mydomain”關鍵字。

去掉其前面的註釋,並將引數修改為郵件域。
什麼是郵件域?舉例說明:admin@ibadboy.net這個郵箱地址中@後面的ibadboy.net就是郵件域。

在第98行左右找到“myorigin”關鍵字,去掉第二個“myorigin”前方註釋。
這裡是用於定義由本臺郵件伺服器寄出的每封郵件的郵件頭中mail from(發信源主機)的地址。如果不設定,預設會以$myhostname也就是本地主機名這個選項的引數為值,最後是這種形式:“from  ‘user1’ <user1@mail.ibadboy.net>”,看起來是不是怪怪的?為了方便閱讀,一般以$mydomain作為其引數,這樣就變成了“:“from  ‘user1’ <user1@ibadboy.net>”。
需要特殊說明的是:main.cf配置檔案中所有以$開頭的字串都是一個變數,變數的值就是變數名對應的選項的引數,例如$mydomin這個變數對應的值就是83行mydomin這個選項的引數。

修改後:

轉到第113行,找“inet_interfaces”這個關鍵字,這裡是定義postfix監聽的介面,預設只監聽本地迴環介面(127.0.0.1),通常的做法是讓其監聽所有的介面(值為all),或者也可以使用主機名為值,要求其只監聽主機名對應IP的介面。

修改後:

轉到164行,找“mydestination”關鍵字,這裡定義postfix可收信的主機名或域名。這裡其實很好理解,一封郵件的目的地址是我這臺伺服器我就收下,否則我當然不收了。

預設的選項是不包括域名的,通常情況下需要接收主機名或域名為本機的郵件,也就是修改為選項二,如下圖。

至此,一個簡單的postfix郵件伺服器就配置好了,我們一共對配置檔案做了如下幾個更改:1、指定了主機名,2、指定了郵件域,3、指定了發信源主機,4、使postfix監聽所有網絡卡,5、設定了允許收信的主機名及域名。
儲存配置後,在保證selinux和防火牆均關閉的情況下啟動postfix服務。

service postfix start

服務測試:
推薦搭建完postfix後配合dovecot(MRA,郵件接收代理)一起在郵件客戶端進行測試。
dovecot配置教程參考此篇文章:

CentOS 6下郵件接收代理程式——dovecot配置教程


 

CentOS 6下郵件接收代理程式——dovecot配置教程

介紹:
dovecot是開源的pop3和imap郵件伺服器(MRA,郵件接收代理),用於支援客戶端從伺服器讀取郵件。
軟體安裝:

[root@localhost ~]# yum install -y dovecot

dovecot配置部分
使用vim文字編輯器編輯dovecot主配置檔案

[root@localhost ~]# vim /etc/dovecot/dovecot.conf

找到# protocols = imap pop3 lmtp這條配置語句,去掉前面的註釋(#)。這裡是開啟dovecot的pop3和imap服務。

修改後如圖:

儲存並退出。
編輯/etc/dovecot/conf.d/10-auth.conf

[root@localhost ~]# vim /etc/dovecot/conf.d/10-auth.conf

找到# disable_plaintext_auth = yes,去掉前面的註釋(#)並將= yes改為= no。這裡是定義允許使用明文密碼登陸imap/pop3。

修改後如圖:

儲存並退出
編輯/etc/dovecot/conf.d/10-mail.conf

[root@localhost ~]# vim /etc/dovecot/conf.d/10-mail.conf

找到# mail_location = mbox:~/mail:INBOX=/var/mail/%u,去掉前面的註釋(#)。這裡是定義郵件儲存路徑。

修改後如圖:

儲存並退出,至此dovevot部分配置完成。
現在在保證selinux及防火牆已關閉的情況下啟動dovecot服務。

[root@localhost ~]# service dovecot start

新增兩個郵件賬戶測試用:

[root@localhost ~]# useradd -s /sbin/nologin user1
[root@localhost ~]# useradd -s /sbin/nologin user2
[root@localhost ~]# passwd user1
[root@localhost ~]# passwd user2

建立完賬戶後要賦予賬號對應的郵箱777的許可權,否則接收不到郵件。

[root@localhost ~]# chmod 777 /var/mail/*

測試服務可以使用outlook、fixmail等郵件客戶端。
推薦配置完MTA(郵件傳輸代理)和MRA(郵件接收代理)後一起測試,會方便很多。
關於MTA(郵件傳輸代理)的配置教程可以參考以下文章:

CentOS 6下使用sendmail搭建簡單郵件傳輸伺服器

CentOS 6下使用sendmail搭建簡單郵件傳輸伺服器

介紹:

sendmail是linux/unix下比較常用的開源免費郵件傳輸代理程式(MTA)。

需要安裝的軟體包:

sendmail(郵件傳輸代理,用於傳送及轉發郵件,使用smtp協議)
sendmail-cf(包含配置過程中需要使用的m4工具)

安裝命令:

yum install -y sendmail sendmail-cf

DNS配置:

DNS伺服器的配置方法參考此篇文章:

https://www.ibadboy.net/archives/1027.html

最終要求新增一個sx.com的域名並配置DNS解析為如下形式:

本實驗中DNS伺服器IP地址:192.168.162.244,郵件伺服器IP地址:192.168.162.245。

注意MX記錄要寫在前面(如上圖),否則會出錯。

配置完DNS伺服器之後別忘了將郵件傳輸伺服器的DNS修改為DNS伺服器的地址,否則會導致郵件傳輸伺服器無法轉發郵件哦。

Centos下修改DNS的方法參考此篇文章:

https://www.ibadboy.net/archives/1055.html

sendmail配置部分:

sendmail主配置檔案:

實際上sandmail的主配置檔案是/etc/mail/sendmail.cf,但因為該配置檔案使用宏語言編寫,一般人難以看懂更別提編輯了。
所以sendmail提供了一個/etc/mail/sendmail.mc檔案,此檔案可讀性遠遠大於sendmail.cf,使用者可以直接編輯sendmail.mc檔案再透過m4工具生成相對應的sendmail.cf配置檔案供sendmail讀取。

使用vim文字編輯器開啟sendmail.mc

vim /etc/mail/sendmail.mc

找到第116行(因軟體版本差異行號可能對不上),如下圖,將此行中Addr=127.0.0.1修改為本機公網IP地址(MX記錄對應的域名所解析出的IP地址,本實驗中為192.168.162.245),也可以改為0.0.0.0。這裡是定義讓sendmail監聽哪個地址,預設是監聽127.0.0.1(本地迴環),修改為0.0.0.0是監聽所有地址,也可以像本實驗中設定的只監聽某個指定的公網地址。

修改後如圖:

儲存並退出。

使用m4工具生成與剛剛編輯的sendmail.mc相對應的sendmail.cf檔案

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

編輯/etc/mail/access檔案定義允許接收或轉發哪些主機的郵件。

vim /etc/mail/access

如上圖,定義了允許接收並轉發192.168.162網段中所有主機的郵件。

關於/etc/mail/access配置檔案的詳細配置方法請轉到此篇文章瞭解:

https://www.ibadboy.net/archives/676.html

儲存並退出

生成與剛剛編輯的/etc/mail/access相對應的資料庫檔案。

makemap hash /etc/mail/access < /etc/mail/access

編輯/etc/mail/local-host-names定義本機的域(如不定義,預設以主機名作為本機域),當sendmail收到郵件時會依據此檔案來判斷郵件的目標地址是本域還是其他域,如果是本域則投遞到對應賬號的郵箱內,如果是其他域則進行轉發。

vim /etc/mail/local-host-names

配置方法很簡單,一行一個域名即可,如下圖。

儲存並退出,自此sendmail部分配置完成。

啟動服務:

在保證selinux及防火牆均已關閉的情況下啟動sendmail服務。

service sendmail start

但需要注意的是,一個完整的郵件系統不應該只包含使用SMTP協議的MTA(郵件傳輸代理),還應該包括使用POP3或IMAP協議的MRA(郵件接收代理)

推薦同時配置完MTA(郵件傳輸代理)和MRA(郵件接收代理)後一起進行最後的服務測試。

關於MRA(郵件接收代理)的配置參考此篇文章:

https://www.ibadboy.net/archives/958.html