在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 参数指定本地Internet域名。 默认是使用 $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

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

sudo systemctl restart postfix

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

在服务器B上运行以下命令来设置relayhost参数。 更换 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

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

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上的垃圾邮件发送者

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

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

保存文件,您就完成了。

检查电子邮件发件人分数

现在,您应该转到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验证失败。

故障排除

如果服务器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中继。 与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂

Sidebar