在 CentOS/RHEL 上的 2 个 Postfix SMTP 服务器之间设置 SMTP 中继

之前我们讨论了使用 mailjet 设置 Postfix SMTP 中继,这在您必须使用商业 SMTP 中继服务时非常有用。 本教程将向您展示如何在 CentOS/RHEL 上的 2 个 Postfix SMTP 服务器之间设置 SMTP 中继。

用例

假设有两台服务器:服务器 A 和服务器 B。

  • 您已经在服务器 A 上设置了一个功能齐全的邮件服务器,并将 Postfix 作为 SMTP 服务器。 您可以使用它直接向收件人发送电子邮件,因为端口 25 没有被阻止。
  • 稍后您使用服务器 B 建立一个网站,该网站需要向用户发送通知电子邮件。

您可以在服务器 B 上设置另一台邮件服务器,但这很浪费时间和硬件资源。 更明智的解决方案是在服务器 B 上安装 Postfix SMTP 服务器,并将其配置为通过服务器 A 发送电子邮件,该服务器可以将电子邮件从服务器 B 中继到最终收件人。 服务器 A 已建立其 IP 信誉,因此您不必为服务器 B 建立 IP 信誉。

如果您在自己的 Linux 服务器上运行 WordPress,我建议您按照本教程设置 Postfix SMTP 中继。 这样,您就可以摆脱 WordPress 中的 SMTP 插件。 WordPress 插件会降低您网站的速度,而且它们可能容易受到攻击,例如 Easy WP SMTP 插件中发现的漏洞,它允许未经授权的用户修改 WordPress 选项并执行恶意代码。 由于 WordPress 插件中的漏洞,我的网站曾被入侵过一次。 因此,当我可以使用底层操作系统实现相同的功能时,我会尽可能多地删除插件。

事不宜迟,让我们开始吧。

步骤 1:在服务器 B 上安装 Postfix SMTP 服务器

运行以下命令从默认的 CentOS/RHEL 存储库安装 Postfix。 需要 Cyrus SASL 库才能使 SASL 身份验证工作。

sudo dnf update  sudo dnf install postfix cyrus-sasl cyrus-sasl-plain -y

安装完成后,启动 Postfix SMTP 服务器。

sudo systemctl start postfix

并在启动时启用自动启动。

sudo systemctl enable postfix

步骤 2:在服务器 B 上配置 Postfix

设置 Postfix 主机名

默认情况下,Postfix SMTP 服务器在与其他 SMTP 服务器通信时使用操作系统的主机名来标识自己。 但是,操作系统主机名可能会更改,因此最好使用以下命令直接在 Postfix 配置文件中设置主机名。 请注意,不建议使用主域 (yourdomain.com) 作为主机名。

sudo postconf -e "myhostname = www.yourdomain.com"

设置 $mydomain 参数

$mydomain 参数指定本地互联网域名。 默认是使用 $myhostname 减去第一个组件。 您可以显示当前值 $mydomain 和:

postconf mydomain

它应该是您的顶级域名,例如

linuxbabe.com

如果它没有显示您的顶级域名,则将 $mydomain 参数设置为:

sudo postconf -e "mydomain = yourdomain.com"

设置 $myorigin 参数

$myorigin 参数指定附加到没有@domain 部分的发件人和收件人地址的默认域名。 默认是使用的值 $myhostname,可以看出:

postconf myorigin

输出:

myorigin = $myhostname

您可以将其值更改为 yourdomain.com。

sudo postconf -e "myorigin = yourdomain.com"

设置 $mydestination 参数

$mydestination 参数指定您的服务器认为自己是最终目的地的域列表。 您可以使用以下命令显示 $mydestination 的当前值:

postconf mydestination

输出

mydestination = $myhostname, localhost.$mydomain, localhost

默认值允许您的 Postfix SMTP 服务器接收来自 [email protected], [email protected][email protected]. 请注意, mydestination 的值不应包含您的主域名,例如 linuxbabe.com,因为这将使服务器 B 作为您的主域名的目的地,这意味着从服务器 B 生成的电子邮件用于 [email protected] 将被发送到服务器 B 本身,而不是服务器 A。

重启后缀

最后,我们需要重新启动 Postfix 以使更改生效。

sudo systemctl restart postfix

第 3 步:通过端口 587 的 Postfix SMTP 中继

