在CentOS 8上设置Postfix仅发送SMTP服务器

  • 技术文档
  • 2022.03.24
  • 浏览:810

在本文中,我将向您展示如何在CentOS 8上将Postfix设置为仅发送SMTP服务器。我将首先向您展示如何为单个域执行此操作,然后如果需要,您可以为多个域应用这些步骤。

Set Up Postfix Send-Only SMTP Server on CentOS 8

用例

您有一个需要向用户发送事务性电子邮件(如密码重置电子邮件)的网站/web应用程序。最有可能的是,用户不需要回复这些电子邮件,或者如果他们回复,回复电子邮件将被发送到您的专用邮件服务器。在这种情况下,可以使用Postfix(一种流行的SMTP服务器软件)在web服务器上设置只发送SMTP服务器。

先决条件

要从服务器发送电子邮件,端口25(出站)必须打开。许多ISP和托管公司,如DigitalOcean block port 25来控制垃圾邮件。我建议使用ScalaHost,因为它不会阻止端口25(出站)。拥有ScalaHost服务器后,在其上安装CentOS 8,并按照以下说明操作。

为多个域设置Postfix仅发送SMTP服务器实际上并不困难。首先,我们需要为一个域配置它,然后为多个域设置它。

第一步:设置主机名和PTR记录

默认情况下,Postfix在与其他SMTP服务器通信时使用服务器的主机名来标识自身。如果您的主机名无效,某些SMTP服务器将拒绝您的电子邮件。您应该设置一个完整的限定域名(FQDN),如下所示。

sudo hostnamectl set-hostname mta1.yourdomain.com

要检查服务器的主机名,请运行

hostname -f

您需要注销并重新登录,才能在命令提示下看到主机名的更改。这个主机名应该有一个指向服务器IP地址的DNS a记录。

此外,还需要设置一个PTR记录(又名指针记录),将IP地址映射到FQDN。这是A唱片的对应品。如果你的服务器IP地址没有PTR记录,许多SMTP服务器会拒绝你的电子邮件。

因为您从主机提供商或ISP获得IP地址,而不是从域注册商获得,所以您必须在主机提供商的控制面板中为您的IP设置PTR记录,或者询问ISP。例如,在ScalaHost中,您可以通过打开支持票证或使用他们网站上的实时聊天来设置PTR记录。尽管您可以将PTR记录设置为任何主机名,但为了获得最佳实践,您应该使用刚刚设置的FQDN。

要查看PTR记录设置是否正确,请运行以下命令。将12.34.56.78替换为您自己的IP地址。

host 12.34.56.78

请注意,如果服务器使用IPv6地址,最好为FQDN添加AAAA记录,并为IPv6地址设置PTR记录。

第2步:在CentOS 8上安装Postfix

运行以下命令,从默认的CentOS 8存储库安装Postfix。

sudo dnf update  sudo dnf install postfix -y

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

sudo systemctl start postfix

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

sudo systemctl enable postfix

第3步:配置后缀

设置后缀主机名

默认情况下,Postfix SMTP服务器在与其他SMTP服务器通信时使用操作系统的主机名来标识自身。但是,OS主机名可能会更改,因此使用以下命令直接在Postfix配置文件中设置主机名是一种好的做法。

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

设置$mydomain参数

$mydomain参数指定本地internet域名。默认情况下,使用$myhostname减去第一个组件。您可以通过以下方式显示$mydomain的当前值:

postconf mydomain

它应该是你的顶级域名,比如

linuxbabe.com

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

sudo postconf -e "mydomain = yourdomain.com"

设置$myorigin参数

$myorigin参数指定附加到没有@domain部分的发件人和收件人地址的默认域名。默认设置是使用$myhostname的值,如下所示:

postconf myorigin

输出:

myorigin = $myhostname

您可以将其值更改为您的域。通用域名格式。

sudo postconf -e "myorigin = yourdomain.com"

重新启动后缀

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

sudo systemctl restart postfix

第4步:在CentOS 8上安装和配置OpenDKIM

