5、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 info@example.com hash:/etc/postfix/virtual
用數據庫來代替本地文件,參見LDAP_README, MYSQL_README 和 PGSQL_README 。強烈建議讀者在先把本地文件調試正常後,在遷移到網絡數據庫上。使用postmap命令查詢網絡數據庫的查詢結果是否與本地文件查詢結果一致。
示例:
 postmap -q info@example.com ldap:/etc/postfix/virtual.cf
共享域,unix系統賬戶
宿主額外域最簡單的方法是:把域名添加到postfix的mydestination參數中去,而後把用戶名添加到unix密碼文件中去。
權威域與宿主域之間沒有區別。用戶能接收沒有域的郵件。
在下面的例子中,我用example.com做爲這臺postfix的宿主域。
/etc/postfix/main.cf:
    mydestination = $myhostname localhost.$mydomain ... example.com
 
這個方法的缺陷是:
發送給 info@my.host.name的郵件也會傳遞給 info@example.com
用戶存放在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     postmaster@example.com postmaster
 7     info@example.com       joe
 8     sales@example.com      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文件包含了虛擬別名。上面的這個示例,發給 postmaster@example.com的郵件會轉發給本地的postmaster,而發給 info@example.com的郵件會轉發給joe系統賬戶。
第10行:一個所有的(catch-all)虛擬別名接收在虛擬別名文件中example.com沒有列出的地址的郵件。這存在必定的風險。垃圾郵件製造者可能給可能的用戶名發郵件,因此,一個全部的(catch-all)郵箱可能會接收到許多垃圾郵件。許多垃圾郵件的反彈郵件是以 anything@example.com發送的。
在改變了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     info@example.com    example.com/info
12     sales@example.com   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     postmaster@example.com 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郵件地址進行索引。在下面的這個示例中,發給 info@example.com的郵件將會被放到/var/mail/vhost/example.com/info,而發給 sales@example.com的郵件將會被放在/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)虛擬郵箱地址。它被用戶接受垃圾郵件,也用於以 anything@example.com的名義發送垃圾郵件的反彈郵件。
不要把虛擬郵箱通配符放到虛擬別名文件中去!!
第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     info@example.com    whatever
 9     sales@example.com   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     postmaster@example.com 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忽略。在上面的例子中, info@example.comsales@example.com列在了有效地址中;其餘給example.com的郵件都被postfix的smtp服務器用"未知的用戶"所拒絕。這是留給非postfix投遞代理用以拒絕本地提交的不存在接收者。若是你準備用LDAP,MySQL或者PgSQL來代替本地文件,請了解本文檔的"本地文件對數據庫"的內容。
第12行:這個註釋項顯示了怎樣讓postfix知道全部的有效郵件地址。擦汗訊結果會被postfix忽略
不要把虛擬郵箱通配符放在虛擬別名文件中!!
注意:若是你在virtual_mailbox_maps中指定了通配符,那麼你須要配置非postfix郵箱存儲來接收那個域的任何郵件。
第5,15,16行:同時使用虛擬別名與虛擬郵箱是可能的。咱們使用這個功能把 postmaster@example.com重定向到本地的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     postmaster@example.com postmaster
 7     joe@example.com        joe@somewhere
 8     jane@example.com       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文件包含了虛擬別名。在上面的示例中,發給 postmaster@example.com的郵件會轉發到本地的postmaster中去,而發給 joe@example.com的郵件轉發到遠程的郵件地址 --joe@somewhere;發送給 jane@example.com的郵件被轉發到 jane@somewhere郵箱。發送給example.com的其餘郵件都會被postfix以"未知用戶"而拒絕
第10行:註釋項顯示了 jim@yet-another-site郵箱接收全部發給在example.com域中不存在的郵箱地址。這存在必定的風險。如今的垃圾郵件發送者嘗試非可能存在的用戶名發送郵件。catch-all郵箱可能接收許多垃圾郵件,許多垃圾郵件的反彈郵件會以 anything@example.com的名義發送。
當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:
    listname-request@example.com listname-request
    listname@example.com         listname
    owner-listname@example.com   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 user@domain.tld的接收者地址來調用/path/to/autoreply
更詳細的信息查看pipe(8)手冊,這內容在master.cf文件中。
相關文章
相關標籤/搜索