在服务器 B 上运行以下命令来设置中继主机参数。 代替 mail.linuxbabe.com 使用邮件服务器的主机名。

sudo postconf -e "relayhost = [mail.linuxbabe.com]:587"

然后编辑服务器 B 上的 Postfix 主配置文件。

sudo nano /etc/postfix/main.cf

将以下行添加到此文件的末尾以配置 SASL 身份验证。 我们指定 /etc/postfix/sasl_password 文件包含用户名和密码。

# outbound relay configurations smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_tls_security_level = may header_size_limit = 4096000

Save 和 close 文件。 接下来,您应该在您的邮件服务器上创建一个专用的电子邮件帐户,以便服务器 B 可以使用该电子邮件帐户通过 587 端口登录。之后,创建 /etc/postfix/sasl_passwd 服务器 B 上的文件。

sudo nano /etc/postfix/sasl_passwd

将 SMTP 中继主机和 SMTP 凭据添加到此文件中,如下所示。 将这些值替换为您自己的邮件服务器的主机名、电子邮件帐户和密码。 请注意,电子邮件帐户和密码之间有一个冒号。

[mail.linuxbabe.com]:587  [email protected]:password

Save 和 close 文件。 然后创建相应的哈希数据库文件 postmap.

sudo postmap /etc/postfix/sasl_passwd

现在你应该有一个文件 /etc/postfix/sasl_passwd.db. 重新启动 Postfix 以使更改生效。

sudo systemctl restart postfix

默认情况下, sasl_passwdsasl_passwd.db 服务器上的任何用户都可以读取文件。 将权限更改为 600,以便只有 root 可以读写这两个文件。

sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

从现在开始,服务器 B 上的网站可以使用 Postfix 发送电子邮件,这些电子邮件将通过您的邮件服务器进行中继。 请注意,许多 Web 应用程序提供两种电子邮件发送模式:

  • SMTP
  • 发邮件

SMTP 通常是指 Web 应用程序本身中的 SMTP 中继功能和 sendmail 是指在底层操作系统上使用 SMTP 服务器。 您需要选择 sendmail 选项以使用 Postfix SMTP 中继。 如果您在 WordPress 站点上安装了 SMTP 插件,请删除 SMTP 插件,WordPress 将使用 Postfix SMTP 中继。

如果服务器 A 上有 iRedMail

如果您使用 iRedMail 在服务器 A 上设置邮件服务器,那么 iRedAPD 策略守护程序可能会拒绝来自服务器 B 的电子邮件中继,因为发件人与 SMTP 验证用户名不同。 为了解决这个问题,我们需要将 SMTP 认证用户名添加到允许列表中。

编辑 iRedAPD 配置文件。

sudo nano /opt/iredapd/settings.py

在文件末尾添加以下行。 根据需要替换红色文本。

ALLOWED_LOGIN_MISMATCH_SENDERS = ['[email protected]']

Save 和 close 文件。 然后重新启动 iRedAPD 以使更改生效。

sudo systemctl restart iredapd

防止服务器 B 上的垃圾邮件发送者

由于服务器 B 上的 Postfix SMTP 服务器仅用于向用户发送事务性电子邮件,我们可以使其仅在 localhost 上侦听,因此不良行为者无法向其发送垃圾邮件。 在服务器 B 上运行以下命令,使 Postfix 仅在 localhost 上侦听。

sudo postconf -e "inet_interfaces = loopback-only"

重新启动 Postfix 以使更改生效。

sudo systemctl restart postfix

设置发件人地址、发件人名称和返回路径

默认情况下,发件人地址和发件人名称与用于验证登录的电子邮件帐户相同,返回路径将类似于 [email protected]. 您可以在 Web 应用程序中设置自定义发件人地址、发件人名称和返回路径。

我们以 WordPress 为例。 您可以在 WordPress 主题中添加以下几行 functions.php 文件以覆盖默认的发件人地址、发件人名称和返回路径。 根据需要替换红色文本。 您应该在邮件服务器上创建发件人电子邮件地址以防止发送失败。

// Function to change From email address function wpb_sender_email( $original_email_address ) {     return '[email protected]'; }  // Function to change sender name function wpb_sender_name( $original_email_from ) {     return 'LinuxBabe'; }  // Set return-path the same as From address function fix_my_email_return_path( $phpmailer ) {     $phpmailer->Sender = $phpmailer->From; }  // Hooking up our functions to WordPress filters add_filter( 'wp_mail_from', 'wpb_sender_email' ); add_filter( 'wp_mail_from_name', 'wpb_sender_name' ); add_action( 'phpmailer_init', 'fix_my_email_return_path' ); 