DKIM代表域密钥识别邮件。你可以在你的服务器上安装OpenDKIM,并使用它为从你的域发送的电子邮件添加签名,使用你的私钥。接收SMTP服务器使用您在DNS中发布的相应公钥验证签名。如果你想让你的邮件进入收件人的收件箱,添加DKIM签名是必须的。

从EPEL(企业Linux的额外软件包)存储库安装OpenDKIM。

sudo dnf install epel-release  sudo dnf install opendkim perl-Getopt-Long

编辑OpenDKIM主配置文件。

sudo nano /etc/opendkim.conf

找到下面这行。

Mode     v

默认情况下,OpenDKIM以验证模式(v)运行,该模式将验证传入电子邮件的DKIM签名。我们需要对发送的电子邮件进行签名,因此将此行更改为以下内容以启用签名模式。

Mode           sv

找到下面一行并注释掉,因为我们将为每个域名使用单独的密钥。

KeyFile   /etc/opendkim/keys/default.private

接下来,找到以下4行并取消注释。

# KeyTable            /etc/opendkim/KeyTable  # SigningTable        refile:/etc/opendkim/SigningTable  # ExternalIgnoreList  refile:/etc/opendkim/TrustedHosts  # InternalHosts       refile:/etc/opendkim/TrustedHosts

保存并关闭文件。

创建签名表、密钥表和受信任主机文件

编辑签名表文件。

sudo nano /etc/opendkim/SigningTable

在该文件末尾添加以下行。这会告诉OpenDKIM,如果服务器上的发件人正在使用@your域。com地址,则应使用mta1标识的私钥对其进行签名_域名。你的领域。通用域名格式。

*@your-domain.com    mta1._domainkey.your-domain.com

mta1是DKIM选择器。域名可能有多个DKIM密钥。DKIM选择器允许您选择特定的DKIM键。您可以为DKIM选择器使用任何名称。我认为使用主机名最左边的部分作为DKIM选择器很方便。保存并关闭文件。然后编辑密钥表文件。

sudo nano /etc/opendkim/KeyTable

添加以下行,指定DKIM私钥的位置。

mta1._domainkey.your-domain.com your-domain.com:mta1:/etc/opendkim/keys/your-domain.com/mta1.private

保存并关闭文件。接下来,编辑受信任的主机文件。

sudo nano /etc/opendkim/TrustedHosts

默认情况下,127.0.0.1和::1包含在此文件中。现在添加以下行。这告诉OpenDKIM,如果电子邮件来自您自己的域名,那么OpenDKIM不应该对该电子邮件执行DKIM验证。

*.your-domain.com

保存并关闭文件。

生成私钥/公钥对

由于DKIM用于对发送的邮件进行签名和验证接收的邮件,因此需要生成一个私钥来对发送的电子邮件进行签名,并生成一个公钥来接收SMTP服务器,以验证电子邮件的DKIM签名。公钥将在DNS中发布。

为域创建一个单独的文件夹。

sudo mkdir /etc/opendkim/keys/your-domain.com

使用opendkim genkey工具生成密钥。

sudo opendkim-genkey -b 2048 -d your-domain.com -D /etc/opendkim/keys/your-domain.com -s mta1 -v

上述命令将创建2048位密钥-d(域)指定域-D(目录)指定存储密钥的目录。我使用mta1作为DKIM选择器。命令执行后,私钥将写入mta1。私有文件和公钥将写入mta1。txt文件。

centos 8 send-only smtp server opendkim

默认情况下,只有root用户可以读取和写入密钥文件。使opendkim成为私钥的所有者。

sudo chown opendkim:opendkim /etc/opendkim/keys/ -R

在DNS记录中发布您的公钥

显示公钥

sudo cat /etc/opendkim/keys/your-domain.com/mta1.txt

p参数后面的字符串是公钥。

centos-8-send-only-smtp-server-dkim-key

在DNS管理器中,创建一个TXT记录,输入mta1_名称字段中的domainkey。然后返回终端窗口,复制括号中的所有内容,并将其粘贴到DNS记录的值字段中。您需要删除值字段中的所有双引号和换行符。如果不删除它们,那么下一步中的密钥测试可能会失败。

