Postfix

後綴虛擬別名域與正則表達式虛擬別名映射匹配

  • July 27, 2015

使用 Postfix (2.11.3) 我想將所有郵件重定向到外部地址。

/etc/postfix/main.cf:

virtual_alias_maps = regexp:/etc/postfix/rewrite

/etc/postfix/rewrite:

/^.+$/ hijacked@example.com

發送郵件到destination@example.net,出現以下錯誤:

[...] to=<hijacked@example.com>, orig_to=<destination@example.net> [...] status=bounced (User unknown in virtual alias table)

文件說:

有效的收件人地址與 virtual_alias_maps 參數一起列出。Postfix SMTP 伺服器以“虛擬別名表中的使用者未知”拒絕無效收件人。

事實證明,該錯誤與驗證虛擬別名域有關:virtual_alias_domains預設情況下$virtual_alias_maps,將其設置為其他任何內容(設置為不匹配的域甚至將其留空)可以解決問題。

我在答案中找到的另一個解決方案是以另一種形式給出正則表達式:

/^.+@.+$/ hijacked@example.com

所以我的問題是,在使用正則表達式表進行虛擬別名時,別名域的驗證如何工作?為什麼設置virtual_alias_domains為其他任何東西都可以解決問題?上述兩種地址映射等效模式有何不同?

的輸出postconf -n是:

config_directory = /etc/postfix
inet_interfaces = loopback-only
inet_protocols = ipv4
mydestination =
myhostname = example.org
myorigin = $myhostname
virtual_alias_domains =
virtual_alias_maps = regexp:/etc/postfix/rewrite

假設在這裡你有一封郵件destination@example.net要投遞。

使用域virtual_alias_domains部分(使用完整地址 ( ) 作為鍵查找其中的example.net地圖,預計將返回重寫的地址。virtual_alias_maps``destination@example.net

這意味著您可以為兩個查找共享一個映射文件,就像virtual (5)/etc/postfix/virtual中解釋的簡單雜湊映射一樣。Postfix ( ) 的預設配置是假設一個這種混合風格的地圖。virtual_alias_domains = $virtual_alias_maps

example.net OK
aaa@example.net hijacked@example.com
bbb@example.net hijacked@example.com

這些查找的重要規則是:

  • virtual_alias_maps被遞歸查找。如果它返回與密鑰相同的地址,則使用該地址。
  • 如果返回的最終改寫地址virtual_alias_maps還在 中virtual_alias_domains,則認為查找失敗(User unknown in virtual alias table)。這似乎沒有明確記錄,我從這個執行緒中學到了。

因此,您的第一個正則表達式映射 ( /^.+$/ hijacked@example.com) 和配置是有問題的,因為映射匹配所有內容,因此hijacked@example.com仍然存在virtual_alias_domains並被退回。

您可以通過在 中不指定任何內容來避免它virtual_alias_domains,或者使用另一個與單個域字元串 ( ) 不匹配的正則表達式映射/^.+@.+$/ hijacked@example.com

但是他們中的任何一個都不認為我是正確的配置,而是一種不直覺的解決方法。我認為會有更適合您的目的的解決方案。

引用自:https://unix.stackexchange.com/questions/218316