我见过一些设置良好的邮件服务器,它们在出现错误后立即终止连接
454 4.7.1 <[email protected]>: Relay access denied
这可能节省了大量的资源和流量。而且我的 Postfix 仍然保持 SMTP 会话打开,以便将来的命令,这些命令可能只会是垃圾邮件。
在向垃圾邮件发送者发出此错误后,我怎样才能告诉 Postfix 终止会话(像那些智能服务器一样)?
信息
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
答案1
关于这个问题,我有一个好消息和一个坏消息要告诉你。
好消息Postfix 确实有在客户端出现故障时断开连接的机制。它记录在这一页. 三个参数控制行为:smtpd_soft_error_limit,smtpd_hard_error_limit,smtpd_error_sleep_time。此伪代码将说明其工作原理。
While smtpd get connection from client
error_counter = 0
if there ERROR* in SMTP transaction
error_counter = error_counter + 1
if error_counter > $smtpd_soft_error_limit
show the error message with delay $smtpd_soft_error_delay
else if error_counter > $smtpd_hard_error_limit
DISCONNECT client
else
show the error message IMMEDIATELY
if one message transfered successfully
error_counter = 0 //reset the counter
注意:在后缀术语中,ERROR*
当客户端请求无法识别或未执行、当客户端请求违反访问限制或发生其他错误时触发。
看看,如果我们将其设置smtpd_hard_error_limit
为 1,当发生错误时,postfix 将很乐意断开客户端的连接。
坏消息是我们无法过滤触发 smtpd_hard_error_limit 的错误。你希望将此断开连接行为限制为Relay Access Denied
错误的意图无法实现。设置smtpd_hard_error_limit
为 1 后,每个错误,例如
Recipient access rejected, user not Found
或者
Sender address rejected: Domain not found;
将导致客户端断开连接。Postfix 文档时说明一些效果smtpd_hard_error_limit = 1
。
在压力条件下,使用 smtpd_hard_error_limit 为 1,而不是默认的 20。这有助于在出现单个错误后断开客户端的连接,让其他客户端有机会连接。但是,这可能会导致合法邮件的严重延迟,例如包含一些不再活跃的用户名且没有取消订阅的邮件列表。只要此措施只是暂时使用,就不会丢失任何邮件。
替代解决方案
对于僵尸客户端的替代解决方案,您可以在 Postfix 中启用 postscreen。Postscreen 将在 smtpd 进程中添加一层,以便服务器能够处理合法的客户端。请参阅这里和这里
为什么我的服务器显示错误 4XX 而不是 5XX?
Postfix 2.10 引入了一个名为的参数smtpd_relay_restriction
。您可以阅读文档postconf(5)。默认情况下,此参数具有值
smtpd_relay_restrictions =
permit_mynetworks
permit_sasl_authenticated
defer_unauth_destination
参数defer_unauth_destination
将抛出错误 4xx 而不是 5xx。
最好的建议是将限制分为 smtpd_relay_restriction 和 smtpd_recipient_restriction 两个参数。但是,如果您坚持保留旧配置(例如,仅在 smtpd_recipient_restriction 中),则可以将 smtpd_relay_restriction 设置为空main.cf
smtpd_relay_restriction =