centos 8 send only smtp postfix dkim record

测试DKIM密钥

在CentOS 8服务器上输入以下命令以测试密钥。

sudo opendkim-testkey -d your-domain.com -s mta1 -vvv

如果一切正常,您将看到键OK消息。

opendkim-testkey: using default configfile /etc/opendkim.conf opendkim-testkey: checking key 'mta1._domainkey.linuxbabe.com' opendkim-testkey: key OK

如果你看到“钥匙不安全”,不要惊慌。这是因为您的域名上未启用DNSSEC。DNSSEC是安全DNS查询的安全标准。大多数域名都没有启用DNSSEC。你可以继续遵循这个指南。

现在我们可以启动opendkim服务了。

sudo systemctl start opendkim

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

sudo systemctl enable opendkim

OpenDKIM监听127.0.0.1:8891。

第5步:将Postfix连接到OpenDKIM

编辑后缀主配置文件。

sudo nano /etc/postfix/main.cf

在这个文件的末尾添加以下几行,这样Postfix就可以通过milter协议调用OpenDKIM了。请注意,应该使用127.0.0.1作为地址。不要使用localhost。

# Milter configuration milter_default_action = accept milter_protocol = 6 smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = $smtpd_milters

保存并关闭文件。然后将postfix用户添加到opendkim组。

sudo gpasswd -a postfix opendkim

重新启动后缀服务。

sudo systemctl restart postfix

步骤6:创建SPF DNS记录

SPF(发件人策略框架)记录指定允许哪些主机或IP地址代表域发送电子邮件。在DNS管理界面中,创建一个新的TXT记录,如下所示。使用您自己的服务器IPv4地址和IPv6地址。

TXT  @   v=spf1 mx ip4:12.34.56.78 ip6:2600:3c01::f03c:93d8:f2c6:78ad ~all

第7步:设置发件人地址、发件人名称和返回路径

您可以在网站/web应用程序中设置自定义发件人地址、发件人名称和返回路径。让我们以WordPress为例。您可以在WordPress主题的函数中添加以下行。php文件覆盖默认的发件人地址、发件人名称和返回路径。必要时替换红色文本。

// Function to change From email address function wpb_sender_email( $original_email_address ) {     return ''; }  // 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' ); 

保存文件,就完成了。

步骤8:为发送的电子邮件启用TLS加密

默认情况下,Postfix在发送邮件时不使用TLS加密。要启用TLS加密,请打开/etc/postfix/main。cf文件,并在该文件末尾添加以下两行。

smtp_tls_security_level = may smtp_tls_loglevel = 1

第一行为Postfix SMTP客户端启用TLS加密。第二行将把TLS连接记录在/var/log/maillog文件中,这样您就可以检查TLS加密是否有效。保存并关闭文件。重新启动Postfix以使更改生效。

sudo systemctl restart postfix

由于Postfix不接收传入的电子邮件,因此无需为Postfix SMTP守护程序配置有效的TLS证书。

第9步:测试发送者分数

现在去https://www.mail-tester.com.你会看到一个独特的电子邮件地址。从Postfix SMTP服务器上的网站向此地址发送电子邮件,然后检查您的分数。如你所见,我得了满分。在测试结果中,您应该检查您的PTR记录、SPF和DKIM记录是否有效。

Testing Email Score and Placement

还可以打开/var/log/maillog文件,检查是否使用了TLS加密。例如,下面一行显示了与mail tester的连接。com是加密的。

Anonymous TLS connection established to mail-tester.com[94.23.206.89]:25: TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)

如果你的电子邮件仍被标记为垃圾邮件呢?

在本文中,我为您提供了更多关于电子邮件可交付性的提示:如何阻止您的电子邮件被标记为垃圾邮件。虽然这需要一些时间和精力,但在应用这些技巧后,你的电子邮件最终会被放入收件箱。

如何为多个域配置Postfix仅发送SMTP服务器

