五、Postfix虛擬域名主機

這篇文檔的目的
這篇文檔要求postfix 2.0及以後的版本
這篇文檔總述了:postfix怎樣承載多個internet域;一些域是郵件傳遞的最終目的域,另一些域是出於轉發目的地域。
這篇文檔不僅描述了postfix內建的傳輸機制,而且給出了使用非postfix郵件傳遞軟件的建議。
這篇文檔涉及以下主題:
權威域對宿主域對其他域
本地文件對網絡數據庫
共享域,Unix系統賬號
postfix虛擬別名示例:獨立域,unix系統賬號
postfix虛擬郵箱示例:獨立域,非unix賬號
非postfix郵箱存儲:獨立域,非unix賬號
郵件轉發域
郵件列表
自動回覆
權威域對宿主域對其他域
大部分的postfix系統都是域的最後目的地。這些域包括了postfix主機的FQDN和IP地址,有時也包括了主機名的父域。這篇文檔接下來的部分將把這些域看作是權威域(即權威域是postfix主機名的域,如:postfix的FQDN爲mail.linux.com,那麼linux.com就是這臺postfix的權威域)。
除了權威域,postfix可以被配置爲非權威的額外域的最後目的地。這些域叫做宿主域,因爲他們與postfix主機名無關。宿主域一般與虛擬別名域或虛擬郵箱域爲同一類,具體的定義參見ADDRESS_CLASS_README文件。
postfix還可以被配置爲其他域的備份mx主機。在這種情況下,postfix不是這些域的最後目的地。當postfix主mx主機down機時,它接收郵件放在隊列中。這個功能與中繼域地址類別相同,具體定義在ADDRESS_CLASS_README文件中。
最後,postfix被配置爲傳遞主機,它把郵件傳遞到internet上。很明顯,postfix不是這些郵件的最後目的地。這個功能僅對授權的客戶端和用戶生效;它與默認域地址類別相同,具體定義在ADDRESS_CLASS_README文件中。
本地文件對網絡數據庫
這裏的示例使用了本地文件的表查詢,如:DBM或Berkeley DB。用postmap命令很容易調試:
示例:
postmap -q [email protected] hash:/etc/postfix/virtual
用數據庫來代替本地文件,參見LDAP_README, MYSQL_README 和 PGSQL_README 。強烈建議讀者在先把本地文件調試正常後,在遷移到網絡數據庫上。使用postmap命令查詢網絡數據庫的查詢結果是否與本地文件查詢結果一致。
示例:
 postmap -q [email protected] ldap:/etc/postfix/virtual.cf
共享域,unix系統帳戶
宿主額外域最簡單的方法是:把域名添加到postfix的mydestination參數中去,然後把用戶名添加到unix密碼文件中去。
權威域與宿主域之間沒有區別。用戶能接收沒有域的郵件。
在下面的例子中,我用example.com作爲這臺postfix的宿主域。
/etc/postfix/main.cf:
    mydestination = $myhostname localhost.$mydomain ... example.com
 
這個方法的缺陷是:
發送給[email protected]的郵件也會傳遞給[email protected]
用戶存放在unix密碼文件中,大量用戶的維護將變得困難。
下面的例子對這兩個缺陷提供瞭解決方法。
postfix虛擬別名示例:獨立域,unix系統賬號
使用這部分描述的方法,每一個宿主域有它自己的郵件地址。但是,它仍然使用系統帳戶進行本地郵箱投遞。
使用虛擬別名與,每一個宿主郵件地址的別名爲一個本地unix系統帳戶,或者爲一個遠程的郵件地址。下面的例子顯示了example.com怎樣使用這種機制。
 1 /etc/postfix/main.cf:
 2     virtual_alias_domains = example.com ...other hosted domains...
 3     virtual_alias_maps = hash:/etc/postfix/virtual
 4
 5 /etc/postfix/virtual:
 6     [email protected] postmaster
 7     [email protected]       joe
 8     [email protected]      jane
 9     # Uncomment entry below to implement a catch-all address
