由于我制定的强制限制,我无法再通过自己的 Postfix 发送电子邮件

nyl*_*pej 4 linux email postfix

直到最近,我的 Postfix 服务器运行良好。然后我实施了一些限制 a) 打击垃圾邮件 b) 禁止以我自己的名义向我发送电子邮件——我已经开始从我自己的电子邮件地址接收电子邮件,要求向某人发送比特币。

我想同时修复 a 和 b。

现在我无法通过我自己的 postfix 服务器发送电子邮件。

  Client host rejected: cannot find your reverse hostname, [<my ip here>]
Run Code Online (Sandbox Code Playgroud)

请注意,我将笔记本电脑带到不同的地方和国家,并从这些地方连接到 WiFi。而且我希望能够始终发送电子邮件。

这是我的 Postfix 配置的一部分。对于帐户和域的数据库,我使用 Postgresql。

smtpd_helo_required = yes

smtpd_client_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unknown_reverse_client_hostname,

  reject_unknown_client_hostname,
  reject_unauth_pipelining

smtpd_helo_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_invalid_helo_hostname,

###  reject_non_fqdn_helo_hostname,
  reject_unauth_pipelining

smtpd_sender_restrictions =
  permit_mynetworks,
  reject_sender_login_mismatch,
  permit_sasl_authenticated,
  reject_non_fqdn_sender,
  reject_unknown_sender_domain,
  reject_unauth_pipelining

smtpd_relay_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,

  reject_unauth_destination


smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,
  reject_unauth_pipelining

smtpd_data_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_multi_recipient_bounce,
  reject_unauth_pipelining

# deliver mail for virtual users to Dovecot's LMTP socket
virtual_transport = lmtp:unix:private/dovecot-lmtp

#  query to find which domains we accept mail for
virtual_mailbox_domains = pgsql:/etc/postfix/virtual_mailbox_domains.cf

# query to find which email addresses we accept mail for
virtual_mailbox_maps = pgsql:/etc/postfix/virtual_mailbox_maps.cf

# query to find a user's email aliases
virtual_alias_maps = pgsql:/etc/postfix/virtual_alias_maps.cf

virtual_alias_domains = 
alias_database = 
alias_maps = 

mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
inet_interfaces = all
Run Code Online (Sandbox Code Playgroud)

Rub*_*amp 5

简答

您的postfix配置不必要地复杂。似乎您的配置中的某些限制要么相互否定,要么限制太多,以至于您可能需要ssh进入服务器并手动发送每封外发邮件。

这个答案将提供一个概述,而不是通过发布的配置,为大多数目的配置一个合理安全的电子邮件系统通常需要什么。它并不是关于如何配置每个组件的详尽教程。但是,最后有一个在线资源列表,我发现这些资源在配置我自己的电子邮件服务器时非常有用和有价值。

您的评论中有一些额外的要求不会得到解决,例如使用单个postfix安装处理多个域。假设一个相当熟练的管理员将能够调整设置并添加必要的多域配置元素。

现代小型电子邮件服务提供商的要素概览

与安全和声誉相关的电子邮件标题的图形视图

现代电子邮件系统已经发展到包括许多与安全和域相关的声誉元素。也许最简单的开始方法是查看电子邮件标题中包含的一些更重要的新元素的图表。

电子邮件标题图

保护域免受欺骗尝试和声誉问题

需要配置三个基本组件,以确保似乎来自域的电子邮件流量的真实性。

这些是:

  1. 发件人政策框架(SPF)
  2. 域密钥识别邮件(DKIM)
  3. 基于域的消息身份验证报告和一致性(DMARC)

其中每一个都有一个在服务器上运行的守护进程以及用于连接服务器的 DNS 记录,以便自动检查域策略和验证加密签名。

  • 简单的SPF解释:

Postfix 通过 SPF 守护进程传递外发电子邮件,该守护进程评估发件人是否与外发邮件策略匹配。接收邮件服务器从 DNS 中检索域的 SPF 记录,并根据发送服务器放置在电子邮件上的 SPF 标头检查该记录。

后缀兼容的 SPF 实现

  • 简单的 DKIM 解释:

Postfix 通过 DKIM 守护程序传递外发电子邮件,该守护程序会自动签署邮件并在电子邮件标头中包含邮件的哈希值。接收邮件服务器从 DNS 记录中检索域的 DKIM 公钥并验证邮件的正文哈希。

后缀兼容的 DKIM 实现

  • 简单的 DMARC 解释:

接收邮件服务器从 DNS 检索 DMARC 策略记录并接受或拒绝邮件或执行邮件的软失败。

后缀兼容的 DMARC 实现

即使您的域未发送任何电子邮件,输入“拒绝”DMARC 策略记录也被视为最佳安全实践

SPF、DKIM 和 DMARC 的 DNS 条目示例

MX  10  mail.domain.tld.

TXT "v=spf1 a:mail.domain.tld -all"

