Nginx

將電子郵件代理到一個公共 IP 地址上不同域上的不同郵件伺服器

  • February 19, 2021

我有一台 Proxmox 機器,上面執行著 2 個虛擬機,還有兩個域,比如說 domainA.com 和 domainB.com。兩個域都指向 Proxmox 公共地址,我還設置了 nginx 以根據傳入域名將 http 流量反向到每個虛擬機。

網路看起來像這樣:

proxmox with nginx = #public IP# and 192.168.1.1, domainA.com = 192.168.1.2, domainB.com=192.168.1.3)

我還想在每個 VM 上設置郵件伺服器,並根據域名路由傳入的郵件通信。例如,當我收到收件人為 test@domainA.com 的郵件時,我想將通信轉發到 192.168.1.2,當我收到收件人為 test@domainB.com 的郵件時,我想將通信轉發到 192.168.1.3。

我怎樣才能做到這一點?我在使用 nginx 時遇到了麻煩,我不確定這是否可行

郵件協議沒有任何等效的 HTTP 的 Host 標頭,虛擬主機和反向代理所基於的標頭。

任何“虛擬郵件託管”都是基於一個簡單的事實,您可以將域名集成到郵件使用者的使用者名中。無法通過使用者連接的郵件伺服器主機名來區分使用者,例如通過 SMTP 或 IMAP 或其他任何方式;除了使用者名之外,協議中沒有其他地方可以放入域名。因此,反向代理需要知道使用者名,即執行身份驗證;但這不再只是一個反向代理。

此外,我不知道任何類似於 SNI 的郵件協議解決方案,因此所有郵件“虛擬主機”只能使用託管伺服器的同一個 SSL 證書。這意味著,根本沒有辦法為不同的託管域使用不同的郵件伺服器主機名,其他存在於證書中(在 CN 或 SAN 欄位中)。


對於 SMTP,反向代理的有限模仿是可能的。使用 Postfix 可以這樣完成:

  1. 設置一個“反向代理”系統,它將自己視為兩個域的中繼。為此,您需要將它們添加relay_domainsmain.cf. 當然,兩個域的網際網路發件人必須被定向到該系統(即所有域的 MX 必須設置為此中繼主機名)。

你最好給你的中繼提供一種過濾掉無法投遞的目的地的方法。換句話說,中繼必須始終知道目標伺服器上的實際郵箱列表。這是為了減少垃圾郵件負載和反向散射的可能性(這比您想像的要重要得多!)。例如,定期與它同步終端伺服器的郵箱數據庫,並relay_recipient_maps在中繼主機上進行配置。還記得我所說的“不僅僅是反向代理”嗎?

  1. 在這個“反向代理”上設置傳輸映射,它將每個域的郵件定向到適當的設置。這包括向/etc/postfix/transport文件中添加行:
domainA.com smtp:[192.168.1.2]
domainB.com smtp:[192.168.1.3]

方括號指示 Postfix 不做 MX 查找,直接使用指定地址;它只會連接到埠 25 以傳遞郵件。然後指定這個文件transport_mapsmain.cf請參閱 Postfix 文件如何正確執行此操作)

  1. 在目標主機上設置 MTA。它們的配置與往常一樣,除了您應該將中繼主機指定為受信任,以便這些 MTA 的反垃圾郵件系統信任其 Received: 標頭(您不得信任任何由不受您控制的系統添加的 Received: 標頭)。

引用自:https://serverfault.com/questions/1053966