我在一些设置好的邮件服务器上看到过,它们在出错后立即终止连接
454 4.7.1 <[email protected]>: Relay access denied
这可能节省了大量资源和流量。而且我的 Postfix 仍然为将来的命令打开 SMTP 会话,这些命令可能只是垃圾邮件。
在向垃圾邮件发送者发出此错误后,我如何告诉 Postfix 终止会话(如那些智能服务器)?
信息
后缀版本 2.10.1
的输出
postconf -n
[root@mail ~]# postconf -n config_directory = /etc/postfix header_checks = pcre:/etc/postfix/header_check inet_protocols = ipv4 local_recipient_maps = mydestination = example.com, $myhostname, localhost.$myhostname, $mydomain, localhost.$mydomain mydomain = example.com myhostname = mail.example.com mynetworks = 127.0.0.0/8 10.0.0.0/16 myorigin = example.com relay_domains = example.com smtpd_banner = $myhostname ESMTP smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, reject_invalid_hostname, reject_unauth_pipelining, reject_non_fqdn_sender, reject_unknown_recipient_domain, reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/access smtpd_sender_restrictions = check_recipient_access hash:/etc/postfix/recipients, reject_non_fqdn_sender, reject_rhsbl_sender blackhole.securitysage.com, reject_unknown_sender_domain transport_maps = hash:/etc/postfix/transport
关于这个问题,我有好消息和坏消息要告诉你。
好消息是 Postfix 确实具有在客户端行为不端时断开连接的机制。它记录在此页面上。三个参数控制行为:smtpd_soft_error_limit、smtpd_hard_error_limit、smtpd_error_sleep_time。这个伪代码将说明它是如何工作的。
注意:在后缀术语中,
ERROR*
当客户端请求无法识别或未实现、客户端请求违反访问限制或发生其他错误时触发。看,如果我们设置
smtpd_hard_error_limit
1,postfix 会在错误发生时愉快地断开客户端。坏消息是我们无法过滤触发 smtpd_hard_error_limit 的错误。您将这种断开连接行为限制为错误的意图
Relay Access Denied
无法实现。设置smtpd_hard_error_limit
为 1 后,每个错误都像或者
将导致客户端断开连接。后缀文档说明了
smtpd_hard_error_limit = 1
.替代解决方案
对于类似僵尸客户端的替代解决方案,您可以在 postfix 中启用 postscreen。Postscreen 将为 smtpd 进程添加一层,因此服务器应该处理合法的客户端。请参阅此处和此处的文档
为什么我的服务器显示错误 4XX 而不是 5XX?
Postfix 2.10 引入了一个名为
smtpd_relay_restriction
. 您可以阅读postconf(5)中的文档。默认情况下,此参数具有值参数
defer_unauth_destination
将抛出错误 4xx 而不是 5xx。最好的建议是将限制拆分为两个参数 smtpd_relay_restriction 和 smtpd_recipient_restriction。但是,如果您坚持保留旧配置(例如,仅在 smtpd_recipient_restriction 中),您可以将 smtpd_relay_restriction 设置为空
main.cf