我们有以下电子邮件拓扑:
Exchange server --------- Sendmail server ---------------Internet
在 sendmail 服务器上没有任何用户邮箱,带有发件人地址的邮件[email protected]
只能从 Exchange 服务器到达,而不能从 Internet 到达。基于这一事实,我想通过拒绝所有来自 Internet 并声称来自我自己的域 ( ) 的电子邮件来限制收到的垃圾邮件数量[email protected]
。
我已经为我的域配置了 SPF 记录,并在 sendmail 服务器上安装了 spfmilter、spamassassin 和 spamass-milter 包。它运行良好,但有两个问题:
如果在 SMTP 对话期间,发件人在“
MAIL FROM:
”命令中指定了错误的地址,该邮件将被拒绝,但发件人仍然可以发出另一个“MAIL FROM:
”命令,如果第二个地址被接受,则整个邮件也将被接受。我更希望发件人没有第二次机会,如果他指定的最后一个地址被 spfmilter 拒绝,则整个邮件应无条件被拒绝。如果发件人指定了有效地址(spfmilter 接受),它可以发出
DATA
命令,然后放置一行(作为邮件正文),例如“ ”。此行不是 SMTP 对话的一部分,但它成为邮件标题的一部分(我的 Outlook 将此地址显示为发件人地址)。因此,我想配置 spamassassin 过滤器测试/规则,如果邮件标题中给出的发件人地址与 SMTP 对话中指定的地址不匹配,它将邮件标记为垃圾邮件(在 DATA 命令之后,拒绝邮件已经太晚了),但不知道如何做到这一点。From: <[email protected]>
有什么建议么?
答案1
我使用配置了 mysql 的 Exim 来过滤我的电子邮件。我发现配置起来更容易。Sendmail 的配置对我来说一直很神秘。
为了防止发件人更改 mail_from 身份并重试,您需要将他们的 IP 地址添加到黑名单并强制执行黑名单。如果您可以让过滤器断开连接而不是拒绝 mail_from,那么他们将需要重新连接以更改 mail_from 地址。我认为很多发件人不会这样做。我会检查我的数据库并稍后更新。
以下规则将检查发件人地址是否在“example.com”域内。将这些行添加到 local.cf 文件并重新启动 spamassassin。当您确信它正常工作时,增加分数。这假定您没有使用 spamassassin 来发送邮件。
标题 LOCAL_FROM_HERE 来自 =~ /[.@]example.com/ LOCAL_FROM_HERE 分数 -0.75 描述 LOCAL_FROM_HERE 来自标题是本地地址
编辑:我对电子邮件数据库进行了一些查询。在 MAIL FROM 命令中使用本地地址的 2500 个连接中,只有 28 个使用非本地地址重试。这大约是拒绝在 MAIL FROM 命令中使用本地地址的失败率的 1%。我没有发现服务器重新连接并尝试非本地地址的情况。
假设在 spamassassin 过滤邮件之前添加了 Envelope_from 标头,则这两个条件可以合并到 local.cf 中的单个黑名单条目中。同样,这假设您不在外发电子邮件上运行 spamassassin。
blacklist_from *@example.com
编辑 2:如果地址中使用了本地域,我会在 Exim 中使用 ACL 来拒绝 Mail From 命令。如果连接主机不是我认为是本地的主机,则适用此规则。本地主机包括本地网络上的服务器、已批准的中继以及在提交端口 (587) 上使用经过身份验证的连接的主机。
答案2
使用密钥管理信息系统. 它类似于 SPF 记录,但它显示公钥。您的服务器使用私钥对来自您域的电子邮件进行签名
identificator._domainkey.mydomain.com. IN txt "/*spf*/" +" v=DKIM1; k=rsa; p=MIG......endofkey" //BIND9
并在 ACL 中设置为验证所有声称来自你的域的传入邮件的 DKIM 签名
Dkim 是为了解决您的问题而开发的(钓鱼:))
答案3
对问题+1。
这听起来像非常常见的场景是应该有大量的 sendmail 插件。
当然你应该有dkim-milter
和spfmilter
,但它们并没有解决这个问题,这听起来很容易,只要添加你自己的过滤器来拒绝任何符合类似条件的邮件就可以了egrep -e '^From: *@my.domain.com'
密钥管理信息系统很好,但如果邮件没有签名,你不能因为签名不好而失败。那么你必须因为缺少签名而失败和声称来自您的域。