將電子郵件代理到一個公共 IP 地址上不同域上的不同郵件伺服器
我有一台 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 可以這樣完成:
- 設置一個“反向代理”系統,它將自己視為兩個域的中繼。為此,您需要將它們添加
relay_domains
到main.cf
. 當然,兩個域的網際網路發件人必須被定向到該系統(即所有域的 MX 必須設置為此中繼主機名)。你最好給你的中繼提供一種過濾掉無法投遞的目的地的方法。換句話說,中繼必須始終知道目標伺服器上的實際郵箱列表。這是為了減少垃圾郵件負載和反向散射的可能性(這比您想像的要重要得多!)。例如,定期與它同步終端伺服器的郵箱數據庫,並
relay_recipient_maps
在中繼主機上進行配置。還記得我所說的“不僅僅是反向代理”嗎?
- 在這個“反向代理”上設置傳輸映射,它將每個域的郵件定向到適當的設置。這包括向
/etc/postfix/transport
文件中添加行:domainA.com smtp:[192.168.1.2] domainB.com smtp:[192.168.1.3]
方括號指示 Postfix 不做 MX 查找,直接使用指定地址;它只會連接到埠 25 以傳遞郵件。然後指定這個文件
transport_maps
(main.cf
請參閱 Postfix 文件如何正確執行此操作)
- 在目標主機上設置 MTA。它們的配置與往常一樣,除了您應該將中繼主機指定為受信任,以便這些 MTA 的反垃圾郵件系統信任其 Received: 標頭(您不得信任任何由不受您控制的系統添加的 Received: 標頭)。