默认情况下,Postfix允许您使用发件人标题和返回路径地址中的任何域名发送电子邮件。如果你的服务器托管多个网站,你只需要为你的其他域创建SPF DNS记录,这很容易做到,并为你的其他域配置OpenDKIM。

要为其他域配置OpenDKIM,需要在签名表、密钥表和可信主机文件中添加其他域,如下所示。

签名表:

*@example.com       mta1._domainkey.example.com *@example.net       mta1._domainkey.example.net

键表:

mta1._domainkey.example.com example.com:mta1:/etc/opendkim/keys/example.com/mta1.private mta1._domainkey.example.net example.net:mta1:/etc/opendkim/keys/example.net/mta1.private

受信任的主机:

127.0.0.1 localhost  *.example.com *.example.net

然后按照上述步骤为其他域生成DKIM私钥/公钥对,并在DNS中添加DKIM公钥。重新启动OpenDKIM,就完成了。别忘了测试你的发件人分数。

故障排除

如果您的邮件未签名且DKIM检查失败,您可能需要检查postfix日志(/var/log/maillog)以查看配置中的错误。

从另一台服务器发送电子邮件

有两种方法允许其他服务器通过只发送Postfix SMTP服务器发送电子邮件。

  • 在不使用SMTP身份验证的情况下使用端口25:此方法要求其他服务器不阻止端口25(出站)。
  • 将端口587用于SMTP身份验证:如果其他服务器阻止端口25(出站),则可以使用端口587。

没有SMTP身份验证的端口25

默认情况下,CentOS 8上的Postfix仅在本地主机上侦听。您需要将Postfix配置为在0.0.0.0上侦听,以便其他服务器可以连接到仅发送Postfix SMTP服务器。

sudo postconf "inet_interfaces = all"

然后需要将另一台服务器的IP地址添加到Postfix mynetworks参数中。将12.34.56.78替换为实际IP地址。

sudo postconf "$(postconf mynetworks) 12.34.56.78"

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

sudo systemctl restart postfix

运行以下命令打开端口25(入站)。

sudo firewall-cmd --permanent --add-port=25/tcp  sudo systemctl reload firewalld

现在,您可以将SMTP客户端配置为使用mta1。你的地盘。com和端口25发送电子邮件。您不需要在SMTP客户端中指定用户名/密码。

带有SMTP身份验证的587端口

打开防火墙中的587和80端口。

sudo firewall-cmd --permanent --add-service={smtp-submission,http}  sudo systemctl reload firewalld

默认情况下,CentOS 8上的Postfix仅在本地主机上侦听。您需要将Postfix配置为在0.0.0.0上侦听,以便其他服务器可以连接到仅发送Postfix SMTP服务器。

sudo postconf "inet_interfaces = all"

然后,您需要启用Postfix的提交服务,以便电子邮件客户端可以向Postfix SMTP服务器提交电子邮件。编辑母版。cf文件。

sudo nano /etc/postfix/master.cf

在提交部分,取消注释或添加以下行。请在每个-o之前至少允许一个空格(制表符或空格键)。在后缀配置中,前面的空格字符表示此行是前一行的延续。(默认情况下,提交部分被注释掉。您可以复制以下行并将其粘贴到文件中,这样您就不必手动取消注释或添加新文本。)

submission     inet     n    -    y    -    -    smtpd  -o syslog_name=postfix/submission  -o smtpd_tls_security_level=encrypt  -o smtpd_tls_wrappermode=no  -o smtpd_tls_loglevel=1  -o smtpd_sasl_auth_enable=yes  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject  -o smtpd_sasl_type=dovecot  -o smtpd_sasl_path=private/auth

上述配置启用Postfix的提交守护程序,并要求对SMTP身份验证进行TLS加密。纯文本身份验证将被拒绝。保存并关闭文件。要启用SMTP身份验证,我们需要在CentOS 8/RHEL 8服务器上安装Dovecot。

sudo dnf install dovecot

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

sudo systemctl start dovecot  sudo systemctl enable dovecot

编辑身份验证配置文件。

sudo nano /etc/dovecot/conf.d/10-auth.conf

取消对以下行的注释。

disable_plaintext_auth = yes