10     # @example.com         jim
11     ...virtual aliases for more domains...
注意:
第2行:virtual_alias_domains設置告訴postfix:example.com是一個虛擬別名域。如果你省略了這個設置,postfix會拒收郵件(中繼訪問被拒絕),或者無法投遞郵件(發給example.com的郵件產生死循環)
不要把虛擬別名域寫入mydestination參數中去。
第3-8行:/etc/postfix/virtual文件包含了虛擬別名。上面的這個示例,發給[email protected]的郵件會轉發給本地的postmaster,而發給[email protected]的郵件會轉發給joe系統帳戶。
第10行:一個全部的(catch-all)虛擬別名接收在虛擬別名文件中example.com沒有列出的地址的郵件。這存在一定的風險。垃圾郵件製造者可能給可能的用戶名發郵件,所以,一個所有的(catch-all)郵箱可能會接收到許多垃圾郵件。許多垃圾郵件的反彈郵件是以[email protected]發送的。
在改變了virtual的內容後,執行"postmap /etc/postfix/virtual"命令,然後用"postfix reload"重載main.cf文件
注意:虛擬別名既可以解析爲一個本地地址,也可以解析爲一個遠程地址。他們不需要一定解析到本地的unix系統帳戶上
更多關於虛擬別名文件的信息參見virtual(5)手冊。
虛擬別名解決了一個問題:它允許每一個域有它自己的郵件地址。但是,仍然有一個缺陷:每一個虛擬地址都會映射到unix系統帳戶上。隨着虛擬地址的增加,unix系統賬號也會相應的增長。接下來的部分將解決這個問題。
postfix虛擬郵箱示例:獨立域,非unix帳戶
隨着域和用戶的增長,unix/linux系統不可能給每一個用戶分配一個系統帳戶。
通過postfix的virtual(8)郵箱投遞代理,每一個接收者地址都能有它自己的虛擬郵箱。不想虛擬別名域,虛擬郵箱域不需要把每一個接收者地址笨拙的轉換爲一個系統帳戶地址。
postfix的virtual(8)郵箱傳遞代理通過接收者的郵箱地址查詢存放用戶信息的表,找到用戶的郵箱路徑名,uid和gid。maildir方式的傳遞是在郵箱路徑名的結尾加上個"/"。
如果你感覺多個表比較煩,可以把這些信息存放到sql數據庫中去。這個可以參見本文前面的"本地文件對數據庫"
這兒有個虛擬郵箱域"example.com"的示例:
 1 /etc/postfix/main.cf:
 2     virtual_mailbox_domains = example.com ...more domains...
 3     virtual_mailbox_base = /var/mail/vhosts
 4     virtual_mailbox_maps = hash:/etc/postfix/vmailbox
 5     virtual_minimum_uid = 100
 6     virtual_uid_maps = static:5000
 7     virtual_gid_maps = static:5000
 8     virtual_alias_maps = hash:/etc/postfix/virtual
 9
10 /etc/postfix/vmailbox:
11     [email protected]    example.com/info
12     [email protected]   example.com/sales/
13     # Comment out the entry below to implement a catch-all.
14     # @example.com      example.com/catchall
15     ...virtual mailboxes for more domains...
16
17 /etc/postfix/virtual:
18     [email protected] postmaster
注意:
第2行:virtual_mailbox_domains設置告訴postfix:postfix是虛擬郵箱域。如果你忘了這個設置,postfix將會拒絕郵件(中繼訪問也拒絕),或者無法傳遞(發給example.com的郵件產生自循環)
不要把虛擬郵箱域名列在mydestination參數值中!
不要把虛擬郵箱域名列在virtual_alias_domains的參數值中!
第3行:virtual_mailbox_base參數爲所有的虛擬郵箱路徑指定了一個共同的前綴。這是一個安全的機制,以免某些人做錯。這可以阻止郵件被傳遞到所有的文件系統上。
第4,10-15行:virtual_maibox_maps參數指定了用mailbox(或者maildir)路徑名的查詢表,它通過vuni郵件地址進行索引。在下面的這個示例中,發給[email protected]的郵件將會被放到/var/mail/vhost/example.com/info,而發給[email protected]的郵件將會被放在/var/mail/vhosts/exampe.com/sales/目錄下。
第5行:virtual_minimum_uid爲mailbox/maildir所有者的UID指定了一個最小值。這是一個安全機制,以免出錯。這阻止郵件寫到敏感的文件中去。
第6,7行:virtual_uid_maps和virtual_gid_maps參數指定了所有虛擬郵箱的所有者的uid和gid的值爲5000。如果你不希望uid和gid是固定值,可以指定一個查詢表。
第14行:該註釋項顯示瞭如何使用所有的(catch-all)虛擬郵箱地址。它被用戶接受垃圾郵件,也用於以[email protected]的名義發送垃圾郵件的反彈郵件。
不要把虛擬郵箱通配符放到虛擬別名文件中去!!
第8,17,18行:這可能是虛擬別名與虛擬郵箱的混合使用。我盟使用這個功能把發給example.com的postmaster的郵件轉發到本地的postmaster。你能使用同樣的機制轉發一個地址到遠程地址上去。
第18行:這個示例假設:main.cf中的$myorigin值列在了mydestination參數設置中。如果不是這種情形,請在虛擬別名表的右邊明確的指定一個域名,否則郵件將會被投遞到錯誤的域中。
當virtual文件的內容改變後,執行"postmap /etc/postfix/virtual"命令。當改變了vmailbox文件的內容,執行"postmap /etc/postfix/vmailbox"命令。當改變了main.cf的內容,執行"postfix reload"命令。
注意:郵件投遞是以virtual_uid_maps和virtual_gid_maps中指定的接收者uid/gid身份進行的。postfix 2.0以前的版本無法在可寫的父目錄中創建maildir;你必須在使用前先創建這些目錄。postfix在父目錄可寫的情況下可以自己創建mailbox,但事先創建文件更安全點。
關於虛擬郵箱投遞代理的更詳細的信息,參見virtual(8)手冊。
非postfix郵箱存儲:獨立域,非unix帳戶
這是在postfix虛擬郵箱基礎上的進一步改進。每一個宿主郵箱地址有它自己獨立的郵箱。
當非postfix軟件用於最後的投遞時,仍需要一些postfix概念以便郵件順利發送。
這部分的內容描述了:從postfix的角度,這應該是什麼樣的。關於cyrus/courier的maildrop的信息,參見CYRUS_README 或者 MAILDROP_README
下面是宿主域example.com投遞郵件給非postfix投遞代理的示例:
 1 /etc/postfix/main.cf:
 2     virtual_transport = ...see below...
 3     virtual_mailbox_domains = example.com ...more domains...
 4     virtual_mailbox_maps = hash:/etc/postfix/vmailbox
 5     virtual_alias_maps = hash:/etc/postfix/virtual
 6
 7 /etc/postfix/vmailbox:
 8     [email protected]    whatever
 9     [email protected]   whatever
