Nginx

如何將網路伺服器與電子郵件伺服器分離?

  • March 11, 2018

我有一個為多個域執行 Web 伺服器和電子郵件伺服器的伺服器,並且這兩個服務都配置為使用 Let’s Encrypt 的 SSL 證書(對於每個域,Web 伺服器和電子郵件伺服器使用相同的證書)。

我想進行 2 台伺服器設置,並在一台機器上託管 Web 伺服器,在另一台機器上託管電子郵件服務。為了實現這一點,我相信我會遇到這些障礙:

  • 證書管理:我將需要能夠為每個域獲取重複的證書,以便兩台機器都可以證明他們是誰,或者可能讓郵件託管機器只獲取證書mail.example.com而不是example.com為每個域設置它
  • 從網路伺服器發送電子郵件:我需要託管的一些網站將有聯繫方式、登錄和系統資料庫單,這些需要能夠觸發電子郵件消息。這似乎是最大的問題,因為我不知道如何在 Web 伺服器上配置 Postfix,以便通過電子郵件伺服器發送它們。

解耦這些服務的最佳方法是什麼,我如何能夠為每個服務設置一個伺服器而不會遇到我描述的問題?

您已經強調了此過程的主要步驟:證書和將郵件服務從 Web 委託給郵件伺服器。

關於證書,我建議為郵件和 Web 伺服器使用不同的主機名以及不同的證書。

當您使用 Let’s Encrypt 時——其工具的大多數案例都用於 Web 伺服器。ACME 協議需要檢查您是否可以控制您的域名。這適用於網路資源。certbot(或任何其他支持 ACME 的工具)會將一個簡單的文件放入您的 webroot 並告訴 Let’s Encrypt 通過 HTTP 或 HTTPS 請求檢查它。

對於您的郵件伺服器,這不起作用。但是,如果您使用任何兼容的 DNS 提供商(例如 Amazon Route 53 或 DNS Made Easy 或…),您可以在沒有 Web 伺服器的情況下執行相同的操作。

有關 Certbot 中支持的 DNS 提供程序外掛,請參閱以下列表:

--dns-cloudflare      Obtain certificates using a DNS TXT record (if you are
                     using Cloudflare for DNS). (default: False)
--dns-cloudxns        Obtain certificates using a DNS TXT record (if you are
                     using CloudXNS for DNS). (default: False)
--dns-digitalocean    Obtain certificates using a DNS TXT record (if you are
                     using DigitalOcean for DNS). (default: False)
--dns-dnsimple        Obtain certificates using a DNS TXT record (if you are
                     using DNSimple for DNS). (default: False)
--dns-dnsmadeeasy     Obtain certificates using a DNS TXT record (if you
                     areusing DNS Made Easy for DNS). (default: False)
--dns-google          Obtain certificates using a DNS TXT record (if you are
                     using Google Cloud DNS). (default: False)
--dns-luadns          Obtain certificates using a DNS TXT record (if you are
                     using LuaDNS for DNS). (default: False)
--dns-nsone           Obtain certificates using a DNS TXT record (if you are
                     using NS1 for DNS). (default: False)
--dns-rfc2136         Obtain certificates using a DNS TXT record (if you are
                     using BIND for DNS). (default: False)
--dns-route53         Obtain certificates using a DNS TXT record (if you are
                     using Route53 for DNS). (default: False)

請參閱以下範例它如何適用於 Amazon 的 Route53:

# set AWS API credentials
export AWS_ACCESS_KEY_ID="1234567890"
export AWS_SECRET_ACCESS_KEY="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

# create a certificate
certbot certonly --noninteractive --agree-tos -m webmaster@example.com \n
 --no-eff-email --dns-route53 --rsa-key-size 4096 \n 
 -d mail.example.com -d smtp.example.com -d imap.example.com

正如您在我給定範例的最後一行中看到的,Let’s Encrypt 支持多域證書。如果您的郵件伺服器偵聽多個域,則必須採用這種方式。SMTP 或 IMAP 不像 HTTPS 那樣支持 SNI。

第二步是將您的郵件從您的網路伺服器轉發到郵件伺服器。作為為每個服務擁有一個單獨的伺服器的最佳實踐,Linux/Unix 將在許多情況下使用本地郵件。所以你不應該從你的網路伺服器中完全刪除 Postfix。將 Postfix 設置更改為所謂的“衛星”設置。在這裡,您的 Postfix 會將郵件轉發到中繼伺服器,並僅為本地服務(套接字和/或 localhost:25)提供 SMTP。

如果您使用的是 Debian 或 Ubuntu,您可以通過以下方式重新配置 Postfix:

dpkg-reconfigure postfix

在衛星設置中,您將被要求提供郵件中繼伺服器。在此處輸入新郵件伺服器的域名(例如 mail.example.com)。

在您的郵件伺服器設置中,您應該啟用 Web 伺服器的 IP 地址作為郵件中繼的可信來源。一個好的方法是使用 Postfix 配置指令permit_mynetworks

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