当没有SSL/TLS加密时,它将禁用明文身份验证。如果您想使用完整的电子邮件地址()登录,请在文件中添加以下行。

auth_username_format = %n

否则,您只能使用用户名登录(不使用@your domain.com)。接下来,找到下面这行。

auth_mechanisms = plain

这一行只启用普通身份验证机制。登录是您可能希望添加的另一种身份验证机制,以支持旧的电子邮件客户端。

auth_mechanisms = plain login

保存并关闭文件。然后编辑以下文件。

sudo nano /etc/dovecot/conf.d/10-master.conf

将service auth部分更改为以下内容,以便Postfix可以找到Dovecot身份验证服务器。

service auth {     unix_listener /var/spool/postfix/private/auth {       mode = 0660       user = postfix       group = postfix     } }

Postfix-SMTP-Auth-centos8

保存并关闭文件。重新启动Dovecot以使更改生效。

sudo systemctl restart dovecot

接下来,我们需要获得有效的TLS证书。我们可以很容易地从Let's Encrypt获得免费的TLS证书。发出以下命令,从EPEL存储库在CentOS 8/RHEL 8上安装Let's Encrypt client(certbot)。

sudo dnf install certbot

然后使用独立插件获取TLS证书(假设Postfix SMTP服务器上没有运行web服务器)。

sudo certbot certonly --standalone --agree-tos --email  -d mta1.yourdomain.com

过了一会儿,您应该会看到以下几行,这意味着证书已成功获得。您还可以查看证书存储的目录。

centos 8 postfix send-only tls certificate

接下来,我们需要运行以下两个命令来指定后缀配置文件中TLS证书和私钥的位置。您的Let's Encrypt证书和私钥存储在/etc/letsencrypt/live/mta1下。你的领域。com/directory。

sudo postconf "smtpd_tls_cert_file = /etc/letsencrypt/live/mta1.your-domain.com/fullchain.pem"  sudo postconf "smtpd_tls_key_file = /etc/letsencrypt/live/mta1.your-domain.com/privkey.pem"

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

sudo systemctl restart postfix

现在,您可以将SMTP客户端配置为使用mta1。你的地盘。com和端口587发送电子邮件。使用TLS加密类型和普通作为身份验证模式。您需要在SMTP服务器上创建电子邮件帐户。这很简单。使用adduser命令添加用户。

sudo adduser user1

然后为该用户设置密码。

sudo passwd user1

电子邮件地址将为[电子邮件 ;受保护]。

从邮件头中删除敏感信息

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

sudo nano /etc/postfix/smtp_header_checks

将以下行放入文件中。

/^Received:/            IGNORE 

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

sudo nano /etc/postfix/main.cf

在文件末尾添加以下行。

smtp_header_checks = regexp:/etc/postfix/smtp_header_checks

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

sudo postmap /etc/postfix/smtp_header_checks

重新加载后缀以使更改生效。

sudo systemctl reload postfix

现在Postfix不会在邮件头中包含这些敏感信息。

自动更新TLS证书

您可以创建Cron作业来自动续订TLS证书。只需打开root用户的crontab文件。

sudo crontab -e

然后添加以下行。

@daily certbot renew --quiet

保存并关闭文件。

发送大量或大量电子邮件

您可以使用此SMTP服务器发送批量或批量电子邮件吗?

是的,但你应该只向合法订户发送批量电子邮件,也就是说,收件人应该已经注册了你的邮件列表。你不应该发送垃圾邮件(未经请求的批量电子邮件),否则你的SMTP服务器肯定会被列入黑名单。在发送大量电子邮件之前,我强烈建议遵循本文中的建议:如何阻止您的电子邮件被标记为垃圾邮件。

必须先发出STARTTLS命令

如果在邮件日志(/var/log/maillog)中看到以下错误,可能是因为在/etc/postfix/main中没有正确指定TLS证书。cf文件。

Must issue a STARTTLS command first (in reply to MAIL FROM command))

结论

我希望本教程能帮助您在CentOS 8上为多个域设置Postfix仅发送SMTP服务器。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?