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)
您的postfix
配置不必要地复杂。似乎您的配置中的某些限制要么相互否定,要么限制太多,以至于您可能需要ssh
进入服务器并手动发送每封外发邮件。
这个答案将提供一个概述,而不是通过发布的配置,为大多数目的配置一个合理安全的电子邮件系统通常需要什么。它并不是关于如何配置每个组件的详尽教程。但是,最后有一个在线资源列表,我发现这些资源在配置我自己的电子邮件服务器时非常有用和有价值。
您的评论中有一些额外的要求不会得到解决,例如使用单个postfix
安装处理多个域。假设一个相当熟练的管理员将能够调整设置并添加必要的多域配置元素。
现代电子邮件系统已经发展到包括许多与安全和域相关的声誉元素。也许最简单的开始方法是查看电子邮件标题中包含的一些更重要的新元素的图表。
需要配置三个基本组件,以确保似乎来自域的电子邮件流量的真实性。
这些是:
其中每一个都有一个在服务器上运行的守护进程以及用于连接服务器的 DNS 记录,以便自动检查域策略和验证加密签名。
Postfix 通过 SPF 守护进程传递外发电子邮件,该守护进程评估发件人是否与外发邮件策略匹配。接收邮件服务器从 DNS 中检索域的 SPF 记录,并根据发送服务器放置在电子邮件上的 SPF 标头检查该记录。
Postfix 通过 DKIM 守护程序传递外发电子邮件,该守护程序会自动签署邮件并在电子邮件标头中包含邮件的哈希值。接收邮件服务器从 DNS 记录中检索域的 DKIM 公钥并验证邮件的正文哈希。
接收邮件服务器从 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: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 记录,以避免垃圾邮件发送者发送的欺骗邮件造成声誉问题。
您的配置信息表明您正在运行 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
选项将邮件服务器的子域添加到证书中。
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 配置中。
需要注意的是,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
或thunderbird
。
根据我的经验,可以通过 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 封垃圾邮件,数百封垃圾邮件被拒绝。