OSWikiHK: 請協力 GPLv3 的中文翻譯工作。
Use virtual mailbox in Postfix
OSWikiHK,自由中文開源知識庫
目录 |
Postfix 的 virtual v.s. local Mailbox
當我們考慮如何處理入侵後的 Postfix 伺服器,(依我們的計劃,我們本打算把 Postfix 伺服器下的電郵分發,由系統使用者轉而使用虛擬的使用者來管理。)這時我們需要特別兩個在 Postfix 下十分基本的概念 virtual 和 local 。而且我們還需要嚴加分別才能把順利地完成我們系統帳號的升級工作。
Postfix 下的 local 和 virtual
Postfix 是由不同的組件所構成的。這種結構我們最早是在 qmail 上發展的!這一種把電郵分開不同的組件, 它的好處在於使到不同的組件本身能更仔細的作出設定也能獨立發揮各自所長而使到系統更安全和資源分配更優良。 這有助電郵伺服器有更安全的表現! 但是我們要留意的就是他們在分工上各自的表現和當中工作上的分工和設定。這加深了設定上的難度, 當然如果你沒有特別地分開理解它的話, Postfix 仍是最容易設定的電郵伺服器。
今次最影響客戶端升級的計劃的,在於 local 和 virtual 的分工上。 因為如果客戶端的伺服器使用系統使用者帳號的話, Postfix 會使用 local 作信件的分發。 而如果 Postfix 是使用虛擬信箱來發送信件的話,它就會使用 virtual 作信件的分發。
其實就是因為這是兩個完全不同的程式,所以在設定上也有完全不同的考慮因素。
- local
- 這是支援 alias 和 dot-forward 這兩個很重要的設定參數。
- virtual
- 當然它並沒有 alias 的設定,換來的就是virtual_alias。其實 virtual_alias 和 alias 是兩個完全不同的設定參數。但是卻可以做基(幾)乎相同的事情。
在升級伺服器時我們所遇上的問題
在升級客戶的伺服器電郵伺服器時,我們最大的設計其實並不在於電郵的接收伺服器上, 也不是 smtpd auth 上。而是在 MTA 的電郵分發上。除了是因為 virtual 和 local 是兩個完全不同的管理概念, 也是因為客戶端從前管理電郵的時候,我們會考慮把電郵分發到不同的系統使用者。而在 virtual 的管理中, 我們要考慮的就是把信件分發到不同的電郵信箱。
讓我們看看客戶端的電郵伺服器之 設定檔案中有關 virtual 部份。
以下是 main.cf 內的內容:
myhostname = samba.hk mydestination = virtual_mailbox_base = /var/spool/vmail virtual_mailbox_domains = samba.hk virtual_gid_maps = static:65533 virtual_uid_maps = static:65533 virtual_mailbox_limit = 0 virtual_mailbox_maps = hash:/etc/postfix/vmailbox virtual_alias_maps = hash:/etc/postfix/virtualalias
這裡我們先選擇了兩個 domain , 它們都是在 Postfix 電郵伺服器下負責兩樣不同的工作。
- samba.hk
- 是負責虛擬信箱的 domain ,客戶端亦直接從這個 domain 下收取信件。
其實這需然是一個 Postfix 標準的 virtual_mailbox 的設定檔。 但是你要留意的就是在這裡的
當我們在系統下寄信給一個系統使用者
當我們替客戶升級他們電郵系統的時候,我們首先遇到的就是一個大檔案,而這個大檔案就是 virtualalisa 檔案。(客戶有一個很典型的習慣,就是客戶伺服器內所收取不同 domain 的電郵,都會列在 virtualalisa 中並指向某一系統使用者,當然這系統使用者並沒有完整的 domain 部份,他們有的只是一個系統帳號。)
因此這就引申了一個重要的問題:就是如果在系統中寄信給一個使用者的, 我們怎樣把它分發到 Postfix 的 virtual_mailbox 下。 其實如果你仔細地數一數的話,你可以有三種方法來完成這事的。
- 修改 virtualaliase
- 直接修改 virtualalias 檔案,使電郵最後並不是發送到某一使用者帳號,而是發送到某一的電子郵件信箱。但是這卻是十分多工夫的。另外也會直接影響到系統管理者的工作習慣。
- 修改 alias 資料
- 修改 alias_maps 和 alias_database 中的資料
例如加入這樣的一行:
frankie: frankie@localhost.localdomain
使到 Postfix 作電郵本地分發的的時候,看見 alias 資料。 再把電郵發送到 frankie@localhost.localdomain 下。 但是這樣的分發是需要先把電郵分發的工作先交給 local , 然後從 local 的發送中再轉交給 virtual 。
這方面的資料我們可能從 /var/log/mail.log 中分析得知。:
postfix/qmgr[1270]: 89FA41323A: from=<root@samba.hk>, size=419, nrcpt=1 (queue active) postfix/local[1276]: 8869F1323B: to=<frankie@samba.hk>, orig_to=<frankie>, relay=local, delay=0, status=sent (forwarded as 89FA41323A) postfix/qmgr[1270]: 8869F1323B: removed postfix/virtual[1285]: B616013236: to=<frankie@localhost.localdomain>, orig_to=<frankie>, relay=virtual, delay=61, status=sent (delivered to maildir) postfix/qmgr[1270]: B616013236: removed
你可以看見電郵是由 root@samba.hk 發出。而信件寄給 frankie@samba.hk 。另外你會看見電郵最後也寄到 frankie@localhost.localdomain ,而使用 virtual 來分發。 你可以在這個 log 資料中找到 relay 的關鍵字,這關鍵字表示使用什麼方式來分發電郵。
當然這樣的修改會使得發送的過程中多了一些手續,但是好處就是容易理解和管理。
- 修改 virtual_alias_maps
- 其實還有第三種方法的,就是修改 virtual_alias_maps
中的資料,在這資料中加入如下的一行。
資料如下:
frankie@samba.hk frankie@localhost.localdomain
這樣你當你再寄信給 frankie 的時候,你會在系統的 log 中找到這樣的信息。
信息如下:
postfix/pickup[1269]: 0366613236: uid=0 from=<root> postfix/cleanup[1329]: 0366613236: message-id=<20050528070137.0366613236@samba.hk> postfix/qmgr[1270]: 0366613236: from=<root@samba.hk>, size=288, nrcpt=1 (queue active) postfix/virtual[1330]: 0366613236: to=<frankie@localhost.localdomain>, orig_to=<frankie>, relay=virtual, delay=1, status=sent (delivered to maildir) postfix/qmgr[1270]: 0366613236: removed
你會發現電郵直接發送到使用者的 Maildir/ 下了。 而且這裡並沒有如修改 alias 中那麼多的發送手續,當然發放的速度會更快。
為何系統使用者的帳號是 frankie@samba.hk
我想很多管理者也攪不懂為什麼系統使用者 frankie 的電郵地址是 frankie@samba.hk ,這是因為在 local 程式執行前, Postfix 會先使用 virtual 的來處理郵件。 而 virtual 在看待沒有 domain 部份的電郵地址,會把它加入 domain 的部份。而 domain 的部份就是 myhostname 這個參數的設定。
因此如果在系統中分發電郵給 frankie ,那電郵在 virtual 的程式中就會把它看作是分發給 frankie@samba.hk 的,(如果在你的 postfix 下的 myhostname 的設定是 samba.hk 的話。)
所以在 virtual_alias_maps 中加入所言的那一行,就會把電郵寄到 frankie@localhost.localdomain 這個虛擬使用者信箱內。
而過程中並不會經 local 來處理信件,那發信過程也會加快。
其實最好的方法是使用 virtual_mailbox_domains 中直接處理 samba.hk 的電郵信箱
這是最好的方法。
virtual_mailbox_maps 的資料如下。:
frankie@samba.hk frankie/
這事實上也可以達到我們希望的效果。 我們再看看
/var/log/mail.log 的內容。:
postfix/pickup[1479]: 32C7813237: uid=0 from=<root> postfix/cleanup[1487]: 32C7813237: message-id=<20050528071950.32C7813237@samba.hk> postfix/qmgr[1480]: 32C7813237: from=<root@samba.hk>, size=271, nrcpt=1 (queue active) postfix/virtual[1489]: 32C7813237: to=<frankie@samba.hk>, orig_to=<frankie>, relay=virtual, delay=0, status=sent (delivered to maildir) postfix/qmgr[1480]: 32C7813237: removed
這方法就不需要多設定 alias_maps 和 virtual_alias_maps 檔案了。 看似是簡單了更多。
刪除電郵使用者的問題
不過這方面也遇上了一個問題,就是怎樣在電郵系統下定義刪除一個使用者。 當然要刪除使用者對 imapd 的權限並不難,因為你可以輕易地在 passwd-imap 中刪除了使用的那一行。就可以把使用者的 imapd 權限刪除!
另外你也可能在想如果在 vmailbox 檔案下也 可以直接地把有關使用者電郵信箱分發的那一行刪除。不就可以完全地把使用者刪除嗎?! 當然如果使用者只是這樣簡單就沒有問題。
但是如果系統管理者遇上了一些電郵地址是以 Forward 電郵到不同的電郵信箱的話, 那確實會遇上一些問題。
所以如果你為要特別考慮帳號的刪除問題,使用修改 virtual_alias_maps 把 系統電郵分發到 localhost.localdomain 的網域的話,管理者會比較容易地刪除帳號! 因為他只需要修改 virtual_alias_maps 的檔案就可以修改或刪除電郵分發的問題。
另外我們也要留意一件事,就是我們的電郵如果並不是經一次的發送, 而是要經多次發送的。所以事實上我們還是要修改 virtaul_alias_maps 以達到我們所期望的結果。

