直到最近,我的 Postfix 服务器运行良好。然后我实施了一些限制,以a)打击垃圾邮件b)禁止以我自己的名义向我发送电子邮件——我已经开始从我自己的电子邮件地址接收电子邮件,要求将比特币发送给某人。
我想同时修复a和b。
现在我无法通过我自己的 postfix 服务器发送电子邮件。
Client host rejected: cannot find your reverse hostname, [<my ip here>]
请注意,我将笔记本电脑带到不同的地方和国家,并从这些地方连接到 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
答案1
简答
您的postfix
配置不必要地复杂。看来您的配置中的某些限制要么相互抵消,要么限制性太强,以至于您可能需要ssh
进入服务器并手动发送每封外发邮件。
该答案将概述为大多数目的配置相当安全的电子邮件系统通常需要什么,而不是浏览发布的配置。它并不是关于如何配置每个组件的详尽教程。不过,最后有一个在线资源列表,我发现这些资源对于配置我自己的电子邮件服务器非常有用且有价值。
您的评论中有一些额外的要求将不会得到解决,例如使用单个postfix
安装处理多个域。假设相当熟练的管理员将能够调整设置并添加必要的多域配置元素。
现代小型电子邮件服务提供商要素概述
安全和声誉相关电子邮件标头的图形视图
现代电子邮件系统已经发展到包含许多安全和领域相关的信誉元素。也许最简单的开始方法是查看电子邮件标题中包含的一些更重要的新元素的图表。
保护域免受欺骗尝试和声誉问题
为了确保似乎源自域的电子邮件流量的真实性,需要配置三个基本组件。
这些都是:
- 发件人政策框架(防晒指数)
- 域密钥识别邮件(DKIM)
- 基于域的消息身份验证报告和一致性(DMARC)
其中每一个都有一个在服务器上运行的守护程序以及用于连接服务器的 DNS 记录,以便自动检查域策略和验证加密签名。
- 简单的SPF解释:
Postfix 通过 SPF 守护进程传递外发电子邮件,该守护进程评估发件人是否符合外发邮件策略。接收邮件服务器从 DNS 检索域的 SPF 记录,并根据发送服务器放置在电子邮件上的 SPF 标头检查该记录。
- 简单的DKIM解释:
Postfix 通过 DKIM 守护进程传递外发电子邮件,该守护进程会自动对邮件进行签名,并在电子邮件标头中包含邮件的哈希值。接收邮件服务器从 DNS 记录中检索域的 DKIM 公钥并验证邮件的正文哈希。
- 简单的 DMARC 解释:
接收邮件服务器从 DNS 检索 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:[email protected];ruf=mailto:[email protected];
_domainkey IN TXT o=-;
您可能会注意到,名为的 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
SPF
手册页摘录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
德基姆
该opendkim
守护程序在 UNIX 套接字上运行,该套接字可配置为标准 UNIX 套接字或在inetd
服务端口上运行。在我的 Debian 安装中,此配置位于/etc/default/opendkim
.运行后opendkim
,需要将 milter 添加到postfix
中的配置中/etc/postfix/main.cf
。
这是来自工作服务器的示例:
# DKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
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 证书
这让我们加密项目在简化获取域验证 TLS 证书方面做得非常好。假设您的域已经有证书,您可以使用该--expand
选项将邮件服务器的子域添加到证书中。
- 停止 postfix 和 dovecot 服务。
- 如果 Web 服务器正在运行,请停止该服务器。
- 停止当前包含在证书中的任何正在运行的服务。
- 展开证书
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
并且根据上面列出的 Dovecot 文档,将证书路径添加到 Dovecot 配置中。
- 重新启动所有服务并检查配置是否有效。
应该注意的是,SMTP TLS 连接是您的服务器与其他服务器建立的连接。然而,Dovecot TLS 连接通常是人们为了从非网络邮件客户端发送电子邮件而连接的连接。
SMTP 服务器到服务器 TLS 兼容性设置
某些邮件服务器仍然没有对从其他服务器收到的邮件使用 TLS 加密连接。在这种情况下,严格的 TLS 强制执行将导致邮件无法投递到这些服务器和域。但是,如果连接未使用 TLS 进行保护,许多大型电子邮件提供商会将传入电子邮件标记为可疑。因此,为了保持最佳兼容性,请在您的应用程序中包含以下设置/etc/postfix/main.cf
smtpd_tls_security_level = may
还需要注意的是,大多数电子邮件提供商不需要此服务器到服务器的连接来使用 CA 批准的证书,并且即使证书经过 CA 批准,通常也不会执行验证检查。
但是,Dovecot 中包含的 TLS 证书应获得 CA 批准。当使用大多数 MUA(例如sylpheed
、evolution
或 )时,Dovecot 中的自签名证书将导致警告thunderbird
。
合理的 SMTP 客户端限制
根据我的经验,99% 的垃圾邮件可以通过 SPF、DKIM 检查以及 RBL 检查来拒绝。
这是我的“标准”客户端限制的一部分。需要注意的是,这些限制是按顺序处理的。根据我的经验,下面的顺序非常有效:
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
SMTPD 客户端限制兼容性设置
最有例外的限制是reject_unknown_client
设置。许多在线服务没有正确配置其反向域和/或利用一系列可能或可能未正确映射的发送域。因此,为了与配置不当的电子邮件提供商实现最大兼容性,请删除该限制。
然而,近 100% 的垃圾邮件是从没有正确反向域记录的电子邮件服务器发送的。
直升机检查
垃圾邮件发送者通常会尝试通过发送您的域名、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
“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=<[email protected]> to=<[email protected]> proto=SMTP helo=<xxx.xxx.xxx.xxx>
潜在的垃圾邮件发送者/欺骗者会收到“只有我是我”的消息。消息是什么并不重要,但至少垃圾邮件发送者/欺骗者知道您知道。
确保postfix
使用以下命令生成数据库:
postmap helo_access
通过 client_check 白名单添加限制例外
个人客户检查是这样的:
ip.addr.hack.attmpt REJECT
misconfig.server.but.good OK
确保postfix
使用以下命令生成数据库:
postmap client_checks
就是这样。我每个月收到大约 3 封垃圾邮件,其中有数百封被拒绝。
资源
答案2
对端口 587 上的提交接口(MSA - 邮件提交代理)使用不同的限制,例如(摘录master.cf
):
submission inet n - - - - smtpd
-o smtpd_enforce_tls=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sender_restrictions=reject_authenticated_sender_login_mismatch
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
它强制 STARTTLS 并仅在身份验证后启用发送,这是最简单的方法。您还可以使用评论中建议的 VPN 或类似设备,并使用此方法将您的 IP/范围列入白名单。
建议对 MSA(端口 587)和 MTA(邮件传输代理,端口 25、465)使用不同的端口,因为您需要对它们进行不同的设置。
这是一个最小的例如,将其扩展到您的需要。