Postfix 如何与代理过滤器一起使用策略服务

Postfix 如何与代理过滤器一起使用策略服务

在 Debian 上使用 postfix 2.9,我已配置了队列前代理过滤器,用于扫描垃圾邮件和病毒smtpd_proxy_filter=127.0.0.1:27。我使用的是代理过滤器而不是内容过滤器,这样我可以直接拒绝电子邮件(使用队列后内容过滤器,我只能丢弃电子邮件并可选择向伪造的发件人地址发送反向散射)。

我还想使用策略服务来限制每个 SASL 用户名发送的电子邮件数量。这是在smtpd_recipient_restrictions之前配置的permit_sasl_authenticated。策略守护进程工作正常,但 postfix 抱怨它无法保留电子邮件,并显示以下消息:

warning: access table inet:127.0.0.1:10031: with smtpd_proxy_filter
specified, action HOLD is unavailable

根据此线,这不可能直接实现:

要使用 smtpd_proxy_filter 保留邮件,请在过滤器之后使用 smtpd 进程指定保留操作。

我已经尝试过,但是当我将策略服务放在代理过滤器之后的 smtpd 守护进程上(在我的情况下是端口 26 上的 smtpd)时,它没有获取任何 SASL 信息(通过 tcpdump 确认)。

smtpd :25 ---> before-queue proxy localhost:27 ---> smtpd localhost:26

那么我该如何结合这两项检查呢?

编辑:也许嵌套的队列前过滤器会起作用?然后我需要使用不同的程序进行 SASL 检查,或者进行一些过滤器/策略协议重写...

答案1

最后,我终于想出了一个有效的解决方案,尽管这是一个两步方法。

首先,我修改了策略守护进程(postfix cluebringer v2)配置以返回前置指令而不是 HOLD。我添加了一个特殊标头,稍后将对其进行评估:PREPEND X-cust-policy: Hold。即使与队列前代理过滤器结合使用,它也能正常工作。

其次,我使用了指令header_checkspcre:/etc/postfix/header_holdmain.cf检查我稍后添加的内容。此检查由cleanup(8)邮件进入队列之前,守护进程会对其进行处理。因此,在电子邮件通过包括策略守护进程在内的所有检查后,它将通过队列前过滤器,然后由cleanup(8)守护进程。通常它应该将消息放入传入队列,但当它找到此标题时,邮件将直接放入抓住队列。

以下是PCRE 表文件/etc/postfix/header_hold

### PCRE format, no postmap command!
# Hold all email with specified header (which is inserted by policy service)
/^X-cust-policy: Hold/    HOLD

唯一需要注意的是,基于标题的检查也会在退回无法送达的邮件时触发(但从抓住队列将被退回)。

另外,我必须更新 cluebringer webui 来支持 Quotas 模块的 PREPEND 操作,尽管守护进程本身已经支持它了(Debian wheezy 中的版本)。

相关内容