10     # Comment out the entry below to implement a catch-all.
11     # Configure the mailbox store to accept all addresses.
12     # @example.com      whatever
13     ...virtual mailboxes for more domains...
14
15 /etc/postfix/virtual:
16     [email protected] postmaster
注意:
第2行:爲了投遞給宿主域的非postfix郵箱存儲,virtual_tranport參數需要指定一個postfix的LMTP客戶端,或者通過管道投遞代理執行非postfix軟件。下面是典型的示例(僅使用一個就可以了):
virtual_transport = lmtp:unix:/path/name (uses UNIX-domain socket)
virtual_transport = lmtp:hostname:port   (uses TCP socket)
virtual_transport = maildrop:            (uses pipe(8) to command)
postfix已經做好支持LMTP的準備了。maildrop投遞方法的示例已經定義在了默認的master.cf文件中了,更詳細的內容參見MAILDROP_README文檔。
第3行:virtual_mailbox_domains設置告訴postfix:example.com通過virtual_transport來投遞郵件。如果你忘了virtual_mailbox_domains參數的設置,postfix將拒收郵件,或者無法傳遞郵件。
不要把虛擬郵箱的域名列在mydestination中!
不要把虛擬郵箱的域名列在虛擬別名與中!
第4,7-13行:virtual_mailbox_maps參數指定了包含所有有效接收者地址的查詢表。查詢結果只被postfix忽略。在上面的例子中,[email protected][email protected]列在了有效地址中;其他給example.com的郵件都被postfix的smtp服務器用"未知的用戶"所拒絕。這是留給非postfix投遞代理用以拒絕本地提交的不存在接收者。如果你準備用LDAP,MySQL或者PgSQL來代替本地文件,請了解本文檔的"本地文件對數據庫"的內容。
第12行:這個註釋項顯示了怎樣讓postfix知道所有的有效郵件地址。擦汗訊結果會被postfix忽略
不要把虛擬郵箱通配符放在虛擬別名文件中!!
注意:如果你在virtual_mailbox_maps中指定了通配符,那麼你需要配置非postfix郵箱存儲來接收那個域的任何郵件。
第5,15,16行:同時使用虛擬別名與虛擬郵箱是可能的。我們使用這個功能把[email protected]重定向到本地的postmaster中。你也可以使用同樣的機制重定向郵件到本地或遠程箱
第16行:這個示例假設:main.cf中的$myorigin值列在了mydestination參數設置中。如果不是這種情形,請在虛擬別名表的右邊明確的指定一個域名,否則郵件將會被投遞到錯誤的域中。
當virtual文件的內容改變後,執行"postmap /etc/postfix/virtual"命令。當改變了vmailbox文件的內容,執行"postmap /etc/postfix/vmailbox"命令。當改變了main.cf的內容,執行"postfix reload"命令。
郵件轉發域
一些宿主域沒有或者只有部分本地郵箱。這些域的目的是把郵件轉發到其他其他。下面的示例展示瞭如何安裝example.com作爲郵件轉發域:
 1 /etc/postfix/main.cf:
 2     virtual_alias_domains = example.com ...other hosted domains...
 3     virtual_alias_maps = hash:/etc/postfix/virtual
 4
 5 /etc/postfix/virtual:
 6     [email protected] postmaster
 7     [email protected]        joe@somewhere
 8     [email protected]       jane@somewhere-else
 9     # Uncomment entry below to implement a catch-all address