mail._domainkey IN  TXT ( "v=DKIM1; h=sha256; k=rsa; "
  "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0w7N0fWtTndtlR+zOTbHyZOlvFiM73gyjjbHDN1OhhcPCbhRUqTsA7A8uXHGHao6nZ5qejlVtn6NfZwbn7rdhJ0MTjlgTnTsVa8E9rgS6dFo0bEIzeFecDr/4XOF9wpNjhHlnHm4wllkPheFnAWpZQiElZeYDN5Md47W1onwZ3DwcYJNX/3/GtfVZ0PrjisC4P0qeu+Z8jIgZc"
  "MLvBm8gj2pX3V6ntJY9QY09fWSVskvC6BQhi6ESOrqbM63f8ZJ4N/9ixPAMiD6k/lyGCokqc6sMuP6EC7z5McEOBbAVEuNy3idKi1sjwQH8WZHrvlSBlzx1wwmpFC1gqWcdTiEGwIDAQAB" )  ; ----- DKIM key mail for domain

_dmarc  IN TXT v=DMARC1;p=reject;sp=reject;fo=0:d;adkim=s;aspf=s;rua=mailto:webmaster@domain.tld;ruf=mailto:webmaster@domain.tld;

_domainkey IN TXT o=-;
Run Code Online (Sandbox Code Playgroud)

您可能会注意到名为 DNS 的记录mail._domainkey包含一个加密公钥。可以使用在服务器上opendkim-genkey安装opendkim软件包时安装的程序生成此密钥和相关记录。

密钥生成相当简单:

opendkim-genkey -b 2048 -d yourdomain -h sha256 -s mail

此命令将生成私钥、公钥和格式正确的 DNS 记录。私钥需要放在 opendkim 配置中列出的目录中。而公钥及其关联的 DNS 记录放置在您域的 DNS 区域文件中。不幸的是,一些 DNS 提供商对记录有长度限制。因此,请确保您的 DNS 提供商可以容纳公钥的长度。

添加 SPF 和 DKIM Milters

防晒指数

摘自policyd-spf手册页:

后缀集成

1. Add the following to /etc/postfix/master.cf:

           policyd-spf  unix  -       n       n       -       0       spawn
               user=policyd-spf argv=/usr/bin/policyd-spf

2. Configure the Postfix policy service in /etc/postfix/main.cf:

           smtpd_recipient_restrictions =
               ...
               reject_unauth_destination
               check_policy_service unix:private/policyd-spf
               ...
           policyd-spf_time_limit = 3600
Run Code Online (Sandbox Code Playgroud)

DKIM

opendkim上一个UNIX套接字是配置无论是作为一个标准的UNIX套接字或运行的守护进程运行的inetd服务端口。在我的 Debian 安装中,此配置位于/etc/default/opendkim. 一旦opendkim运行时,雄鱼需要被添加到postfix配置中/etc/postfix/main.cf

这是来自工作服务器的示例:

# DKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
Run Code Online (Sandbox Code Playgroud)

DMARC

对于小型或个人电子邮件服务器,DMARC 可以简单地限于 DNS 记录。DMARC 检查守护程序允许根据发送域的策略拒绝传入邮件,以及将任何请求的报告发送回发送域。该报告被认为是“乖巧的邻居”。但是,我通常不会为小型或个人系统启用它,因为配置开销非常高。

然而,DMARC DNS 记录对于维护域声誉非常重要。所有现代大型电子邮件提供商都使用该记录来接受或拒绝似乎来自您的域的邮件。因此,如果没有 DMARC 记录,所有看起来像是由您的域发送的传入邮件都会计入您域的声誉评分。因此,根本不希望发送任何邮件的域应该发布“拒绝”DMARC 记录,以避免垃圾邮件发送者发送的欺骗邮件造成声誉问题。

电子邮件服务器和客户端的 TLS 连接

您的配置信息表明您正在运行 Dovecot 和 Postfix。

Dovecot 与服务器上的 Postfix 连接。在许多小型安装中,服务器连接是通过 Unix 套接字在相同的物理/逻辑硬件上执行的。

因此,邮件用户代理 (MUA) 连接由中间件处理,而不是由实际的邮件服务器处理。在您的情况下,那将是 Dovecot。

应在 Dovecot 中正确启用和设置 TLS,以便从 MUA(例如:Evolution、Sylpheed、Mutt 等)安全地传输您的用户名和密码。

如需参考,请参阅Dovecot 的 TLS 设置文档

“服务器到服务器”或“中间件”到 postfix 连接有可能但不是必需的,使用相同的 TLS 证书进行加密。但是,在小型电子邮件服务器的情况下,后缀连接的“中间件”不一定需要加密,因为它位于相同的硬件上。

为您的邮件服务器和 MUA 接口(POP3、IMAP 等)获取 LetsEncrypt TLS 证书

LetsEncrypt项目已经做了很好的工作得到简化验证域TLS证书。假设您的域已经有证书,您可以使用该--expand选项将邮件服务器的子域添加到证书中。

  1. 停止 postfix 和 dovecot 服务。
  2. 停止 Web 服务器(如果正在运行)。
  3. 停止当前包含在证书中的任何正在运行的服务。
  4. 展开证书

certbot certonly --expand -d domain.tld,www.domain.tld,mail.domain.tld

然后将证书路径添加到您的main.cf配置中。

smtpd_tls_key_file = /etc/letsencrypt/live/domain.tld/privkey.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/domain.tld/fullchain.pem
Run Code Online (Sandbox Code Playgroud)

根据上面列出的 Dovecot 文档,还将证书路径添加到您的 Dovecot 配置中。

  1. 重新启动所有服务并检查配置是否有效。

需要注意的是,SMTP TLS 连接是您的服务器与其他服务器的连接。同时,Dovecot TLS 连接通常是某人为了从非网络邮件客户端发送电子邮件而连接的连接。

SMTP 服务器到服务器 TLS 兼容性设置

一些邮件服务器仍然没有对从其他服务器接收的邮件使用 TLS 加密连接。在这种情况下,严格的 TLS 实施将导致无法将邮件发送到这些服务器和域。但是,如果连接没有使用 TLS 保护,许多大型电子邮件提供商会将传入的电子邮件标记为可疑。因此,为了保持最佳兼容性,请在您的/etc/postfix/main.cf

smtpd_tls_security_level = may

同样重要的是要注意,大多数电子邮件提供商不需要此服务器到服务器的连接来使用 CA 批准的证书,即使证书是 CA 批准的,通常也不会执行验证检查。

但是,Dovecot 中包含的 TLS 证书应该是 CA 批准的。使用最MUA的,如当一个达夫科特自签名的证书将导致警告sylpheedevolutionthunderbird

合理的 SMTP 客户端限制

根据我的经验,可以通过 SPF、DKIM 检查和 RBL 检查拒绝 99% 的垃圾邮件。

这是我的“标准”客户端限制的一部分。需要注意的是,这些限制是按顺序处理的。根据我的经验,我下面的顺序非常有效:

smtpd_client_restrictions = permit_mynetworks 
                permit_sasl_authenticated
                            check_helo_access hash:/etc/postfix/helo_access
                            check_client_access hash:/etc/postfix/client_checks 
                            reject_unauth_destination
                            check_policy_service unix:private/policy-spf
                            reject_rbl_client cbl.abuseat.org
                            reject_rbl_client pbl.spamhaus.org
                            reject_rbl_client sbl.spamhaus.org
                            reject_rbl_client bl.blocklist.de
                            reject_unknown_client 
Run Code Online (Sandbox Code Playgroud)

SMTPD 客户端限制兼容性设置

将有最多例外的限制将是reject_unknown_client设置。许多在线服务没有正确配置它们的反向域和/或使用一系列可能映射也可能不正确映射的发送域。因此,为了与配置不当的电子邮件提供商的最大兼容性,请删除该限制。

但是,几乎 100% 的垃圾邮件都是从没有正确反向域记录的电子邮件服务器发送的。

HELO 检查

垃圾邮件发送者通常会尝试通过发送您的域名或 IP 地址或本地主机来欺骗 HELO。可以使用check_helo_access如上所示的选项立即拒绝这些欺骗尝试。HELO 文本数据库由域名或 IP 地址或 IP 地址范围组成,后跟操作和要发回的消息。

一个相当简单的 HELO 检查如下:

# helo access
# check_helo_access hash:/etc/postfix/helo_access

localhost             REJECT Only I am me
127.0.0.1             REJECT Only I am me
example.com           REJECT Only I am me
dns.host.ip.addr      REJECT Only I am me
Run Code Online (Sandbox Code Playgroud)

“example.com”是您的域,“dns.host.ip.addr”是您服务器的 DNS 列出的 IP 地址。

这个数据库示例从我的实际服务器日志中产生了类似的结果:

Oct 30 06:32:49 <domain> postfix/smtpd[22915]: NOQUEUE: reject: RCPT from xxx-161-xxx-132.dynamic-ip.xxxx.net[xxx.161.xxx.132]: 554 5.7.1 <xxx.xxx.xxx.xxx>: Helo command rejected: Only I am me; from=<dlh@xxx.xxx.cq.cnt> to=<gogo@xxxx.com.tw> proto=SMTP helo=<xxx.xxx.xxx.xxx>
Run Code Online (Sandbox Code Playgroud)

潜在的垃圾邮件发送者/欺骗者收到消息“只有我是我”。消息是什么并不重要,但至少垃圾邮件发送者/欺骗者知道您知道。

确保postfix使用以下方法生成数据库:

postmap helo_access

通过 client_check 白名单向限制添加例外

个人客户检查是这样的:

ip.addr.hack.attmpt  REJECT
misconfig.server.but.good  OK
Run Code Online (Sandbox Code Playgroud)

确保postfix使用以下方法生成数据库:

postmap client_checks

就是这样。我每个月收到大约 3 封垃圾邮件,数百封垃圾邮件被拒绝。

资源

  1. DMARC/SPF 策略评估器
  2. DKIM 公钥评估器
  3. MxToolbox 网站
  4. 电子邮件安全分级器