阻止发送到 Postfix 中不存在的地址的电子邮件

阻止发送到 Postfix 中不存在的地址的电子邮件

我们已将 postfix 设置为网关,用于过滤邮件并将其转发到我们的 Exchange 服务器。如果不设置 LDAP,我是否可以定义一个有效地址列表,以便 postfix 可以拒绝发往我们域的所有内容,但不会拒绝发往有效用户或别名的所有内容?

即,我想指定有效电子邮件列表。如果 RCPT TO 是这些电子邮件以外的任何内容,则拒绝它。我计划使用 fail2ban 将这些 IP 防火墙关闭一小时,作为对目录收集攻击尝试的惩罚。

答案1

这最终变得非常简单。

简而言之:

  1. 使用 PowerShell 从 Exchange 中导出您的电子邮件地址列表。
  2. 清理该列表,以便可以进行后期映射。
  3. 创建一条规则来根据该列表验证收件人。

具体来说:在 Exchange EMS 中,运行以下命令:

Get-Mailbox -Resultsize Unlimited | Ft EmailAddresses

如果您的电子邮件列表很大,那么您可能希望使用此命令稍微宽松一些,并获取一个 CSV 文件。这对我来说很有效,因为我们只有大约 50 个,并且使用 Sublime Text 和正则表达式很容易缩减这个数量。

使用此列表,我删除了列表中除 SMTP 地址之外的所有内容,每行保留一个。

接下来,在 Sublime 中,我在地址后的每一行都添加了“OK”。示例:

[email protected]  OK

然后,我将其复制到 Postfix 服务器作为 /etc/postfix/access-inbound

然后,我运行了以下命令:

root@gateway:/etc/postfix/# postmap /etc/postfix/access-inbound

这将在运行的目录中创建 access-inbound.db。(注意以上内容!我在 /etc/postfix 中执行了此操作)。

现在,剩下的就是告诉 Postfix 使用此文件验证发件人。我在 smtpd_recipient_restrictions 中执行了此操作。请注意,下面的指令包含很多内容。我将其他配置留在那里以提供上下文。首先,此配置将发件人与白名单进行比较,然后对该白名单发件人执行传递操作。然后,它会执行所有其他检查。

最后,在底部你会看到:

check_recipient_access hash:/etc/postfix/access-inbound,

这告诉 postfix:“如果收件人在这个列表中,则接受邮件”。 (实际上,它说:“如果收件人在这个列表中,则按照列表所说的操作。但是,在这种情况下,我们所有有效的电子邮件都有一个“OK”响应,因此对于新手搜索者来说,前者更容易考虑)。

最后,在底部,你会看到拒绝。这意味着:“如果您已完成所有这些检查,但上述检查均未给您“同意”接受邮件的答复,则拒绝该邮件。”

smtpd_recipient_restrictions = check_sender_access mysql:/etc/postfix/whitelist.cf,
    check_sender_access mysql:/etc/postfix/shortcircuit.cf,
    reject_unverified_recipient,
    reject_invalid_hostname,
    reject_unauth_pipelining,
    reject_unknown_recipient_domain,
    reject_unauth_destination,
    permit_mynetworks,
    permit_sasl_authenticated,
    check_recipient_access hash:/etc/postfix/access-inbound,
    reject

相关内容