10     # @example.com         jim@yet-another-site
11     ...virtual aliases for more domains...
Notes:
第2行:virtual_alias_domains設置告訴postfix:example.com是虛擬別名域。如果你忘記這個設置,postfix將拒收郵件,或者無法投遞郵件。
不要把虛擬別名的域名列在mydestination中!
第3-11行:/etc/postfix/virtual文件包含了虛擬別名。在上面的示例中,發給[email protected]的郵件會轉發到本地的postmaster中去,而發給[email protected]的郵件轉發到遠程的郵件地址--joe@somewhere;發送給[email protected]的郵件被轉發到jane@somewhere郵箱。發送給example.com的其他郵件都會被postfix以"未知用戶"而拒絕
第10行:註釋項顯示了jim@yet-another-site郵箱接收所有發給在example.com域中不存在的郵箱地址。這存在一定的風險。現在的垃圾郵件發送者嘗試非可能存在的用戶名發送郵件。catch-all郵箱可能接收許多垃圾郵件,許多垃圾郵件的反彈郵件會以[email protected]的名義發送。
當virtual的文件內容改變時,執行"postmap /etc/postfix/virtual"命令。當main.cf的文件改變時,執行"postfix reload"命令。
更多關於虛擬別名文件的信息參見virtual(5)手冊。
郵件列表
前面的一些示例已經展現瞭如何把虛擬域的postmaster郵件轉發到本地postmaster中去。你能用同樣的方法把任何一個地址的郵件轉發本地或遠程地址
這裏有一個重要的限制:虛擬別名和虛擬郵箱不能直接傳遞郵件列表管理器,如:majordomo。這個限制的解決辦法是安裝一個虛擬別名--通過它把虛擬地址導向本地傳輸代理:
/etc/postfix/main.cf:
    virtual_alias_maps = hash:/etc/postfix/virtual
/etc/postfix/virtual:
    [email protected] listname-request
    [email protected]         listname
    [email protected]   owner-listname
/etc/aliases:
    listname: "|/some/where/majordomo/wrapper ..."
    owner-listname: ...
    listname-request: ...
T
這個示例假設:main.cf中的$myorigin值列在了mydestination參數設置中。如果不是這種情形,請在虛擬別名表的右邊明確的指定一個域名,否則郵件將會被投遞到錯誤的域中。
更多關於postfix的本地投遞代理信息,參見local(8)手冊。
爲什麼這個示例使用一個複雜的虛擬別名來代替間接地傳輸映射呢?這個理由是:發送給虛擬郵件列表的郵件會以"不存在的用戶"原因而被拒絕。爲了確保傳輸映射的正常工作,postfix需要很多虛擬別名表或者虛擬郵箱表
在虛擬別名域的情形中,需要有一個從每一個郵件列表地址到自身的身份映射
在虛擬郵箱域的情形中,對每個郵件列表地址需要有個假的郵箱。
自動回覆
爲了給虛擬接收者配置一個自動回覆,到虛擬別名表中設置一個規則:
/etc/postfix/main.cf:
    virtual_alias_maps = hash:/etc/postfix/virtual
傳遞郵件給接收者,同時發送一份郵件的副本給產生自動回覆郵件的郵件地址。這個地址可以工作在不同的計算機上,或者通過配置一個傳遞映射項服務於本地系統--這個傳輸映射項把所有發給autoreply.mydomain.tld的郵件傳遞給一個自動回覆的腳本。
不要把autoreply.mydomain.tld列在mydestination中!
/etc/postfix/main.cf:
    transport_maps = hash:/etc/postfix/transport
/etc/postfix/transport:
    autoreply.mydomain.tld  autoreply:
/etc/postfix/master.cf:
    # =============================================================
    # service type  private unpriv  chroot  wakeup  maxproc command
    #               (yes)   (yes)   (yes)   (never) (100)
    # =============================================================
    autoreply unix  -       n       n       -       -       pipe
        flags= user=nobody argv=/path/to/autoreply $sender $mailbox
這個是用發送者地址和the [email protected]的接收者地址來調用/path/to/autoreply
更詳細的信息查看pipe(8)手冊,這內容在master.cf文件中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章