上篇文章中我搭建好了Postfix+Dovecot,基本的收发邮件是没有问题的,但我搭建的这个邮件服务器目前可以说是这个现状:
发信:拒之门外(通通都飞进了人家的垃圾箱)
收信:来者不拒(SPAM/垃圾邮件通通都飞进了我的收件箱)
先来解决SPAM的问题。这里我选择使用Rspamd,因为它是一个性能非常好的高级反垃圾邮件工具,它可以与Postfix以及Dovecot整合起来实现很多功能。
这篇文章利用Rspamd将实现以下功能:
1.如果Rspamd检查某封邮件为垃圾邮件,这封邮件将自动滚进我的垃圾箱而不是收件箱。
2.使Rspamd支持根据用户行为来学习,不断完善自己的数据库,使检查垃圾邮件更为精准。
Postfix以及Dovecot的安装配置可以参考这里:
在这篇文章的基础上,继续下面的配置,首先安装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
最新评论
5211314
能不能教我 一点不会