Save 文件,你就完成了。

检查电子邮件发件人分数

现在您应该访问 https://www.mail-tester.com 并从服务器 B 上的网站向邮件测试器地址发送一封电子邮件。 检查您的发件人分数,看看 SPF、DKIM 和 DMARC 是否会通过。 如您所见,我得到了满分。

如果服务器B上有多个网站

如果您在服务器 B 上运行多个网站,那么您需要为每个域名使用不同的中继主机。 编辑服务器 B 上的 Postfix 主配置文件。

sudo nano /etc/postfix/main.cf

在文件中添加以下行,它告诉 Postfix 我们要为每个发件人域使用不同的中继主机。

sender_dependent_relayhost_maps = hash:/etc/postfix/relay_by_sender

然后创建文件。

sudo nano /etc/postfix/relay_by_sender

添加如下参数。 左侧是发件人域。 右侧是邮件服务器的主机名和端口号。

@domain1.com    mail.domain1.com:587 @domain2.com    mail.domain2.com:587

Save 和 close 文件。 然后编辑 SASL 身份验证文件。

sudo nano /etc/postfix/sasl_passwd

添加登录凭据,如下所示。

mail.domain1.com         [email protected]:password mail.domain2.com         [email protected]:password

Save 和 close 文件。 然后创建哈希数据库文件。

sudo postmap /etc/postfix/relay_by_sender  sudo postmap /etc/postfix/sasl_passwd

重新启动 Postfix SMTP 服务器以使更改生效。

sudo systemctl restart postfix

从现在开始,电子邮件与 domain1.com 在信封发件人地址将通过 mail.domain1.com 和电子邮件 domain2.com 在信封发件人地址将通过 mail.domain2.com. 信封发件人地址中具有其他域名的电子邮件将通过指定的主机进行中继 relayhost 范围。

Mail.domain1.commail.domain2.com 可以指向同一个IP地址,这意味着两个域名使用的是同一个邮件服务器。 您可以查看以下教程之一以在单个邮件服务器上托管多个域。

  • 如何使用 Nginx 在 iRedMail 中托管多个邮件域
  • 如何在 Modoboa 邮件服务器中托管多个邮件域

您还可以在不同的服务器上为两个域名托管电子邮件。 如果您在服务器 B 上有多个 WordPress 站点,您还应该更改每个站点 functions.php 在您的 WordPress 主题中创建文件,为每个域名设置自定义发件人地址和名称。

从电子邮件标题中删除敏感信息

默认情况下,Postfix SMTP 服务器会添加一个 Received: 邮件头,记录服务器B的IP地址,这可能会泄露您网站的IP地址(如果它在CDN后面)。 你可以告诉 Postfix 忽略它。 在服务器 A 上创建一个头检查文件。

sudo nano /etc/postfix/smtp_header_checks

将以下行放入文件中。

/^Received:/            IGNORE 

Save 和 close 文件。 然后编辑 Postfix 主配置文件。

sudo nano /etc/postfix/main.cf

在文件末尾添加以下行。

smtp_header_checks = regexp:/etc/postfix/smtp_header_checks

Save 和 close 文件。 然后运行以下命令重建哈希表。

sudo postmap /etc/postfix/smtp_header_checks

重新加载 Postfix 以使更改生效。

sudo systemctl reload postfix

现在 Postfix 不会在电子邮件标题中包含这些敏感信息。 请注意,有些人可能还喜欢删除 MIME-Version 标题。 我不推荐这样做,因为这会导致DKIM验证失败。

故障排除

如果服务器 B 上的 Postfix 无法发送电子邮件,并且您在邮件日志中发现以下错误(/var/log/maillog),

warning: SASL authentication failure: No worthy mechs found

您需要安装 Cyrus SASL 库。

sudo dnf install postfix cyrus-sasl cyrus-sasl-plain -y

然后重启Postfix。

sudo systemctl restart postfix

结论

我希望本教程可以帮助您在 2 个 Postfix SMTP 服务器之间设置 SMTP 中继。 与往常一样,如果您发现这篇文章有用,请订阅我们的免费时事通讯以获取更多提示和技巧。 保重?