電子郵件主機之設定,主要介紹 Postfix ,不過亦有提及 Sendmail 的相關技巧
電子郵件是個啥玩意兒?它是利用網路傳遞一些資訊給遠端伺服器的一種資訊傳遞行為,雖然訊息文字是很冷很硬的電腦文字, 確實比不上手寫信件來的讓人覺得溫暖,不過,對於具有時效性的資訊來說,電子郵件可是個不可多得的好幫手! 但是,電子郵件系統蓬勃發展的現在卻被某些少部分的特定人士所亂用,導致垃圾信件、色情廣告信件等等的氾濫! 真是啊~傷腦筋~底下我們就先來談一談這個電子郵件相關的功能吧!
在目前的社會當中,沒有電子郵件 (e-mail) 似乎是蠻奇怪的一件事!可以說,現在 e-mail 已經成為一個很普遍的人與人之間的溝通管道了, 電子郵件可以很快速的幫你將文件或訊息傳送到地球上的任何一個有網路存在的角落,當然, 你也可以在任何有網路的地方,連上 Internet 去收取你的信件!
不過,遺憾的是,只要是有人類的地方,就會有很多你意想不到的事情會出現了,當然 e-mail 也不例外,怎麼說呢? 我們來慢慢的分析一下電子郵件產生的一些問題吧:
可怕吧!電子郵件會衍生出這麼多的問題說~另外,這個 email 伺服器的設定與管理真的是網管人員心中永遠的痛! 為什麼呢?因為人都是想要越便利越簡單越好,但越便利越不管制的郵件伺服器就越容易被攻擊或遭利用! 反過來說,如果你針對郵件伺服器管得太嚴厲,那就不太人性化,相信至少您的主管可能就不太滿意,怎麼辦?
呵呵!沒錯啦!郵件伺服器就是這麼回事,讓人又愛又怕的一個玩意兒,搞定他,恭喜您啊一切順利圓滿! 搞不定他,伺服器被當成垃圾信件轉運站事小,丟掉工作那可是『茲事體大』呦!就因為他是這麼重要又難以搞定, 所以我們可得好好的學學他吶!
既然要使用 e-mail ,當然就需要郵件伺服器囉 (Mail Server)!不然你的信要怎樣寄出去呢?事實上,
mail server 的原理說難不難,但是說簡單嗎~似乎又有點難以理解~,所以,
底下我們要來談一談他的原理部分,然後再針對伺服器的設定來進行說明咯!我們首先要講的就是『
Mail server 系統與 DNS 系統有什麼關連性?』
這個部分新手最容易被搞混哩,是否要架設 mail server 就『宿命』的一定得架設
DNS server 在你的主機上面嗎?
事實上目前已經沒有人會使用 IP 來寄信了,我們通常接收到的 email 都是使用『帳號@主機名稱』的方式來處理的, 所以說,你的郵件伺服器『就一定要有一個合法註冊過的主機名稱』才可以。為什麼呢? 因為網路惡意使用與垃圾郵件氾濫的種種因素,導致我們不允許直接利用主機的 IP 來寄信了,否則每部有 IP 的主機都能寄信... 因此,你想要架設 mail server 就『必需』要有合法的主機名稱囉。
OK!既然我只要一個合法的主機名稱即可,那麼表示我不需要架設一部 DNS 主機囉?
是的,你可以這樣認為!只要你擁有合法的主機名稱,亦即在 DNS 的查詢系統當中你的主機名稱擁有一個 A 的標誌,
理論上你的 mail server 就可以架設成功。只不過由於目前網際網路上面的廣告信、
垃圾信與病毒信等佔用了太多的頻寬,導致整個網路社會花費過多的成本在消耗這些垃圾資料。
所以為了杜絕可惡的垃圾信件,目前的大型網路供應商 (ISP) 都會針對不明來源的郵件加以限制,
這也就是說『想要架設一部簡單可以運作的 mail server 越來越難了』。
對於一般的伺服器來說,我們只要使用正解讓用戶端可以正確的找到我們伺服器的 IP 即可架站,舉例來說 WWW 伺服器就是這樣。不過,由於目前收信端的郵件伺服器會針對郵件來源的 IP 進行反解,而如果你的網路環境是由撥接取得非固定的 IP 時,該種 IP 在 ISP 方面通常會主動的以 xxx.dynamic.xxx 之類的主機名稱來管理,偏偏這樣的主機名稱會被主要的大型郵件伺服器 (例如 hotmail, yahoo 等) 視為垃圾信件, 所以你的郵件伺服器所發出的信件將可能被丟棄,那可就傷腦筋了!
所以啊,如果你想要架設一部 Mail server 的話,請『務必』向您的上層 ISP 申請 IP 反解的對應, 不要再使用預設的反解主機名稱,否則很容易導致您的郵件伺服器所發出的信件會在 Internet 上面流浪啊!
那麼我們的郵件伺服器系統到底是如何使用 DNS 的資訊來進行郵件的傳遞的?還記得在十九章 DNS 裡面談到的 MX 這個標誌嗎?當時我們僅說過這個 MX 代表的是 Mail eXchanger, 當一封郵件要傳送出去時,郵件主機會先分析那封信的『目標主機的 DNS 』,先取得 MX 標誌 (注意,MX 標誌可能會有多部主機喔) 然後以最優先 MX 主機為準將信發送出去。看不懂嗎?沒關係,我們以底下這個 DNS 範例來說:
xyz.com.vbird IN MX 10 mail.xyz.com.vbird xyz.com.vbird IN MX 20 mail2.xyz.com.vbird xyz.com.vbird IN A aaa.bbb.ccc.ddd |
假如上述的 DNS 設定是正常的,那麼:
在這個過程當中,你必需要注意到:mail.xyz.com.vbird 及 mail2.xyz.com.vbird 必需要是可以幫 xyz.com.vbird 轉信的主機才行,也就是說,那兩部主機通常是你公司的最上游的郵件主機, 並不是你隨意填寫的!那兩部主機還需要針對你的 xyz.com.vbird 來設定『郵件轉遞』才行! 否則你的信會被踢掉的。
由於現在的很多郵件伺服器會去搜尋 MX 這個標誌來判斷目標郵件伺服器是否為合法,所以你要架設 Mail server 雖然不必自行設定 DNS 伺服器,不過你最好要申請一個 MX 的標誌才行。此外,MX 標誌一定要設定正確,否則你的信件將可能會直接被 MX 伺服器踢掉。為了要設定 MX 但是我們沒有上層郵件伺服器時,所以你可以指定 MX 為自己,利用自己當 MX 伺服器即可。
那麼你或許會想,這個 MX 有啥好處啊?一般來說,如果目標主機掛點時,你的郵件通常會直接退還給原發信者,
但如果有 MX 主機時,這部 MX 主機會先將該封信放在他的佇列 (queue) 當中,等到你的目標主機重新提供郵件服務後,
MX 主機會將你的信件傳送給目標主機,如此一來你的信件就比較不會遺失啊!這樣說,您可以瞭解吧! ^_^
剛剛上頭說過 email 通常是『帳號@主機名稱』的方式來處理,舉例來說鳥哥的 www.centos.vbird 主機上面有個 dmtsai 的使用者,則我的 email 將會成為:『dmtsai@www.centos.vbird』,當有人要寄信給我時, 他會分析 @ 後面的主機名稱,亦即 www.centos.vbird 的 MX/A 標誌等等,然後再透過剛剛說明的流程來傳出信件。 而當我的 www.centos.vbird. 收到這封信時,他會將信放到 dmtsai 的信箱當中啦!底下我們就來談一談這個流程吧!
在開始介紹郵件的傳送過程之前,我們先來想一想,你是如何寄出電子郵件的?假設你要寄信給一個使用者, 他的電子郵件是『a_user@gmail.com』好了,也就是說,你要寄一封信到 gmail.com 這個主機上的意思。 那你的桌上型電腦 (舉例來說, Windows 系統) 是否能夠將這封信『直接』透過網路送給 gmail.com 那個主機上? 當然不行啦!你得要設定幫你轉信的郵件伺服器才行!也就是說,你必需要先向某一部郵件伺服器註冊, 以取得一個合法的電子郵件使用權限後,才能夠發送郵件出去的。
所以說,你要寄出一封信件時是需要很多介面的幫忙的,底下列出一個簡單的圖示來說明:
我們先來解釋一些專有名詞吧!然後再來說明傳送的流程:
好了,那麼來想一想,你如何透過 MUA 來將信件送到對方的郵件信箱 (Mailbox) 去呢?
在這整個過程當中,你會發現你的信件是由我們的 MTA 幫忙發送出去的,此時 MTA 提供的協定是簡單郵件傳輸協定 (Simple Mail Transfer Protocol, smtp), 並且該封信最終是停留在對方主機的 MTA 上頭!並不是你朋友的 MUA 上頭啊!
瞭解了傳送信件時 MTA 需要啟動 smtp (port 25) 之後,再來我們得要談談那這封信件對方要如何接收啊?
那使用者如果想要收信時,當然也可以透過 MUA 直接來連線取得自己的郵件信箱內的資料啊!整個過程有點像底下這樣:
在上述的圖示中,多了一個郵件元件,那就是 MRA:
我們先談一談 POP3 的收信方式吧:
在上述的流程當中我們知道 MRA 必須要啟動 POP3 這個協定才行,不過這個協定的收件方式比較有趣, 因為使用者收信是由第一封信件開始收下直到最後一封信件傳輸完畢為止。不過由於某些 MUA 程式撰寫的問題,若有些郵件有病毒的可能性時,透過防毒軟體將可能導致該 MUA 軟體的斷線! 如此一來由於傳輸沒有完畢,因此 MRA 主機並不會將使用者的信件刪除。 此時如果使用者又再一次的按下接收按鍵,呵呵!原來已接收的信件又會重複收到,而沒有收到的還是收不到!
這個時候或許你可以透過登入主機利用 mail 這個指令來處理你有問題的郵件, 或許換一種 MUA 也是個不錯的思考方向,又或者暫時將防毒軟體關掉也是可以考慮的手段之一。 轉頭過來想一想,因為 POP3 的協定預設會將信件刪除,那如果我今天在辦公室將我的信收到辦公室的電腦中, 當我回家時再度啟動 MUA 時,是否能夠收到已經被接收的信件?當然不行,對吧!
或許你需要更有幫助的協定,亦即 IMAP (Internet Messages Access Protocol) , 這個協定可以讓你將 mailbox 的資料轉存到你主機上的家目錄,亦即 /home/帳號/ 那個目錄下, 那你不但可以建立郵件資料匣,也可以針對信件分類管理,而且在任何一個可連上網路的地方你只要登入主機, 原本的信件就還是存在吶!真是好啊!
不過,使用 IMAP 時,使用者的目錄最好能夠加點限制,例如利用 quota 來管理使用者的硬碟使用權限, 否則因為信件都在主機上頭,如果使用者過多且誤用時,你的硬碟空間會被吃光光喔!注意注意!
OK!透過上面的說明你要知道,要架設一部可以使用 MUA 進行收發信件的 MTA, MRA
伺服器,你至少也需要啟動 SMTP 以及 POP3 這兩個協定才行!而這兩個協定的啟動程式並不相同,
所以架設上還是得要小心注意啊!
郵件資料在網際網路上面傳輸時,透過的 SMTP, POP3, IMAP 等通訊協定,通通是明碼傳輸的!尤其 POP3, IMAP 這兩個通訊協定中,使用者必須要輸入帳號/密碼才能收受信件!因為涉及帳密,所以當然加密這兩個通訊協定的資料較佳! 於是就有了 POP3s, IMAPs 通訊協定出現了!透過 SSL 加密嘛!那你會問,既然已經有 pop3s, imaps 了, 那有沒有 smtps 呢?答案是,當然有!只不過沒人用!
從圖 22.1-1 及圖 22.1-2 的流程來看,POP3, IMAP 只與 MRA 及自己的用戶有關,因此你只要跟你的用戶說,你伺服器使用的 MRA 協定為何,通知你的用戶改變即可,並不會影響到其他的伺服器。 但是 MTA 就不同了!因為 MTA 必須與其他的 MTA 溝通,因此,若你使用了 smtps ,那麼全世界與你的 MTA 溝通者, 通通需要改變為 smtps 通訊協定才行!這個工程實在太浩大了!目前還沒有任何一家 ISP 有能力進行! 所以,就造成目前沒有 SMTPs 的協定囉。
那麼難道你的資料就一定要是明碼嗎?那倒不見得~既然你的 MTA 無法加密,那麼你就自己將郵件資料加密後,再交由 MTA 傳送即可!這也是目前很多急需加密資料的郵件用戶所使用的手段啦!^_^
當你需要 MTA 幫你將信寄送到下一部 MTA 去時,這個動作就稱為郵件轉遞 (Relay) 囉,那就是圖 22.1-1當中的 Step 2.2 那個動作啦。那麼我們來想一想,如果『所有的人都可以藉由這一部 MTA 幫忙進行 Relay 時, 這個情況稱之為 Open Relay 的動作』。當你的 MTA 發生 Open Relay 時,會有什麼問題? 問題可就大了!
當你的 MTA 由於設定不良的關係導致具有 Open Relay 的狀況,加上你的 MTA 確實是連上網際網路時, 由於網際網路上面用 port scan 軟體的閒人太多,你的 MTA 具有 Open Relay 的功能這件事情, 將會在短時間內就被很多人察覺,此時那些不法的廣告信、色情垃圾信業者將會利用你的這部 Open Relay MTA 發送他們的廣告,所以你會發生的問題至少有:
問題很大呦!所以啊,目前所有的 distributions 都一樣,幾乎都將 MTA 預設啟動為僅監聽內部迴圈介面 (lo) 而已,而且也將 Open Relay 的功能取消了。既然取消 Open Relay 的功能,那麼怎麼使用這部 MTA 的 Relay 來幫忙轉信啊?呵呵!所以我們在上頭才會一直說,你『必需』取得合法使用該 MTA 的權限啊! 這也就是說,設定誰可以使用 Relay 的功能就是我們管理員的任務啦!通常設定 Relay 的方法有這幾種:
認證機制上面常見的有 SMTP 郵件認證機制,以及 SMTP after POP 兩種,不論是哪一種機制, 基本上都是透過讓使用者輸入認證用的帳號與密碼,來確定他有合法使用該 MTA 的權限,然後針對通過認證者開啟 Relay 的支援就是了。如此一來你的 MTA 不再啟動 Open Relay ,並且用戶端還是可以正常的利用認證機制來收發信件, 身為管理員的你可就輕鬆多囉! ^_^
看過上頭的資料後,您應該對於 Mail server 有一些程度的認識了。再來要談的是,那麼一封 email 的內容有哪些部分呢?就跟人類社會的郵件有信封袋以及內部的信紙一樣,email 也有所謂的標頭 (header) 以及內容 (body) 兩部份喔!
email 的標頭部分 (類似郵件信封) 會有幾個重要資訊,包括:這封信來自那個 MTA、是由誰所發送出來的、要送給誰、 主旨為何等等,至於內容 (類似信封內的信紙) 則是發信者所填寫的一些說明囉。如果你使用 dmtsai 的身份下達這個指令:
[dmtsai@www ~]$ echo "HaHa.." | mail -s "from vbird" dmtsai
|
然後將自己的信箱內容叫出來,如下所示:
[dmtsai@www ~]$ cat /var/spool/mail/dmtsai From dmtsai@www.centos.vbird Tue Jun 7 16:08:57 2011 <==發信者的 email Return-Path: <dmtsai@www.centos.vbird> <==這封信的來源 Received: from www.centos.vbird (localhost.localdomain [127.0.0.1]) by www.centos.vbird (8.13.8/8.13.8) with ESMTP id p5788veo002702 for <dmtsai@www.centos.vbird>; Tue, 7 Jun 2011 16:08:57 +0800 Received: (from dmtsai@localhost) by www.centos.vbird (8.13.8/8.13.8/Submit) id p5788v8B002701 <==郵件ID for dmtsai; Tue, 7 Jun 2011 16:08:57 +0800 # 你看,有兩個 Received,從 localhost 傳遞到 www.centos.vbird 喔! Date: Tue, 7 Jun 2011 16:08:57 +0800 <==收到信件的日期 From: dmtsai@www.centos.vbird <==從哪個 email 來源呢! Message-Id: <201106070808.p5788v8B002701@www.centos.vbird> <==給機器看的郵件ID To: dmtsai@www.centos.vbird <==收下此封信的 email Subject: from vbird <==就是信件標題 <==底下就是信件的內容囉! HaHa.. |
由原本的信件內容我們可以看到 email 確實是兩部份,在標頭部分記錄了比較詳細的收、發件者資料, 以及相關的來源、目標之 MTA 資訊等等。但你要注意的是,那個『Received:...』那一行資料是『會變動的』, 如同前面談到的 MX 標誌,如果一封信由 MUA 傳送到 MTA 在由 MTA 傳送到 MX 主機後,才傳送到最終的 MTA 時, 那麼這個 Received: 的資料將會記錄每一部經手過的 MTA 資訊喔!所以你可以藉著這個記錄資料慢慢的找回這封信的傳遞方向呢!
此外,這個郵件的標頭以及內容的分析部分,你還可以藉由某些分析軟體來進行過濾, 這部份我們將在後頭再慢慢的介紹給大家瞭解喔! ^_^!您先知道一封郵件至少有這些資料,以後咱們再慢慢的解釋囉!
可達成 MTA 的伺服器軟體非常多,例如我們的 CentOS 預設就提供了數十年老牌子的 sendmail
(http://www.sendmail.org) 以及近期以來很熱門的
Postfix (http://www.postfix.org)。雖然 sendmail 曾是最為廣泛使用的
mail server 軟體,但由於 sendmail 的設定檔太過於難懂,以及早期的程式漏洞問題導致的主機安全性缺失;加上 sendmail
將所有的功能都統合在 /usr/sbin/sendmail 這個程式當中,導致程式太大可能會有效能方面的疑慮等等,
所以我們這裡還是以 Postfix 作為 mail server 的架設依據。當然啦,原理方面都一樣,您也可以自己玩玩其他的
mail server。
Postfix 是由 Wietse Zweitze Venema 先生(http://www.porcupine.org/wietse)所發展的。早期的 mail server 都是使用 sendmail 架設的,還真的是『僅此一家,絕無分號』!不過,Venema 博士覺得 sendmail 雖然很好用,但是畢竟不夠安全,尤其效能上面並不十分的理想,最大的困擾是...sendmail 的設定檔 sendmail.cf 真的是太難懂了!對於網管人員來說,要設定好 sendmail.cf 這個檔案,真不是人作的工作。
為了改善這些問題, Venema 博士就在 1998 年利用他老大在 IBM 公司的第一個休假年進行一個計畫:『 設計一個可以取代 sendmail 的軟體套件,可以提供網站管理員一個更快速、 更安全、而且完全相容於 sendmail 的 mail server 軟體!』這個計畫還真的成功了! 而且也成功的使用在 IBM 內部,在 IBM 內可以說是完全取代了 sendmail 這個郵件伺服器!在這個計畫成功之後, Venema 博士也在 1998 年首次釋出這個自行發展的郵件伺服器,並定名為 VMailer。
不過,IBM 的律師卻發現一件事,那就是 VMailer 這個名字與其他已註冊的商標很類似, 這樣可能會引起一些註冊上面的困擾。為了避免這個問題,所以 Venema 博士就將這個郵件軟體名稱改為 Postfix !『Post 有在什麼什麼之後』的意思,『fix 則是修訂』的意思,所以 postfix 有 『在修訂之後』的意思。
鳥哥個人認為, Venema 先生最早的構想並不是想要『創造一個全新的 Mail server 軟體,而是想要製造一個可以完全相容於 sendmail 的軟體』,所以,Venema 先生認為他自行發展的軟體應該是『改良 sendmail 的缺失』,所以才稱為 Postfix 吧!取其意為: 『改良了 sendmail 之後的郵件伺服器軟體!』
所以啦, Postfix 設計的理念上面,主要是針對『想要完全相容於 sendmail』所設計出來的一款『內在部分完全新穎』的一個郵件伺服器軟體。就是由於這個理念,因此 Postfix 改善了 sendmail 安全性上面的問題,改良了 mail server 的工作效率, 且讓設定檔內容更具親和力!因此,你可以輕易的由 sendmail 轉換到 Postfix 上面!這也是當初 Venema 博士的最初構想啊!
就是基於這個構想,所以 Postfix 在外部設定檔案的支援度,與 sendmail 幾乎沒有兩樣,同樣的支援 aliases 這個檔案,同樣的支援 ~/.forward 這個檔案,也同樣的支援 SASL 的 SMTP 郵件認證功能等等! 所以,呵呵!趕緊來學一學怎樣架設 Postfix 這個相當出色的郵件伺服器吧! ^_^
由於 CentOS 5.x 預設是以 sendmail 提供郵件伺服器功能的,且預設就安裝了 sendmail,因此,我們如果想要轉換成 Postfix 的話,建議將 sendmail 整個移除改裝 Postfix 較佳。不過,因為 Linux 系統至少需要一個 mail server 軟體, 所以,我們得要先安裝 Postfix 才移除 sendmail 喔:
[root@www ~]# yum install postfix [root@www ~]# /etc/init.d/sendmail stop [root@www ~]# yum remove sendmail sendmail-cf [root@www ~]# /etc/init.d/postfix start [root@www ~]# chkconfig postfix on |
那麼 postfix 有哪些重要的設定檔呢?他主要的設定檔都在 /etc/postfix/ 當中,詳細的檔案內容就讓我們來談談:
至於常見的執行檔則有底下這些:
[root@www ~]# postfix check <==檢查 postfix 相關的檔案、權限等是否正確! [root@www ~]# postfix start <==開始 postfix 的執行 [root@www ~]# postfix stop <==關閉 postfix [root@www ~]# postfix flush <==強制將目前正在郵件佇列的郵件寄出! [root@www ~]# postfix reload <==重新讀入設定檔,也就是 /etc/postfix/main.cf |
[root@www ~]# postalias hash:/etc/aliases # hash 為一種資料庫的格式,然後那個 /etc/aliases.db 就會自動被更新囉! |
[root@www ~]# postcat /var/spool/postfix/deferred/abcfile
|
[root@www ~]# postmap hash:/etc/postfix/access
|
整個 postfix 的軟體結構大致上是這個樣子的,接下來讓我們先來簡單的處理一下 postfix 的收發信件功能吧!
前面談到 mail server 與 DNS 系統有很大的相關性,所以如果你想要架設一部可以連上 Internet 的郵件伺服器時, 你必需要已經取得合法的 A 與 MX 主機名稱,而且最好反解也已經向您的 ISP 申請修改設定了, 這可是個大前提!不要忽略他!在底下的練習當中鳥哥以之前十九章 DNS 內的設定為依據,主要的參數是這樣的:
在實際的郵件伺服器設定當中,上述的幾個標誌是很重要的,請自行參考 DNS 章節的介紹吧!底下就讓我們來實際設定 postfix 伺服器囉!
在預設的情況下,CentOS 5.x 的 MTA 僅針對本機進行監聽,不相信嗎?測測看:
[root@www ~]# netstat -tlnp | grep :25 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3167/master |
所以如果你要對整個 Internet 開放的話,就得要努力的搞定幾個簡單的設定囉!而幾乎所有的設定你都可已經由 /etc/postfix/main.cf 這個檔案搞定!修改前你需要注意的項目有:
要讓你的 postfix 可以收發信件時,你必需要啟動的設定資料有底下這些喔:
在瞭解上述的設定後,以鳥哥的範例來看的話,我有更動過的設定值以及相關檔案是這樣處理的:
[root@www ~]# vim /etc/postfix/main.cf myhostname = www.centos.vbird <==約在第 70 行 myorigin = $myhostname <==約在第 92 行 inet_interfaces = all <==約在第 107 行,110 行要註解掉 mydestination = $myhostname, localhost.$mydomain, localhost, linux.centos.vbird, ftp.centos.vbird <==約在第 155,156 行 mynetworks = 127.0.0.0/8, 192.168.100.0/24, hash:/etc/postfix/access <==約在第 256,257 行 relay_domains = $mydestination <==約在第 289 行 # 其他的設定值就先保留預設值即可啊! [root@www ~]# postmap hash:/etc/postfix/access [root@www ~]# postalias hash:/etc/aliases |
因為 main.cf 當中我們有額外加入兩個外部設定檔 (mynetworks 及 alias_maps) ,所以才會額外進行 postmap 及 postalias。然後準備來啟動啦!你可以這樣處理喔:
# 1. 先檢查設定檔的語法是否有錯誤 [root@www ~]# /etc/init.d/postfix check <==沒有訊息,表示沒有問題。 # 2. 啟動與觀察 port number [root@www ~]# /etc/init.d/postfix restart [root@www ~]# netstat -tlunp | grep ':25' Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 4466/master |
很簡單吧!這樣就設定妥當了。假設你的防火牆已經處理完畢,那你的 Postfix 已經可以開放用戶端進行轉遞,並且也可以收受信件囉!不過,到底在預設的情況下我們的 postfix 可以收下哪些信件?又可以針對哪些設定值的內容進行轉遞呢?這就得要參考下一小節的說明了。
我想,您對於 MTA 的設定與收發信件應該有一定程度的概念了,不過要妥善設定好你的 MTA 時, 尤其是想要瞭解到整部 MTA 是如何收、發信件時,你最好還是要知道『我這部 MTA 如何接受來源主機所傳來的信件,以及將信件轉遞到下一部主機去』的整個流程啊。 一般來說一封郵件傳送會經過許多的流程為:
整個流程有點像底下這樣:
也就是說標頭分析通過後,你的信件內容才會開始上傳到主機的佇列,然後透過 MDA 來處理該信件的流向。 而不是將信件完整的傳送到主機後才開始分析的喔!這個得要特別注意吶!而透過上述的流程後, 在暫不考慮 access 以及 MDA 的分析機制中,一部 MTA 想要正確的收、發信件時,電子郵件必需要符合:
同樣的原理與想法你可以將他用在 sendmail 的設定當中喔! ^_^!不過很多垃圾信卻是藉由這個預設的收發管道來發送, 怎麼說呢?請看底下的分析:
例題:
在我的主機上面竟然發現這樣的廣告信,那就是『利用我的主機發送廣告信給我自己!』為什麼這樣也可以呢?
答:
首先,你必需要熟悉一下上述的流程,在第 2 個步驟當中我們知道,當主機收到一封信且這封信的目標是自己,
並且也符合 mydestination 的設定時,該信件就會被收下來而不必驗證用戶端是否來自於 mynetworks 了。
所以說,任何人都可以用這個流程來寄信給你啊。不過,你的 MTA 並不是 open relay 啦,不會幫人家發送廣告信的,不用擔心。
|
例題:
我的主機明明沒有 Open relay ,但很多其他的 MTA 管理員發信給我,說我的主機的某個帳號持續發送廣告信,
但是我的主機明明沒有那個帳號啊!這是怎麼回事?
答:
仔細看一下流程的步驟 1 與 2 ,確認該封信能否被收下來與發信端及收信端主機名稱有關。
而我們知道在郵件的 header 裡面還有一個 mail from 的標頭設定項目,這個標頭設定是我們在查閱郵件時看到的『回郵位址』,
這個資料是可以偽造的!而且他與收發信件的資料無關!所以,您應該要告知對方 MTA 管理員,
請他提供詳細的 log 資料,才能夠判斷該封信是否由你的主機所發送出去的。
一般來說,目前的廣告業者很多都是利用這種欺敵的方式來處理的,所以您必需要請對方提供詳細的 log file 資料以供查驗才行喔! |
基本上,指定了 Postfix 的 mynetworks 的信任來源就能夠讓使用者 relay 了,不過如果你依照鳥哥上述的方式 (22.2.4) 來設定你的 mynetworks 的話,那麼我們還可以利用 access 這個檔案來額外管理我們的信件過濾呢!基本的 access 語法為:
規範的範圍或規則 Postfix 的動作 (範例如下)
IP/部分IP/主機名/Email等 ACCEPT/REJECT
|
假設你想要讓 120.114.141.60 還有 .edu.tw 可以使用這部 MTA 來轉遞信件,且不許 av.com 以及 192.168.2.0/24 這個網域的使用時,可以這樣做:
[root@www ~]# vim /etc/postfix/access 120.114.141.60 ACCEPT .edu.tw ACCEPT av.com REJECT 192.168.2 REJECT # ACCEPT 表示可接受,而 REJECT 則表示拒絕。 [root@www ~]# postmap hash:/etc/postfix/access [root@www ~]# ls -l /etc/postfix/access* -rw-r--r-- 1 root root 17908 6月 9 15:46 /etc/postfix/access -rw-r--r-- 1 root root 12288 6月 9 15:46 /etc/postfix/access.db # 你會發現有個 access.db 的檔案才會同步更新!這才是 postfix 實際讀取的! |
用這個檔案設定最大的好處是,你不必重新啟動 postfix,只要將資料庫建立好, 立刻就生效了!這個檔案還有其它的進階功能,你可以自行進入該檔案查閱就知道了。但是進階設定還需要 main.cf 內的其他參數有設定才行!如果只有之前 $mynetworks 的設定值時,你只能利用 access.db 的方式來開放 relay 的能力而已。不過,至少他可以讓我們的設定簡化囉! ^_^
想一想,你的主機裡面不是有很多系統帳號嗎?例如 named, apache, mysql...,
那麼以這些帳號執行的程式若有訊息發生時,他會將該訊息以 email 的方式傳給誰?應該就是傳給 named, apache... 等帳號自己吧。
不過,你會發現其實這些系統帳號的資訊都是丟給 root!
這是因為其他的系統帳號並沒有密碼可登入,自然也就無法接收任何郵件了,所以若有郵件就給系統管理員囉。不過,咱們的 MTA
怎麼知道這些信件要傳給 root ?這就得要 aliases 這個郵件別名設定檔來處理啦!
在你的 /etc/aliases 檔案內,你會發現類似底下的字樣:
[root@www ~]# vim /etc/aliases mailer-daemon: postmaster postmaster: root bin: root daemon: root ....(底下省略).... |
左邊是『別名』右邊是『實際存在的使用者帳號或者是 email address』! 就是透過這個設定值,所以讓我們可以將所有系統帳號所屬的信件通通丟給 root 啊!好,我們現在將他擴大化,假如你的 MTA 內有一個實際的帳號名稱為 dmtsai ,這個使用者還想要使用 dermintsai 這個名稱來收他的信件, 那麼你可以這樣做:
[root@www ~]# vim /etc/aliases dermintsai: dmtsai # 左邊是你額外所設定的,右邊則是實際接收這封信的帳號! [root@www ~]# postalias hash:/etc/aliases [root@www ~]# ll /etc/aliases* -rw-r--r-- 1 root root 1531 6月 9 16:05 /etc/aliases -rw-r--r-- 1 root root 12288 6月 9 16:05 /etc/aliases.db |
從此之後不論是 dmtsai@www.centos.vbird 還是 dermintsai@www.centos.vbird 都會將信件丟到
/var/spool/mail/dmtsai 這個信箱當中喔!很方便吧!
假設你是系統管理員,而你常用的一般帳號為 dmtsai,但是系統出錯時的重要信件都是寄給 root 啊, 偏偏 root 的信件不能被直接讀取....所以說,如果能夠將『給 root 的信也轉寄一份給 dmtsai 』的話, 那就太好了!可以達到嗎?當然可以!你可以這樣做:
[root@www ~]# vim /etc/aliases root: root,dmtsai <==鳥哥建議這種寫法! # 信件會傳給 root 與 dmtsai 這兩個帳號! root: dmtsai <==如果 dmtsai 不再是管理員怎辦? # 從此 root 收不到信了,都由 dmtsai 來接受! [root@www ~]# postalias hash:/etc/aliases |
上面那兩行你可以擇一使用,看看 root 要不要保留他的信件都可以的!鳥哥建議使用第一種方式,因為這樣一來,
你的 dmtsai 可以收到 root 的信,且 root 自己也可以『備份』一份在他的信箱內,比較安全啦!
想像一個情況,如果你是學校的老師,你雖然只帶一班導生,但是『每年都一班』時,如果有一天你要將信發給所有的學生, 那在寫 email 的標頭時,可能就會頭昏昏的了 (因為聯絡人名單太多了)!這個時候你可以這樣做: (假設主機上學生的帳號為 std001, std002... )
[root@www ~]# vim /etc/aliases student2011: std001,std002,std003,std004... [root@www ~]# postalias hash:/etc/aliases |
如此一來只要寄信到這部主機的 student2011 這個不存在的帳號時,該封信就會被分別存到各個帳號裡頭去, 管理上面是否很方便啊! ^_^!事實上,郵件別名除了填寫自己主機上面的實體用戶之外,其實你可以填寫外部主機的 email 喔! 例如你要將本機的 dermintsai 那個不存在的用戶的信件除了傳給 dmtsai 之外,還要外傳到 dmtsai@mail.niki.centos.vbird 時,可以這樣做:
[root@www ~]# vim /etc/aliases dermintasi: dmtsai,dmtsai@mail.niki.centos.vbird [root@www ~]# postalias hash:/etc/aliases |
很方便吧!更多的功能就期待您自行發掘囉!
雖然 /etc/aliases 可以幫我們達到郵件別名設定的好處,不過 /etc/aliases 是只有 root 才能修改的檔案權限, 那我們一般使用者如果也想要進行郵件轉遞時,該如何是好?沒關係,可以透過自己家目錄下的 .forward 這個檔案喔! 舉例來說,我的 dmtsai 這個帳號所接收到的信件除了自己要保留一份之外,還要傳給本機上的 vbird 以及 dmtsai@mail.niki.centos.vbird 時,那你可以這樣做設定:
[dmtsai@www ~]$ vim .forward # 注意!我現在的身份現在是 dmtsai 這個一般身份,而且在他的家目錄下! dmtsai vbird dmtsai@mail.niki.centos.vbird [dmtsai@www ~]$ chmod 644 .forward |
記得這個檔案內容是一行一個帳號 (或 email) ,而且權限方面非常重要:
如此一來這封信就會開始轉遞囉!有趣吧! ^_^
說實話,設定到此為止咱們的 postfix 應該可以應付一般小型企業之 mail server 的用途了! 不過,有的時候畢竟因為網路的問題或者是對方主機的問題,可能導致某些信件無法送出而被暫存在佇列中, 那我們如何瞭解佇列當中有哪些郵件呢?還有,在佇列當中等待送出的信件是如何送出的呢?
當然啦,某些 MTA 已經取消了警告信的寄發,不過原則上,如果信件無法即時寄出去的話 MTA 還是會努力嘗試 5 天的,如果接下來的 5 天都無法送出時,才會將原信件退回給發信者。 一般來說,如果 MTA 設定正確且網路沒有問題時,應該是不可能會有信件被放在佇列當中而傳不出去的, 所以如果發現有信件在佇列時,當然得要仔細的瞧一瞧囉!檢查佇列內容的方法可以使用 mailq , 也可以使用 postqueue -p 來檢查的:
[root@www ~]# postqueue -p
Mail queue is empty
|
若您的郵件如此顯示時,恭喜您,沒有什麼問題郵件在佇列當中。不過如果你將 postfix 關閉, 並嘗試發一封信給任何人,那就可能會出現如下的畫面啦:
[root@www ~]# /etc/init.d/postfix stop [root@www ~]# echo "test" | mail -s "testing queue" root [root@www ~]# postqueue -p postqueue: warning: Mail system is down -- accessing queue directly -Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient------- 9A85085519 108 Thu Jun 9 08:42:01 root root -- 0 Kbytes in 1 Request. # 第一行就說明了無法寄出的原因為 Mail system is down 啦! # 然後才出現無法寄出的信件資訊!包括來源與目標喔! |
輸出的資訊主要為:
事實上這封信是放置在 /var/spool/postfix 裡面,由於信件內容已經編碼為給 MTA 看的資料排列, 所以你可以使用 postcat 來讀出原信件的內容喔!例如這樣做 (注意看檔名與 Queue ID 的對應!):
[root@www ~]# cd /var/spool/postfix/maildrop [root@www maildrop]# postcat 9A85085519 <==這個檔名就是 Queue ID *** ENVELOPE RECORDS 9A85085519 *** <==說明佇列的編號啊 message_arrival_time: Thu Jun 9 16:42:01 2011 named_attribute: rewrite_context=local <==分析 named (DNS) 的特性來自本機 sender_fullname: root <==發信者的大名與 email sender: root recipient: root <==就是收件者囉! *** MESSAGE CONTENTS 9A85085519 *** <==底下則是信件的實際內容啊! To: root Subject: testing queue test *** HEADER EXTRACTED 9A85085519 *** *** MESSAGE FILE END 9A85085519 *** |
如此一來你就知道目前我們的 MTA 主機有多少未送出的信件,還有未送出信件的內容你也可以追蹤的到了! 很不錯,對吧!不過,如果你想要我們的 postfix 立刻嘗試將這些在佇列當中的信件寄出去,那又該如何是好? 你有幾個作法啦,可以重新啟動 postfix ,也可以透過 postfix 的動作來處理,例如:
[root@www ~]# /etc/init.d/postfix restart [root@www ~]# postfix flush |
鳥哥個人比較建議使用 postfix flush 囉!自行參考看看先! ^_^!接下來,讓我們先來處理一下收信的 MRA 伺服器, 搞定後再來處理用戶端的使用者介面吧!
因為整個 MTA 主要是透過 SMTP (port 25) 進行信件傳送的任務,因此,針對 postfix 來說,只要放行 port 25 即可呦! 修改一下 iptables.rule 吧!
[root@www ~]# vim /usr/local/virus/iptables/iptables.rule # 大約在 173 行左右,找到他,並且將它註解拿掉! iptables -A INPUT -p TCP -i $EXTIF --dport 25 --sport 1024:65534 -j ACCEPT [root@www ~]# /usr/local/virus/iptables/iptables.rule |
這樣就放行整個 Internet 對您伺服器的 port 25 的讀取囉!簡單!搞定!
除非你想要架設 webmail 在你的 MTA 上頭,否則,你的 MTA 收下了信件,你總得連上 MTA 去收信吧?那麼收信要用的是哪個通訊協定?
就是 22.1.4 裡面談到的 pop3 以及 imap 囉!這就是所謂的 MRA 伺服器!我們的 CentOS 5.x
使用的是 dovecot 這個軟體來達成 MRA 的相關通訊協定的!但由於 pop3/imap 還有資料加密的版本,底下我們就依據是否加密 (SSL)
來設定 dovecot 吧!
啟動單純的 pop3/imap 是很簡單的啦,你得要先確定已經安裝了 dovecot 這個軟體。而這個軟體的設定檔只有一個,就是 /etc/dovecot.conf 。我們僅要啟動 pop3/imap 而已,所以可以這樣設定即可:
[root@www ~]# yum install dovecot [root@www ~]# vim /etc/dovecot.conf # 找到底下這一行,大約是在第 20 行左右的地方,複製新增一行內容如下: #protocols = imap imaps pop3 pop3s protocols = imap pop3 |
改完之後你就可以啟動 dovecot 囉!並且檢查看看 port 110/143 (pop3/imap) 有沒有啟動啊?
[root@www ~]# /etc/init.d/dovecot start [root@www ~]# chkconfig dovecot on [root@www ~]# netstat -tlnp | grep dovecot Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 :::110 :::* LISTEN 2688/dovecot tcp 0 0 :::143 :::* LISTEN 2688/dovecot |
耶!搞定!這樣就可以提供使用者來收信件啦!真是不錯啊!不過記得喔,這裡只提供基本的明碼 pop3/imap 傳輸而已, 如果想要啟動其他如 pop3s (傳輸加密機制) 協定時,就得要額外的設定囉!
如果擔心資料在傳輸過程會被竊取,或者是你的登入資訊 (帳號與密碼) 在使用 pop3/imap 時會被竊聽, 那麼這個 pop3s/imaps 就顯的重要啦!與之前的 Apache 相似的,其實我們都是透過 openssl 這個軟體提供的 SSL 加密機制來進行資料的加密傳輸。方式很簡單呢!預設的情況下,CentOS 已經提供了 SSL 憑證範例檔給我們使用了。 如果你一點都不想要使用預設的憑證,那麼我們就來自己建一個吧!
# 1. 先到系統提供的 /etc/pki/tls/certs/ 目錄下去建立所需要的 pem 憑證檔: [root@www ~]# cd /etc/pki/tls/certs/ [root@www certs]# make vbirddovecot.pem ....(前面省略).... Country Name (2 letter code) [GB]:TW State or Province Name (full name) [Berkshire]:Taiwan Locality Name (eg, city) [Newbury]:Tainan Organization Name (eg, company) [My Company Ltd]:KSU Organizational Unit Name (eg, section) []:DIC Common Name (eg, your name or your server's hostname) []:www.centos.vbird Email Address []:dmtsai@www.centos.vbird # 2. 因為擔心 SELinux 的問題,所以建議將 pem 檔案放置到系統預設的目錄去較佳! [root@www certs]# mv vbirddovecot.pem ../../dovecot/ [root@www certs]# restorecon -Rv ../../dovecot # 3. 開始處理 dovecot.conf,只要 pop3s, imaps 不要明碼傳輸的咯! [root@www certs]# vim /etc/dovecot.conf protocols = imaps pop3s <==將剛剛這一行改成這樣!多個 s # 在 93 行左右,找到 ssl_cert_file 及 ssl_key_file 修改一下所需檔名: ssl_cert_file = /etc/pki/dovecot/vbirddovecot.pem <==憑證資料檔 ssl_key_file = /etc/pki/dovecot/vbirddovecot.pem <==私鑰資料檔 # 4. 重新啟動 dovecot 並且觀察 port 的變化: [root@www certs]# /etc/init.d/dovecot restart [root@www certs]# netstat -tlnp | grep dovecot Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 :::993 :::* LISTEN 3157/dovecot tcp 0 0 :::995 :::* LISTEN 3157/dovecot |
最終你看到的 993 是 imaps 而 995 則是 pop3s 囉!這樣一來,你收信的時候,輸入的帳號密碼就不會被竊聽了! 反正是加密後的資料囉!很簡單吧!
因為上面的練習中,我們將 pop3/imap 關閉,轉而打開 pop3s/imaps 了,因此防火牆啟動的埠口會不一樣! 請依據您實際的案例來設定你所需要的防火牆才好。我們這裡主要是開放 993, 995 兩個埠口呦! 處理的方法與 22.2.9 相當類似:
[root@www ~]# vim /usr/local/virus/iptables/iptables.rule # 大約在 180 行左右,新增底下兩行去! iptables -A INPUT -p TCP -i $EXTIF --dport 993 --sport 1024:65534 -j ACCEPT iptables -A INPUT -p TCP -i $EXTIF --dport 995 --sport 1024:65534 -j ACCEPT [root@www ~]# /usr/local/virus/iptables/iptables.rule |
如果你的 pop3/imap 還是決定不加密的話,請將上面的 993/995 改成 143/110 即可!
設定 Mail server 不是拿來好看的,當然是要好好的應用他囉!應用 mail server 有兩種主要的方式,你可以直接登入 Linux
主機來操作 MTA ,當然也可以透過用戶端的 MUA 軟體來收發信件,底下我們分別介紹這兩種方式囉!
在 Unix like 的作業系統當中都會存有一支可以進行收發信件的軟體,那就是『 mail 』這個指令。這個指令是由 mailx
這個軟體所提供的,所以您得要先安裝這個軟體才行。另外,由於 mail 是 Linux 系統的功能,所以即使你的 port 25
(smtp) 沒有啟動,他還是可以使用的,只是該封郵件就只會被放到佇列,而無法寄出去囉!^_^!底下我們來談一談最簡單的
mail 用法吧
mail 的用法很簡單,就是利用『 mail [email address] 』的方式來將信件寄出去, 那個 [email address] 可以是對外的郵件位址,也可以是本機的帳號。如果是本機帳號的話,可以直接加帳號名稱即可。 例如:『 mail root 』或『 mail somebody@his.host.name 』。如果是對外寄信的時候, 信件預設的『 Mail from 』就會填寫 main.cf 內那個 myorigin 變數的主機名稱囉! 先來試看看吧!寄給 dmtsai@www.centos.vbird 先:
[root@www ~]# mail dmtsai@www.centos.vbird Subject: Just test <==這裡填寫信件標題 This is a test email. <==底下為信件的內容! bye bye ! . <==注意,這一行只有小數點!代表結束輸入之意! Cc: <==密件副本啦! |
這樣就可以將信件寄出去了!另外,早期的 mail server 是可以接受 IP 寄信的,舉例來說:
mail dmtsai@[192.168.100.254] ,記得 IP 要用中括號包起來。不過由於受到垃圾郵件的影響,
現在這種方式幾乎都無法成功的將信件寄出了。
這可不是『附件夾帶』的方式!因為在 mail 這個程式裡面編輯信件是個很痛苦的差事, 你不能夠按上下左右鍵來回到剛剛編輯有錯誤的地方,很傷腦筋。此時我們可以透過標準輸入來處理! 如果你忘記『 < 』代表的意義,請回到基礎篇的第十一章 bash shell中的資料流重導向瞧瞧先!舉例來說你要將家目錄的 .bashrc 寄給別人,可以這樣做:
[root@www ~]# mail -s 'My bashrc' dmtsai < ~/.bashrc
|
寄信還比較簡單,那麼收信呢?同樣的收信還是使用 mail。直接在提示字元之後輸入 mail 時,會主動的捉取使用者在 /var/spool/mail 底下的郵件信箱 (mailbox),例如我 dmtsai 這個帳號在輸入 mail 後,就會將 /var/spool/mail/dmtsai 這個檔案的內容讀出來並顯示到螢幕上,結果如下:
# 注意喔!底下的身份使用的是 dmtsai 這個用戶來操作 mail 這個指令的呦! [dmtsai@www ~]$ mail Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/dmtsai": 14 messages 14 new <==信箱來源與新信件數 >N 1 dmtsai@www.centos.vb Tue Jun 7 16:08 16/614 "from vbird" ....(中間省略).... N 13 root@www.centos.vbir Mon Jun 13 17:11 15/493 "just test" N 14 root@www.centos.vbir Mon Jun 13 17:15 25/620 "My bashrc" & <==這個是 mail 軟體的提示字元,可以輸入 ? 來察看可用指令 |
在上面的畫面中,顯示 dmtsai 有一封信,且會附上該信件的發信者與標題及收信時間等。你可以用的指令有這些:
上面是簡易的 mail 收信功能!不過,如果離開 mail 時按下 q ,不是會有信件轉存到 ~/mbox 這個郵件信箱嗎?那麼我要如何讀取這個檔案內的信件資料呢?可以簡單的使用這個方式來讀取:
[dmtsai@www ~]$ mail -f ~/mbox
|
前面提到的都是信件的內容,那麼有沒有可能以『附件』的方式來傳遞檔案?是可以的,不過你需要 uuencode 這個指令的幫忙,在 CentOS 當中這個指令屬於 sharutils ,請先利用 yum 來安裝他吧!接下來你可以這樣使用:
[root@www ~]# [利用 uuencode 編碼 ] | [利用 mail 寄出去] [root@www ~]# uuencode [實際檔案] [信件中的檔名] | mail -s '標題' email # 1. 將 /etc/hosts 以附件夾帶的方式寄給 dmtsai [root@www ~]# uuencode /etc/hosts myhosts | mail -s 'test encode' dmtsai |
這樣就能寄出去了,不過,如果收下這封信件呢?同樣的我們得要透過解碼器來解碼啊! 你得先將該檔案存下來,然後這樣做:
# 底下的身份可是 dmtsai 這個用戶喔! [dmtsai@www ~]$ mail Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/dmtsai": 12 messages 1 new 12 unread U 1 root@www.centos.vbir Thu Jun 9 16:30 23/820 "testing" ....(中間省略).... U 10 root@www.centos.vbir Mon Jun 13 17:15 26/630 "My bashrc" U 11 dmtsai@www.centos.vb Mon Jun 13 17:28 16/491 "Re: just test" >N 12 root@www.centos.vbir Mon Jun 13 17:33 24/962 "test encode" & s 12 test_encode "test_encode" [New file] & exit [dmtsai@www ~]$ uudecode test_encode -o decode 加密檔 輸出檔 [dmtsai@www ~]$ ll *code* -rw-r--r-- 1 dmtsai dmtsai 356 6月 13 17:38 decode <==解碼後的正確資料 -rw-rw-r-- 1 dmtsai dmtsai 972 6月 13 17:36 test_encode <==內文會有亂碼 |
雖然 mail 這個指令不是挺好用的,不過至少他可以提供我們在 Linux 純文字模式下的一個簡單的收發信件功能! 不過,目前有個更棒的替代方案,那就是 mutt 這玩意兒囉!
mutt 除了可以模擬 mail 這個指令之外,他還能夠透過 pop3/imap 之類的協定去讀取外部的信件喔!所以這傢伙真的很不賴!
讓我們來玩玩 mutt 這個好物吧!
mutt 的功能也很多,我們先來看看 mutt 的基本語法好了,再來開始進行練習吧!
[root@www ~]# mutt [-a 附加檔] [-i 內文檔] [-b 秘密副本] [-c 一般副本] \ > [-s 信件標題] email位址 選項與參數: -a 附加檔:後面就是你想要傳送給朋友的檔案,是附加檔案,不是信件內容喔! -i 內文檔:就是信件的內文部分,先編寫成為檔案而已; -b 秘密副本:原收件者不知道這封信還會寄給後面的那個秘密副本收件者; -c 一般副本:原收件者會看到這封信還有傳給哪位收件者; -s 信件標題:這還需要解釋嗎?這封信的標頭! email位址:就是原收件者的 email 囉! # 1. 直接線上編寫信件,然後寄給 dmtsai@www.centos.vbird 這個用戶 [root@www ~]# mutt -s '一封測試信' dmtsai@www.centos.vbird /root/Mail 不存在。製造嗎? ([yes]/no): y <==第一次用才會出現這個訊息 To: dmtsai@www.centos.vbird Subject: 一封測試信 隨便寫寫!隨便看看~! <==會進入 vi 畫面編輯!很棒! y:寄出 q:中斷 t:To c:CC s:Subj a:附加檔案 d:敘述 ?:求助 <==按下 y 寄出 From: root <root@www.centos.vbird> To: dmtsai@www.centos.vbird Cc: Bcc: Subject: 一封測試信 Reply-To: Fcc: PGP: 清除 -- 附件 - I 1 /tmp/mutt-www-2784-0 [text/plain, 8bit, utf-8, 0.1K] # 2. 將 /etc/hosts 當成信件內容寄給 dmtsai@www.centos.vbird 這個用戶 [root@www ~]# mutt -s 'hosts' -i /etc/hosts dmtsai@www.centos.vbird |
與 mail 線上編寫文字不一樣,mutt 竟然會呼叫 vi 讓你去編輯你的信件!如此一來,當然不需要預先編寫信件內文了! 這真是讓人感到非常的開心啊!而且整個畫面非常的直覺化!相當容易處理呢!那麼如果需要附件夾帶呢?尤其是夾帶 binary program 時,可以這樣做:
# 1. 將 /usr/bin/passwd 當成附件夾帶,寄給 dmtsai@www.centos.vbird 用戶 [root@www ~]# mutt -s '附件' -a /usr/bin/passwd dmtsai@www.centos.vbird To: dmtsai@www.centos.vbird Subject: 附件 不過是個附件測試! y:寄出 q:中斷 t:To c:CC s:Subj a:附加檔案 d:敘述 ?:求助 <==按 y 送出 From: root <root@www.centos.vbird> To: dmtsai@www.centos.vbird Cc: Bcc: Subject: 附件 Reply-To: Fcc: PGP: 清除 -- 附件 - I 1 /tmp/mutt-www-2839-0 [text/plain, 8bit, utf-8, 0.1K] <==內文檔 A 2 /usr/bin/passwd [applica/octet-stre, base64, 22K] <==附加檔 |
看到上表中的附件底下那兩行嗎?I 代表的是直接附在信件內的內文,A 才是附加檔案!這樣看懂了嗎?
接下來就讓我們來讀讀信件囉!
與 mail 比較之下,mutt 可以直接透過網路的 pop3, imap 等通訊協定來讀信,是相當優秀的一個功能呦! 至少鳥哥覺得真好用!底下同樣的,先來瞧瞧可以使用的語法,然後再來看看一些練習。
[root@www ~]# mutt [-f 信箱位置] 選項與參數: -f 信箱位置:如果是 imaps 的信箱,可以這樣:『 -f imaps://伺服器的IP 』 # 1. 直接用 dmtsai 的身份讀取本機的信箱內容: [dmtsai@www ~]$ mutt q:離開 d:刪除 u:反刪除 s:儲存 m:信件 r:回覆 g:群組 ?:求助 ....(中間省略).... 17 N + Jun 20 root ( 1) 一封測試信 18 N Jun 20 SELinux_Trouble ( 145) [SELinux AVC Alert] SELinux 19 N + Jun 20 root ( 9) hosts 20 N Jun 20 SELinux_Trouble ( 145) [SELinux AVC Alert] SELinux 21 N Jun 20 SELinux_Trouble ( 145) [SELinux AVC Alert] SELinux 22 N + Jun 20 root ( 449) 附件 -Mutt: /var/spool/mail/dmtsai [Msgs:22 New:11 Old:11 188K]--(date/date)--(all)-- # 2. 在上面的信件 22 號內容反白後,直接按下 Enter 會出現如下畫面!: i:離開 -:上一頁 <Space>:下一頁 v:顯示附件。 d:刪除 r:回覆 j:下一個 ?:求助 X-Original-To: dmtsai@www.centos.vbird Delivered-To: dmtsai@www.centos.vbird Date: Mon, 20 Jun 2011 14:24:37 +0800 From: root <root@www.centos.vbird> To: dmtsai@www.centos.vbird Subject: 附件 User-Agent: Mutt/1.4.2.2i [-- 附件 #1 --] [-- 種類:textplain,編碼:8bit,大小:0.1K --] 不過是個附件測試! <==信件的內文部分 [-- 附件 #2: passwd --] <==說明信件的附件夾帶部分 [-- 種類:applicationoctet-stream,編碼:base64,大小:30K --] [-- application/octet-stream 尚未支援 (按 'v' 來顯示這部份) --] -- +- 22/22: root 附件 -- (all) # 3. 在上面畫面按下 v 後,會出現相關的附件資料: q:離開 s:儲存 |:管線 p:顯示 ?:求助 I 1 <no description> [text/plain, 8bit, utf-8, 0.1K] A 2 passwd [applica/octet-stre, base64, 30K] # 反白處按下 s 就能夠儲存附加檔案囉! |
最後離開時,一直按下 q ,然後參考出現的資訊來處理即可這就是本機信件的收信方式!非常簡單! 附加檔案的儲存方面也很容易,真是非常開心啊!那如果是外部信箱呢?舉例來說,我用 root 的身份去收 dmtsai 的 imaps 信件,會是怎樣的情況呢?
[root@www ~]# mutt -f imaps://www.centos.vbird q:離開 ?:求助 這個驗証屬於: www.centos.vbird 不清楚 KSU DIC Tainan 這個驗証的派發者: www.centos.vbird 不清楚 KSU DIC Tainan 這個驗証有效 由 Jun 13 07:11:07 2011 GMT 至 Jun 12 07:11:07 2012 GMT 指模:8A9B BA38 79C0 A8D2 DACE 2E39 1ECB 6255 -- Mutt: SSL 驗証測試 (1)不接受,(2)只是這次接受 <==這裡要填寫 2 才行! 用戶名在 www.centos.vbird:dmtsai dmtsai@www.centos.vbird 的密碼: |
最終在密碼設定正確後,你就會看到剛剛我們所看到的信件了!不過要注意的是,如果你的用戶家目錄在非正規目錄, 那麼可能會出現 SELinux 的錯誤,這時就得要重新修訂一下你的 SELinux 安全本文的類型囉! 如此一來,我們就直接以文字模式來取得網路郵件信箱!這實在是非常方便的一件事!只是沒有圖文並茂而已! ^_^
自由軟體最大的好處之一就是該軟體大多可以進行移植,也就是在任何作業系統上面幾乎都能夠執行該軟體的意思。 因此學習自由軟體的好處就是,你不必因為轉換作業系統而學習不同的操作環境!MUA 也有自由軟體!那就是 Mozilla 基金會推出的 ThunderBird (雷鳥) 這個好用的咚咚,你可以在底下的網址上面找到繁體中文的軟體:
有鑑於目前用戶端還是以 Windows 作業系統為大宗,所以底下的說明主要是在 Windows XP (sp3) 上頭的安裝與設定為主。雖然目前 (2011/06) 最新的 Thunderbird 已經出到 3.1.x 了,鳥哥以繁體中文的 3.1.10 為範例來介紹囉。下載完畢的安裝過程鳥哥省略了,因為一直下一步而已。鳥哥直接跳到第一次啟動 Thunderbird 的介紹,希望對大家有幫助呦!鳥哥是以 dmtsai@www.centos.vbird 這個帳號為範例來說明的呦!初次啟動會出現下圖:
由於是第一次啟動,所以 thunderbird 裡面沒有任何識別資料。此時你可以填寫你要在 email 上面讓人家看到的資料, 以及包括你登入遠端信箱的帳號密碼等資訊。上圖鳥哥的暱稱為『鳥哥哥』,而 Email 是要給收件者看到的,密碼當然就是自己的不外流~填完之後按下『繼續』吧!
由於剛剛圖 22.4-1 有輸入帳號與密碼資訊,因此,在這一個步驟中,Thunderbird 會主動的嘗試登入遠端信箱! 不過,好像會抓取錯誤的資訊的樣子。如果真的抓錯了,請修改箭頭 1 指的伺服器主機名,以及通訊協定的相關設定值, 按下『重新偵測』,確定捉到的資料是正確了,再按下『建立帳號』或『手動設定』即可!
你可以在手動設定的地方,點選伺服器設定項目,然後去查閱一下收信的伺服器設定是否正確?若正確的話,就按下確定吧!
如果一切都沒有問題,那麼 Thunderbird 在登入系統前,就會出現上圖的憑證資訊登錄!記錄下來即可! 之後就準備收、發信件囉!
如果一切成功順利,那麼你應該會看到如上的畫面了!回到剛剛我們查詢到的標題名為『附件』的郵件,查閱一下內容, 嘿嘿!你會看到內文與附件都是 OK 正常的啦!而且更開心的是,由於是 imaps 的通訊協定,因此 Thunderbird 的內容會與伺服器上面的 /var/spool/mail/dmtsai 這個信箱內容同步喔!不像 POP3 抓下來就刪除伺服器的信件! 真是好好用的軟體啊! ^_^
時至今日,郵件攻擊主要的問題已經不是病毒與木馬了,大多數的垃圾郵件多是釣魚以及色情廣告。 網路釣魚的問題在於使用者的莫名好奇心以及較糟糕的操作習慣,這部份很難處理。色情廣告則是防不勝防,你想出一個過濾機制, 他就使用另一個機制來丟你!用嚴格的過濾機制嗎?又可能將正常的信件抵擋掉,真是要命啊!所以,還是請用戶直接刪除比較好。 因此,在這一個小節當中,關於收信的過濾機制方面,鳥哥移除了前一版介紹的病毒掃瞄以及自動學習廣告機制了。 如果你還是有相關的需要,可能得要自行查查相關的官方網站囉!不好意思啦!
另外,底下主要針對 postfix 的郵件收下過濾處理,以及重新發送的 Relay 過程進行介紹。這兩個過程在 postfix 的設定中,主要有幾個重要的項目管理:
早期的廣告信很多都是藉由僵屍電腦 (已經被當作跳板但管理員卻沒有發現或沒有處理的主機) 來發送的, 這些僵屍電腦所發送的信件有個很明顯的特色,就是『他只會嘗試傳送該封電子郵件一次, 不論有無成功,該封信就算發出去了,故該信件將被移出佇列中。』 不過,合法的 mail server 運作流程就如 22.2.8 分析的一般,在郵件無法順利寄出時該郵件會暫時放置到佇列中一段時間, 並一直嘗試將信件寄出的動作,預設直到五天後若還是無法寄出才會將信件退回。
根據這個合法與非法的郵件伺服器運作流程而發展出一套所謂的曙光 (postgrey) 軟體, 你可以參考底下的幾個說明來瞭解這個軟體:
基本上 postgrey 主要的功能是在記錄發信來源而已,若發信來源同一封信第一次寄來時, postgrey 預設會抵擋他,並且將來源位址記錄起來,在約 5 分鐘後,若該信件又傳來一次時, 則該信件會被收下來。如此則可以杜絕非發郵件伺服器單次發送的問題喔! ^_^! 但對於你確定合法的主機則可以開放所謂的『白名單 (whitelist) 』來優先通過而不抵擋。 所以說,他主要是這樣進行的:(參考http://projects.puremagic.com/greylisting/whitepaper.html)
整個過程簡單的來說就是這樣而已。不過為了要快速的達成 postgrey 的『記錄』能力,所以資料庫系統又是不可避免的東西。 且 postgrey 是由 perl 寫成的,你可能也需要加入很多相依的 perl 模組才行。總的來說,你需要的軟體至少要有:
因為 CentOS 官方已經提供了一個連結可以找到所有的線上 yum 安裝方式,你可以參考:
鳥哥假設你已經下載了 http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm 這個軟體且放置到 /root 底下,然後這樣做:
[root@www ~]# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt [root@www ~]# rpm -ivh rpmforge-release-0.5.2-2.el5.rf.i386.rpm [root@www ~]# yum install postgrey |
上述的動作在進行數位簽章檔案的安裝、yum 設定檔的建置,以及最終將 postgrey 透過網路安裝起來而已!
整個流程簡單到不行呢!最重要的是,找到適合你的 yum 設定檔軟體來安裝就是了!
因為 postgrey 是額外的一個軟體,因此我們還是得要將它視為一個服務來啟動,同時 postgrey 是本機的 socket 服務而非網路服務,他只提供給本機的 postfix 來作為一個外掛,因此觀察的方式並不是觀察 TCP/UDP 之類的連線喔!底下讓我們來瞧瞧啟動與觀察的過程吧!
[root@www ~]# /etc/init.d/postgrey start [root@www ~]# chkconfig postgrey on [root@www ~]# netstat -anlp | grep postgrey Active UNIX domain sockets (servers and established) Proto RefCnt Type State PID/Program Path unix 2 STREAM LISTENING 2783/socket /var/spool/postfix/postgrey/socket |
上表中最重要的就是那個輸出的 path 項目啦!/var/spool/postfix/postgrey/socket 是用來做為程式之間的資料交換, 這也是我們的 postfix 要將信件交給 postgrey 處理的一個相當重要的介面!有了這個資料後,接下來我們才能夠開始修改 postfix 的 main.cf 囉!
[root@www ~]# vim /etc/postfix/main.cf # 1. 更改 postfix 的 main.cf 主設定檔資料: # 一般來說,smtpd_recipient_restrictions 得要手動加入才會更動預設值: smtpd_recipient_restrictions = permit_mynetworks, <==預設值,允許來自 mynetworks 設定值的來源 reject_unknown_sender_domain, <==拒絕不明的來源網域 (限制來源 MTA ) reject_unknown_recipient_domain, <==拒絕不明的收件者 (限制目標 MTA) reject_unauth_destination, <==預設值,拒絕不信任的目標 check_policy_service unix:/var/spool/postfix/postgrey/socket # 重點是最後面那一行!就是指定使用 unix socket 來連接到 postgrey 之意。 # 後續我們還有一些廣告信的抵擋機制,特別建議您將這個 postgrey 的設定值寫在最後, # 因為他可以算是我們最後一個檢驗的機制喔! # 2. 更改 postgrey 的抵擋秒數,建議將原本的 300 秒 (五分鐘) 改為 60 秒較佳: [root@www ~]# vim /etc/sysconfig/postgrey <==預設不存在,請手動建立 OPTIONS="--unix=/var/spool/postfix/postgrey/socket --delay=60" # 重點是 --delay 要抵擋幾秒鐘,預設值為 300 秒,我們這裡改為 60 秒等待。 [root@www ~]# /etc/init.d/postfix restart [root@www ~]# /etc/init.d/postgrey restart |
由於過往的經驗指出,等待 5 分鐘有時候會讓某些正常的 mail server 也會被拒絕好久,對於緊急的信件來說,這樣有點不妥。 因此,CentOS 官網也建議將這個數值改小一點,例如 60 秒即可。反正,不正常的信件第一次寄就會被拒絕, 等多久似乎也不是這麼重要了。然後,在 postfix 的設定中,預設值僅有允許本機設定 (permit_mynetworks) 以及拒絕非信任的目標 (reject_unauth_destination),鳥哥根據經驗,先加入拒絕寄件者 (MTA) 的不明網域以及拒絕收件者的不明網域的信件了, 這樣也能夠減少一堆不明的廣告信件。最終才加入 postgrey 的分析。
要注意的是,smtpd_recipient_restrictions 裡面的設定是有順序之分的!以上面的流程來說, 只要來自信任用戶,該封信件就會被收下會轉遞,然後不明的來源與目標會被拒絕,不受信任的目標也會被拒絕, 這些流程完畢之後,才開始正常信件的 postgrey 機制處理!這樣其實已經可以克服一堆廣告信了! 接下來,讓我們測試看看 postgrey 有沒有正常運作!請在外部寄一封信到本機來吧!然後查一下 /var/log/maillog 的內容看看:
Jun 21 15:26:28 www postfix/smtpd[3399]: NOQUEUE: reject: RCPT from client.centos.vbird[192.168.100.100]: 450 4.2.0 <dmtsai@www.centos.vbird>: Recipient address rejected: Greylisted, see http://postgrey.schweikert.ch/help/www.centos.vbird.html; from=<root@client.centos.vbird> to=<dmtsai@www.centos.vbird> proto=ESMTP helo=<client.centos.vbird> |
鳥哥事先取消 permit_mynetworks 之後才開始測試,測試完畢後又將 permit_mynetworks 加回來才好!這樣才能看到上述的資料。
這表示 postgrey 已經開始順利運作了!並且來源主機的相關記錄也已經記載在 /var/spool/postfix/postgrey/
目錄下囉!如此一來您的 postfix 將可以透過 postgrey 來擋掉一些莫名其妙的廣告信囉!
不過 postgrey 也是有缺點的,怎麼說呢?因為 postgrey 預設會先將信件退回去,所以你的信件就可能會發生延遲的問題, 延遲的時間可能是數分鐘到數小時,端看你的 MTA 設定而定。如果你想要讓『某些信任的郵件主機不需要經過 postgrey 的抵擋機制』時,就得要開放白名單囉!
白名單的開啟也很簡單啊,直接編寫 /etc/postfix/postgrey_whitelist_clients 這個檔案即可。 假設你要讓鳥哥的郵件伺服器可以自由的將信寄到你的 MTA 的話,那麼你可以在這個檔案內加入這一行:
[root@www ~]# vim /etc/postfix/postgrey_whitelist_clients mail.vbird.idv.tw www.centos.vbird # 將主機名稱寫進去吧! [root@www ~]# /etc/init.d/postgrey restart |
如果你還有更多信任的 MTA 伺服器的話,將他寫入這個檔案當中!那他就可以略過 postgrey 的分析囉! 更進階的用法就得要靠您自己去發掘囉! ^_^
還記得 22.1.5 講到的 Open Relay 的問題吧?你的 MTA 可千萬不能成為 Open Relay 的狀況,否則對你的網路與『信用』影響很大喔!一般來說,只要是 Open Relay 的郵件 MTA 都會被列入黑名單當中, 例如台灣地區的學術網路黑名單以及網際網路社會上提供的黑名單資料庫:
既然黑名單資料庫裡面的 mail server 本身就是有問題的郵件主機,那麼當黑名單裡面的主機想要跟我的 mail server 連線時,我當然可以『合理的懷疑該信件是有問題的!』您說是吧! 所以來自黑名單或者是要送至黑名單的信件最好是不要接受啦!
您當然可以自行前往該網站將有問題的主機列表給他加入自己的郵件主機抵擋機制當中, 不過就是不太人性化!既然網際網路社會已經提供了黑名單資料庫了,我們就可以利用這個資料庫來抵擋嘛! 在決定是否進行 Relay 之前,先要求我們的 postfix 前往追蹤黑名單的資料庫, 若目標的 IP 或主機名稱是黑名單的一員,則我們就將該信件拒絕囉!
Postfix 設定黑名單檢驗真的很簡單,你只要這樣做即可:
[root@www ~]# vim /etc/postfix/main.cf smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_destination, reject_rbl_client cbl.abuseat.org, reject_rbl_client bl.spamcop.net, reject_rbl_client cblless.anti-spam.org.cn, reject_rbl_client sbl-xbl.spamhaus.org, check_policy_service unix:/var/spool/postfix/postgrey/socket # 請注意整個設定值的順序才好!在 postgrey 之前先檢查是否為黑名單! smtpd_client_restrictions = check_client_access hash:/etc/postfix/access, reject_rbl_client cbl.abuseat.org, reject_rbl_client bl.spamcop.net, reject_rbl_client cblless.anti-spam.org.cn, reject_rbl_client sbl-xbl.spamhaus.org # 這個設定項目則是與用戶端有關的設定!拒絕用戶端本身就是黑名單的一員! smtpd_sender_restrictions = reject_non_fqdn_sender, reject_unknown_sender_domain # 此項目則在抵擋不明的送件者主機網域囉!與 DNS 有關係的哪! [root@www ~]# /etc/init.d/postfix restart |
上表當中的特殊字體部分『reject_rbl_client』是 postfix 內的一個設定項目,後面可以接網際網路上提供的黑名單!
您得要注意的是,這個黑名單資料庫可能會持續的變動,請您先以 dig 的方式檢查每個資料庫是否真的存在,
如果存在才加以設定在您的主機上頭啊!(因為網際網路上頭很多文獻所提供的黑名單資料庫似乎已經不再持續服務的樣子!)
既然黑名單資料庫所記錄的是不受歡迎的來源與目標 MTA ,那麼您的 MTA 當然最好不要在該資料庫中嘛! 同時這些資料庫通常也都有提供檢測的功能,所以你也可以用該功能來檢查你的主機是否『記錄有案』呢? 你可以這樣處理的:
總之您必須要確定你不在黑名單當中,且最好將黑名單的來源給拒絕掉!搞定! ^_^
在整封信的傳送流程當中,用戶端若通過主機的重重限制後,最終應該可以到達郵件佇列當中。 而由佇列當中要送出去或者是直接送到 mailbox 就得要透過 MDA 的處理。MDA 可以加掛很多機制呢! 尤其是他可以過濾某些特殊字眼的廣告信件或病毒信件呢! MDA 可以透過分析整封信件的內容 (包括標頭以及內文) 來擷取有問題的關鍵字,然後決定這封信的『命運』說!
咱們的 postfix 已經有內建可以分析標頭或者是內文的過濾機制了,那就是 /etc/postfix/ 目錄下的 header_checks 以及 body_checks 這兩個檔案啊!在預設的情況下這兩個檔案不會被 postfix 使用, 你必需要用底下的設定來啟用他:
[root@www ~]# vim /etc/postfix/main.cf header_checks = regexp:/etc/postfix/header_checks body_checks = regexp:/etc/postfix/body_checks # 那個 regexp 代表的是『使用正規表示法』的意思啦! [root@www ~]# touch /etc/postfix/header_checks [root@www ~]# touch /etc/postfix/body_checks [root@www ~]# /etc/init.d/postfix restart |
接下來你必需要自行處理 header_checks 以及 body_checks 的規則設定,在設定前請您確認『 你對於正規表示法是熟悉的 』才行!因為很多資訊都必需要透過正規表示法來處理啦!然後開始設定的依據是:
請注意,要使用兩個斜線『 / 』將規則包起來喔!舉個例子來說明:例如我想要 (1)抵擋掉標題為 A funny game 的信件,(2)並且在登錄檔裡面顯示 drop header deny,則可以在 header_chekcs 檔案中可以這樣寫:/規則/ 動作 顯示在登錄檔裡面的訊息
/^Subject:.*A funny game/ DISCARD drop header deny
鳥哥自己有作一些規則的比對,只不過.....效能不好!如果您有興趣的話,可以自行下載來看看, 不過,使用的後果請自行評估!因為每個人的環境都不一樣嘛!
記得,如果你自行修改過這兩個檔案後,務必要檢查一下語法才行!
[root@www ~]# postmap -q - regexp:/etc/postfix/body_checks \ > < /etc/postfix/body_checks |
如果沒有出現任何錯誤,那就表示您的設定值應該沒有問題啦!另外,你也可以使用 procmail 這個抵擋的小程式來處理。 不過,鳥哥覺得 procmail 在大型郵件主機當中,分析的過程太過於繁雜,會消耗很多 CPU 資源,因此後來都沒有使用這玩意兒了。
在圖 22.1-1 的流程當中,由 MUA 透過 MTA 來寄發信件時 (具有 Relay 的動作時),理論上 MTA 必需要開放信任用戶來源才行,這就是為啥我們必需要在 main.cf 裡頭設定 smtpd_recipient_restrictions 那個設定項目的原因了 (mynetworks)!不過人總有不方便的時候,舉例來說,如果你的用戶端使用的是撥接制的 ADSL 所以每次取得的 IP 都非固定,那如何讓你的用戶使用你的 MTA ?很麻煩是吧?這個時候 SMTP 認證或許有點幫助。
什麼是 SMTP 呢?就是讓你在想要使用 MTA 的 port 25 (SMTP 協定) 時,得要輸入帳號密碼才能夠使用的意思!既然有了這個認證的功能,於是乎,你就可以不用設定 MTA 的信任用戶項目!舉例來說,在本章提到的環境下,你可以不用設定 mynetworks 這個設定值啊!啟動 SMTP 認證,讓你的用戶需要輸入帳密才能 Relay 囉!那如何讓 SMTP 支援身份認證?咱們的 CentOS 已經有提供內建的認證模組,那就是 Cyrus SASL 這個軟體的幫忙啦!
Cyrus SASL (http://cyrusimap.web.cmu.edu/) 是 Cyrus Simple Authentication and Security Layer 的縮寫,他是一個輔助的軟體。在 SMTP 認證方面,Cyrus 主要提供了 saslauthd 這個服務來進行帳號密碼的比對動作!也就是說:當有任何人想要進行郵件轉遞功能時, Postfix 會聯絡 saslauthd 請其代為檢查帳號密碼,若比對通過則允許用戶端開始轉寄信件。
好了,如果你想要使用最簡單的方式,就是直接透過 Linux 自己的帳密來進行 SMTP 認證功能,而不使用其他如 SQL 資料庫的身份認證時,在 CentOS 當中你應該要這樣做:
如此一來用戶端才能夠啟動 SMTP AUTH 喔!關於軟體安裝方面,請使用 yum 直接安裝吧!不再多囉唆!底下我們由啟動
saslauthd 這個服務開始談起吧!
saslauthd 是 Cyrus-SASL 提供的一個帳號密碼管理機制,他能夠進行挺多的資料庫驗證功能, 不過這裡我們僅使用最單純簡單的明碼驗證 (PLAIN)!如果我們想要直接使用 Linux 系統上面的使用者資訊, 也就是 /etc/passwd, /etc/shadow 所記載的帳號密碼相關資訊時,可以使用 saslauthd 提供的『 shadow 』這個機制, 當然也能使用『 pam 』啦!更多的 saslauthd 連線至 MTA 的機制請『 man saslauthd 』來查閱吧。 由於我們的帳密可能來自網路其他類似 NIS 伺服器,因此這裡建議可以使用 pam 模組喔!
saslauthd 的啟動真是好簡單,首先你必需要選擇密碼管理機制,這個可以使用底下的方式處理:
# 1. 先瞭解你的 saslauthd 有支援哪些密碼管理機制: [root@www ~]# saslauthd -v saslauthd 2.1.22 authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap # 上列的特殊字體部分就是有支援的!我們要直接用 Linux 本機的使用者資訊, # 所以用 pam 即可,當然也能夠使用 shadow 啦。 # 2. 在 saslauthd 設定檔中,選定 pam 的驗證機制: [root@www ~]# vim /etc/sysconfig/saslauthd MECH=pam <==其實這也是預設值啊! # 這也是預設值,有的朋友喜歡單純的 shadow 機制,也可以啦! # 3. 那就啟動吧! [root@www ~]# /etc/init.d/saslauthd start [root@www ~]# chkconfig saslauthd on |
之後我們必需要告知 Cyrus 這個咚咚使用來提供 SMTP 服務的程序為 saslauthd 才行,設定的方法很簡單:
[root@www ~]# vim /usr/lib/sasl2/smtpd.conf log_level: 3 <==登錄檔資訊等級的設定,設定 3 即可 pwcheck_method: saslauthd <==就是選擇什麼服務來負責密碼的比對啊 mech_list: PLAIN LOGIN <==那麼支援的機制有哪些之意! |
我們可以使用 mech_list 列出特定支援的機制。而且 saslauthd
是個很簡單的帳號密碼管理服務,你幾乎不需要進行什麼額外的設定,直接啟動他就生效了!真是好方便! ^_^
那我們的 postfix 該如何處理呢?其實設定真的很簡單,只要這樣做就好了:
[root@www ~]# vi /etc/postfix/main.cf # 在本檔案最後面增加這些與 SASL 有關的設定資料: smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes # 然後找到跟 relay 有關的設定項目,增加一段允許 SMTP 認證的字樣: smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, <==重點在這裡!注意順序! reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_destination, reject_rbl_client cbl.abuseat.org, reject_rbl_client bl.spamcop.net, reject_rbl_client cblless.anti-spam.org.cn, reject_rbl_client sbl-xbl.spamhaus.org, check_policy_service unix:/var/spool/postfix/postgrey/socket [root@www ~]# /etc/init.d/postfix restart |
上面關於 SASL 的各個項目的意義是這樣的:
設定完畢也重新啟動 postfix 之後,我們先來測試看看是否真的提供認證了?
[root@www ~]# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. 220 www.centos.vbird ESMTP Postfix ehlo localhost 250-www.centos.vbird 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH LOGIN PLAIN <==你得要看到這兩行才行呦! 250-AUTH=LOGIN PLAIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN quit 221 2.0.0 Bye |
既然已經在 MTA 設定了 SMTP 身份驗證,那麼我們 MUA 當然要傳送帳號、密碼給 MTA 才能通過 SMTP 的驗證嘛! 所以,在 MUA 上面就得要加上一些額外的設定才行。我們依舊以 Thunderbird 來作為介紹,請打開 thunderbird,選擇『工具』-->『帳戶設定』後會出現如下畫面:
請依據上圖的箭頭號碼來指定,先選擇 (1)SMTP 寄件伺服器;,然後選擇所需要的寄件 SMTP 伺服器後,點選 (3)編輯, 就會出現上圖中的視窗項目。選擇 (4)沒有加密的驗證後,在 (5)填入你要使用的帳號即可。 如果要測試的話,記得此用戶端不要在區域網路內,否則將不會經過認證的階段,因為我們的設定以信任網域為優先嘛!
如果一切都順利的話,那麼當用戶端以 SMTP 來驗證時,你的登錄檔應該會出現類似底下的訊息才是:
[root@www ~]# tail -n 100 /var/log/maillog | grep PLAIN Jul 7 14:12:07 www postfix/smtpd[3069]: 1D44C85519: client=vbirdwinxp [192.168.100.1], sasl_method=PLAIN, sasl_username=dmtsai |
我們上面提到,如果你要架設一部合法的 MTA 最好還是得要申請固定的 IP 以及正確對應的反解比較恰當。 但如果你一定要用浮動 IP 來架設你的 MTA 的話,也不是不可以啦,尤其今年 (2011) 光纖到府已經可達 50M/5Mbps 的下載/上傳速度了!你當然可以用家庭網路來架站啊!只不過你就得要透過上層 ISP 所提供的 relay 權限囉!這是怎麼回事啊?讓我們來看看一個實際的案例:
當你的 MTA 要傳信件給目標 MTA 時,如果直接傳給目標 MTA,由於你的 IP 可能是非固定的,因此對方 MTA 恐怕會把你當成是垃圾來源!那如果我們可以透過 ISP 進行轉遞呢?從上面的圖示來看,當你要傳給目標 MTA 時: (1)先將信件交給妳的 ISP,因為你是 ISP 的客戶,通常來信都會被 ISP 接受,因此這個時候這封信就會被你的 ISP 給 relay 出去; (2)被 ISP 所 relay 的信件到目標 MTA 時,對方會判斷是來自那部 ISP 的 MTA,當然是合法的 mail server, 所以該封信件就毫無疑問的被收下囉! ^_^
不過想要以此架構來架設你的 MTA 仍有許多需要注意的地方:
尤其是最後一點,因為所有外送的信件全部都會被送到 ISP 處,所以像我們之前自己玩的 centos.vbird 這種非合法的領域資料就沒用了!為什麼呢?你想想看,如果你要將信件送給 www.centos.vbird, 但由於上述 relayhost 的功能,所以這封信會被傳到 ISP 的 MTA 來處理,但 ISP 的 MTA 會不會認識你的 centos.vbird?這樣說,可以理解了吧?
說是挺難的,做起來卻很簡單,只要在 main.cf 裡面加設一段資料即可。 假設你的環境是台灣地區的 hinet 所提供的用戶,而 hinet 提供的郵件主機為 ms1.hinet.net , 則你可以直接這樣設定:
[root@www ~]# vi /etc/postfix/main.cf # 加入底下這一行就對啦!注意那個中括號! relayhost = [ms1.hinet.net] [root@www ~]# /etc/init.d/postfix restart |
之後你只要嘗試寄一封信出去看看,就會瞭解這封信是如何寄送的了。看一下登錄檔的內容會像這樣:
[root@www ~]# tail -n 20 /var/log/maillog
Jul 7 14:27:42 www postfix/smtp[11649]: 9D2FA1058C: to=<qqtsai@mail.ksu.edu.tw>,
relay=ms1.hinet.net[168.95.4.10]:25, delay=1.4, delays=0.06/0.01/1.1/0.2, dsn=2.0.0,
status=sent (250 2.0.0 p676Rk0W011225 Message accepted for delivery)
|
是吧!經由上層 ISP 來轉寄啦!如此一來,你的 MTA 感覺上就似乎是部合法的 MTA 囉! 不過,可別利用這個權限來濫發廣告信啊!因為您所透過的那個 ISP 郵件主機可是有記錄你的 IP 來源, 如果你亂來的話,後果可是不堪設想喔!切記切記!
除了之前談到的幾個主要的設定之外, postfix 還有提供一些不錯的設定要給大家使用的喔!
我們可以一個一個來來看看:
在預設的情況下,postfix 可接受的單封信件最大容量為 10MBytes ,不過這個數值我們是可以更改的, 動作很簡單:
[root@www ~]# vim /etc/postfix/main.cf message_size_limit = 40000000 [root@www ~]# postfix reload |
上面的單位是 bytes,所以我將單封信件可接受大小改為 40MByte 的意思啦!請按照你的環境來規定這個數值。 而從前我們要管制 /var/spool/mail/account 大多是使用檔案系統內的 quota 來達成, 現在的 postfix 不需要啦!可以這樣做:
[root@www ~]# vim /etc/postfix/main.cf mailbox_size_limit = 1000000000 [root@www ~]# postfix reload |
我給每個人 1GB 的空間啊!^_^
收件備份我們知道可以使用 /etc/aliases 來處理的,但是如果想要送件也備份呢?利用底下的方式即可:
[root@www ~]# vim /etc/postfix/main.cf always_bcc = some@host.name [root@www ~]# postfix reload |
如此一來任何人寄出的信件都會複製一份給 some@host.name 那個信箱。不過,除非您的公司很重視一些商業機密,
並且已經公告過所有同仁,否則進行這個設定值,鳥哥個人認為侵犯隱私權很嚴重!
這部份我們以 Sendmail 官方網站的建議來說明喔!其實也適用於 postfix 的啦! 其中,大部分是在於『目錄與檔案權限』的設定要求上面:
不過整體的使用上還是需要身為網站管理員的您多費心!多多觀察登錄檔啊!
不管什麼時候,備份總是重要的!那麼如果我是單純的 Mail Server 而已,我需要的備份資料有哪些呢?
雖然 Mail 很方便,但是仍然會有無法將信件寄出的時候!如果您已經設定好 MTA 了,但是總是無法將郵件寄出去,那可能是什麼問題呢?你可以這樣追蹤看看: