如何将网络服务器与电子邮件服务器分离?

如何将网络服务器与电子邮件服务器分离?

我有一台服务器,它为多个域运行一个 Web 服务器和一个电子邮件服务器,并且两个服务都配置为使用来自 Let's Encrypt 的 SSL 证书(对于每个域,Web 服务器和电子邮件服务器都使用相同的证书)。

我想设置 2 个服务器,在一台机器上托管 Web 服务器,在另一台机器上托管电子邮件服务。为了实现这一点,我认为我会遇到以下障碍:

  • 证书管理:我需要能够为每个域获取重复的证书,以便两台机器都可以证明它们的身份,或者可能让邮件托管机器只获取证书,而mail.example.com不是example.com为每个域设置证书
  • 从 Web 服务器发送电子邮件:我需要托管的一些网站将有联系、登录和注册表单,这些需要能够触发电子邮件消息。这似乎是最大的问题,因为我不知道如何在 Web 服务器上配置 Postfix 以便通过电子邮件服务器发送它们。

分离这些服务的最佳方法是什么?我如何才能为每个服务设置一个服务器而不会遇到我所描述的问题?

答案1

您已经强调了此过程的主要步骤:证书和将邮件服务从 Web 委托给邮件服务器。

关于证书,我建议对邮件和网络服务器使用不同的主机名以及不同的证书。

由于您正在使用 Let's Encrypt - 其工具的大多数用例都是针对 Web 服务器的。ACME 协议需要检查您是否控制着您的域名。这适用于 Web 资源。certbot(或任何其他支持 ACME 的工具)会将一个简单的文件放入您的 Web 根目录并告诉 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 [email protected] \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。

第二步是将邮件从 Web 服务器转发到邮件服务器。最佳实践是为每项服务配备单独的服务器,Linux/Unix 在许多情况下将使用本地邮件。因此,您不应将 Postfix 从 Web 服务器中完全删除。将 Postfix 设置更改为所谓的“卫星”设置。在这里,您的 Postfix 将把邮件转发到中继服务器,并仅为本地服务(套接字和/或 localhost:25)提供 SMTP。

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

dpkg-reconfigure postfix

在卫星设置中,系统会要求您提供邮件中继服务器。在此输入新邮件服务器的域名(例如 mail.example.com)。

在您的邮件服务器设置中,您应该启用 Web 服务器的 IP 地址作为邮件中继的可信来源。一个好的方法是使用 Postfix 配置指令允许我的网络

答案2

服务器上的证书由三部分组成:

首先私钥:这可以由应用程序本身生成,也可以使用 openssl 等工具生成。私钥是这里最重要的部分,需要保密,因为拥有密钥的任何人都可以冒充您的服务器。

它通常受密码保护。

使用私钥可以生成所谓的“CSR”,即认证请求。您可以将其发送给权威机构,以便从中生成证书。

该请求包含有关贵公司的数据(国家、位置、公司名称、城市,其中一些是可选的)以及证书应有效的所有主机名(1-n),此功能称为“主题备用名称

证书是所需的第二部分。

第三部分是证书链(即创建证书时涉及的所有证书)。您通常会从颁发机构获得证书链。否则,您始终可以从颁发机构的网站上下载它。

了解这些事实后,我们很容易得出以下结论:

只要

  • 因为你有三个部分(最重要的是私钥)
  • 因为你的服务器软件(邮件服务器、Web 服务器等)允许导入外部私钥
  • 因为服务器的主机名至少与证书中的一个主题备用名称匹配(或者该证书是通配符证书)

您可以将一个证书用于任意数量的服务器。

脱钩根本不是问题。

相关内容