告诉 Postfix 在“中继访问被拒绝”后立即关闭连接

告诉 Postfix 在“中继访问被拒绝”后立即关闭连接

我见过一些设置良好的邮件服务器,它们在出现错误后立即终止连接

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_limitsmtpd_hard_error_limitsmtpd_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 = 

相关内容