欢迎光临
我们一直在努力

Rspamd与Postfix以及Dovecot的集成配置

上篇文章中我搭建好了Postfix+Dovecot,基本的收发邮件是没有问题的,但我搭建的这个邮件服务器目前可以说是这个现状:

发信:拒之门外(通通都飞进了人家的垃圾箱)
收信:来者不拒(SPAM/垃圾邮件通通都飞进了我的收件箱)

先来解决SPAM的问题。这里我选择使用Rspamd,因为它是一个性能非常好的高级反垃圾邮件工具,它可以与Postfix以及Dovecot整合起来实现很多功能。

这篇文章利用Rspamd将实现以下功能:

1.如果Rspamd检查某封邮件为垃圾邮件,这封邮件将自动滚进我的垃圾箱而不是收件箱。

2.使Rspamd支持根据用户行为来学习,不断完善自己的数据库,使检查垃圾邮件更为精准。

Postfix以及Dovecot的安装配置可以参考这里:

Debian10使用Postfix+Dovecot+Roundcube搭建邮件服务器

在这篇文章的基础上,继续下面的配置,首先安装rspamd/redis/dovecot-sieve:

wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add -
echo "deb [arch=amd64] http://rspamd.com/apt-stable/ buster main" > /etc/apt/sources.list.d/rspamd.list
echo "deb-src [arch=amd64] http://rspamd.com/apt-stable/ buster main" >> /etc/apt/sources.list.d/rspamd.list
apt -y update
apt -y install rspamd redis-server dovecot-lmtpd dovecot-sieve

先来配置Rspamd,编辑worker-normal.inc:

nano /etc/rspamd/local.d/worker-normal.inc

设置监听地址和端口:

bind_socket = "127.0.0.1:11333";

编辑worker-proxy.inc,让其可以与Postfix通信:

nano /etc/rspamd/local.d/worker-proxy.inc

写入如下配置:

bind_socket = "127.0.0.1:11332";
milter = yes;
timeout = 120s;
upstream "local" {
  default = yes;
  self_scan = yes;
}

设置Rspamd的WEB面板密码:

rspamadm pw

回显出来的密码复制一下,然后编辑这个文件:

nano /etc/rspamd/local.d/worker-controller.inc

把密码替换成你刚才生成的:

password = "yourpassword";

编辑classifier-bayes.conf,让Rspamd使用Redis作为后端存储数据:

nano /etc/rspamd/local.d/classifier-bayes.conf

写入如下配置:

servers = "127.0.0.1";
backend = "redis";

编辑milter_headers.conf,添加邮件Header:

nano /etc/rspamd/local.d/milter_headers.conf

写入如下配置:

extended_spam_headers = true;

编辑之前的Nginx配置文件:

nano /etc/nginx/conf.d/roundcube.conf

反代Rspamd的WEB面板:

    location /rspamd/ {
        proxy_pass http://127.0.0.1:11334/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

上面这段location加在如图所示位置即可:

重载Nginx使新配置生效:

systemctl reload nginx

重启/设置Rspamd开机自启:

systemctl restart rspamd
systemctl enable rspamd redis-server

Rspamd的配置就完成了,接下来是Postfix和Dovecot,这块配置起来会麻烦不少,如果不需要Rspamd根据用户行为来学习的话,可以省略后面的一些配置,自己根据需要来设置吧。

启用Postfix的LMTP,后续Dovecot需要使用LMTP与Postfix通信才能根据Rspamd给出邮件的Header执行Sieve脚本:

postconf -e "mailbox_transport = lmtp:unix:private/dovecot-lmtp"

让Postfix可以与Rspamd通信:

postconf -e "milter_protocol = 6"
postconf -e "milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}"
postconf -e "milter_default_action = accept"
postconf -e "smtpd_milters = inet:localhost:11332"
postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"

编辑Dovecot的主配置文件:

nano /etc/dovecot/conf.d/10-master.conf

修改LMTP配置:

service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0666
    user = postfix
    group = postfix
  }
}

由于我是使用的非虚拟用户,SASL验证不支持带@的用户名,所以编辑如下配置文件:

nano /etc/dovecot/conf.d/10-auth.conf

取消下面的注释并改为如下的配置,这样就可以把@以及域名去掉只留下用户名:

auth_username_format = %Ln

接着编辑20-lmtp:

nano /etc/dovecot/conf.d/20-lmtp.conf

启用LMTP的Sieve插件:

protocol lmtp {
  mail_plugins = sieve
}

继续编辑20-imap:

nano /etc/dovecot/conf.d/20-imap.conf

启用IMAP的Sieve插件:

protocol imap {
  mail_plugins = imap_sieve
}

Dovecot默认不会创建垃圾邮件的文件夹,这里要让它能够自动创建并订阅,编辑如下配置文件:

nano /etc/dovecot/conf.d/15-mailboxes.conf

修改成下面的配置:

namespace inbox {
  mailbox Drafts {
    auto = subscribe
    special_use = Drafts
  }
  mailbox Junk {
    auto = subscribe
    special_use = Junk
  }
  mailbox Trash {
    auto = subscribe
    special_use = Trash
  }
  mailbox Sent {
    auto = subscribe
    special_use = Sent
  }
  mailbox "Sent Messages" {
    special_use = Sent
  }
}

现在来添加Sieve的配置:

nano /etc/dovecot/conf.d/90-sieve.conf

使用下面的配置:

plugin {

  sieve_plugins = sieve_imapsieve sieve_extprograms
  sieve = file:~/sieve;active=~/.dovecot.sieve
  sieve_before = /usr/lib/dovecot/sieve/spam-to-folder.sieve

  # From elsewhere to Spam folder
  imapsieve_mailbox1_name = Junk
  imapsieve_mailbox1_causes = COPY
  imapsieve_mailbox1_before = file:/usr/lib/dovecot/sieve/report-spam.sieve

  # From Spam folder to elsewhere
  imapsieve_mailbox2_name = *
  imapsieve_mailbox2_from = Junk
  imapsieve_mailbox2_causes = COPY
  imapsieve_mailbox2_before = file:/usr/lib/dovecot/sieve/report-ham.sieve

  sieve_pipe_bin_dir = /usr/lib/dovecot/sieve

  sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
}

创建一个用于存放Sieve脚本的目录:

mkdir -p /usr/lib/dovecot/sieve

新建一个垃圾邮件自动进入垃圾箱的Sieve脚本文件:

nano /usr/lib/dovecot/sieve/spam-to-folder.sieve

写入如下配置:

require ["fileinto"];

if header :is "X-Spam" "Yes" {
        fileinto "Junk";
}

新建一个根据用户行为来学习垃圾邮件的Sieve脚本文件:

nano /usr/lib/dovecot/sieve/report-spam.sieve

写入如下配置:

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "sa-learn-spam.sh" [ "${username}" ];

新建一个根据用户行为来学习误判垃圾邮件的Sieve脚本文件:

nano /usr/lib/dovecot/sieve/report-ham.sieve

写入如下配置:

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.mailbox" "*" {
  set "mailbox" "${1}";
}

if string "${mailbox}" "Trash" {
  stop;
}

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "sa-learn-ham.sh" [ "${username}" ];

新建sa-learn-spam脚本:

nano /usr/lib/dovecot/sieve/sa-learn-spam.sh

写入如下配置:

#!/bin/sh
exec /usr/bin/rspamc -h 127.0.0.1:11334 learn_spam

新建sa-learn-ham脚本:

nano /usr/lib/dovecot/sieve/sa-learn-ham.sh

写入如下配置:

#!/bin/sh
exec /usr/bin/rspamc -h 127.0.0.1:11334 learn_ham

然后把Sieve脚本转为Dovecot可读的模式,以及给Shell脚本执行权限:

sievec /usr/lib/dovecot/sieve/spam-to-folder.sieve
sievec /usr/lib/dovecot/sieve/report-spam.sieve
sievec /usr/lib/dovecot/sieve/report-ham.sieve
chmod +x /usr/lib/dovecot/sieve/sa-learn-spam.sh
chmod +x /usr/lib/dovecot/sieve/sa-learn-ham.sh

重启Postfix以及Dovecot

systemctl restart postfix dovecot

至此就大功告成了,如果你的配置无法正常工作,打开Dovecot的Debug:

echo "mail_debug = yes" >> /etc/dovecot/conf.d/10-logging.conf

然后看相关日志文件排错:

tail -f /var/log/mail.log
tail -f /var/log/rspamd/rspamd.log

据我所知,Rspamd默认检查邮件的方式主要是4种:

1.邮件正常,直接进入收件箱,这个没什么好说的。

2.邮件直接被拒绝,Rspmad百分百肯定这是一封问题邮件的时候会执行此操作,邮件不会进到你的任何收件箱。

3.邮件被软拒绝(Greylist),Rspamd会根据公开的黑名单数据库检查对方的发信服务器IP等信息,如果在黑名单内就实行此操作,邮件也不会进到你的任何收件箱。

4.根据Rspamd内部的邮件评分检查机制(Probably Spam)分数达到你设置的一个值就会被判断为SPAM,Rspamd对此执行的操作是Add Header,既在邮件的Header上加一个X-Spam:Yes。告诉你这可能是一封垃圾邮件。

现在我们可以测试一下配置是否能够正常工作,先把评分标准改低一点,这样方便测试(毕竟我不会发垃圾邮件233)

对于评分达标的邮件直接放行(no action),对于评分不达标的,添加了Header:

去邮箱可以看到评分达标的在收件箱里:

不达标的在垃圾箱里:

测试Rspamd的根据用户行为学习的功能,将一封邮件从收件箱移动到垃圾箱,或者将一封垃圾箱的邮件移动到收件箱,可以看到Rspamd的WEBUI上Learned的计数增加,说明配置是正常的:

可能是邮件标本数量不够,这个Rspamd的学习功能貌似不太给力。下篇文章水一下利用Rspamd给邮件配置DKIM/DMARC,解决被拒之门外的问题233

参考文献:

https://wiki.dovecot.org/HowTo/PostfixDovecotLMTP
https://wiki.dovecot.org/MailboxSettings
https://wiki2.dovecot.org/HowTo/AntispamWithSieve
https://rspamd.com/doc/quickstart.html

赞(0)
未经允许不得转载:拆东墙 » Rspamd与Postfix以及Dovecot的集成配置

评论 抢沙发

登录

找回密码

注册