如何在Ubuntu上的2个Postfix SMTP服务器之间设置SMTP中继

先前我们讨论了使用mailjet设置Postfix SMTP中继,当您必须使用商业SMTP中继服务时,这很有用。 本教程将向您展示如何在Ubuntu上的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插件存在漏洞,我的网站曾经遭到入侵。 因此,当我可以使用底层操作系统实现相同的功能时,我会尽可能地摆脱插件。

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

在服务器B上安装Postfix SMTP服务器

首先,让我们使用以下命令在服务器B上安装Postfix SMTP服务器。 如果Postfix已经在服务器B上运行,则跳过安装Postfix,但是您仍然需要安装 libsasl2-modules 包。

sudo apt install postfix libsasl2-modules

当您看到以下消息时,请按 Enter 选择第二个选项: Internet Site

接下来,设置系统邮件名称。 例如,我输入我的域名 www.linuxbabe.com。 请注意,您不应输入主域名,例如 linuxbabe.com,因为这将使服务器B成为您的主域名的目的地,这意味着从服务器B生成的电子邮件用于 [email protected] 将被发送到服务器B本身,而不是服务器A。

SMTP中继系统名称

在服务器B上安装Postfix SMTP服务器后,让我们配置SMTP中继。

通过端口587的Postfix SMTP中继

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

sudo nano /etc/postfix/main.cf

找到以下行。

relayhost =

默认情况下,未设置其值。 您需要将服务器A(您的邮件服务器)的主机名设置为中继主机,如下所示。

relayhost = mail.linuxbabe.com:587

然后,在此文件的末尾添加以下行以配置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

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

sudo nano /etc/postfix/sasl_passwd

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

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

保存并关闭文件。 然后使用以下命令创建相应的哈希数据库文件 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]']

保存并关闭文件。 然后重新启动iRedAPD,以使更改生效。

sudo systemctl restart iredapd

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

默认情况下,Postfix SMTP服务器在计算机上的所有活动接口上进行侦听。 由于服务器B上的Postfix SMTP服务器仅用于向用户发送交易电子邮件,因此我们可以使它仅在本地主机上侦听,因此不良行为者无法向其发送垃圾邮件。

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

sudo nano /etc/postfix/main.cf

找到以下行。

inet_interfaces = all

更改为:

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' );

保存文件,您就完成了。

检查电子邮件发件人分数

现在,您应该转到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

保存并关闭文件。 然后编辑SASL身份验证文件。

sudo nano /etc/postfix/sasl_passwd

如下添加登录凭据。

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

保存并关闭文件。 然后创建哈希数据库文件。

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

保存并关闭文件。 然后编辑Postfix主配置文件。

sudo nano /etc/postfix/main.cf

在文件末尾添加以下行。

smtp_header_checks = regexp:/etc/postfix/smtp_header_checks

保存并关闭文件。 然后运行以下命令重建哈希表。

sudo postmap /etc/postfix/smtp_header_checks

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

sudo systemctl reload postfix

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

结论

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

Sidebar