如何使用Postfix设置垃圾邮件收发器,以防止发送到被困地址的客户端向我发送更多的垃圾邮件?
贝叶斯filter和模式匹配以及RBL都是对付垃圾邮件的一部分。 这个设置是为了增加而不是替代那些。
请注意,我不是灰名单。 灰名单在理论上是伟大的,但在实践中,这是非常恼人的用户。 有些人有很大的成功。 我不是那些人之一。
我所做的是设置一些电子邮件地址(我有大约10,000个,但你可以做几百个)作为垃圾邮件。 这些地址列表离散地链接到各种高stream量的网站,机器人会发现他们,但人们不会。 这些地址被收集,出售给垃圾邮件发送者,现在我知道垃圾邮件将进入哪里。
Postfix被configuration为将消息redirect到任何这些地址到我的spamtrap脚本,这些脚本将它们添加到PF中的一个表中,以便来自该客户端的任何进一步的消息最终在我的tarpit中。
优点:
缺点:
您的邮件服务器必须能够运行PF和垃圾邮件。 据我所知,这意味着OpenBSD或FreeBSD。 我确定这些说明可以适应Linux和他们的防火墙的风格,但这超出了我的答案范围。
我已经写了这个FreeBSD的。 OpenBSD用户应该能够通过改变path来适应这些步骤。
最后,这是所有Postfix 2.5+
表<spamd>坚持 表<本地 - 白名单>坚持文件“/usr/local/etc/spamd/local-whitelist.txt”
127.0.0.1 10.0.0.0/8 #亚马逊 207.171.168.0/24 207.171.180.0/24 207.171.187.0/24 207.171.188.0/24 207.171.190.0/24 #美国在线 64.12.137.0/24 64.12.138.0/24 152.163.225.0/24 205.188.139.0/24 205.188.144.0/24 205.188.156.66 205.188.157.0/24 205.188.159.7 # 苹果 17.254.6.0/24 #ebay 66.135.197.0/24 66.135.209.0/24 #gmail 64.68.80.0/21 64.233.160.0/19 64.233.162.192/28 64.233.170.192/28 64.233.182.192/28 64.233.184.192/28 66.249.82.192/28 66.249.92.192/28 66.249.64.0/19 66.102.0.0/20 70.89.39.152/29 70.90.219.48/29 70.90.219.72/29 72.14.192.0/18 74.125.0.0/16 209.85.128.0/17 216.239.32.0/19 216.239.56.240/28 #postini 63.146.199.13/32 63.146.199.14/32 63.71.11.123/32 63.71.11.124/32 64.18.0.0/20 67.114.133.222/32 68.123.185.46/32 74.125.148.0/22 204.14.232.0/22 207.126.144.0/20 208.111.151.5/32 208.74.204.5/32 #skynet.be 195.238.2.0/24 195.238.3.0/24 #雅虎 64.94.237.0/24 66.163.160.0/19 66.196.64.0/18 66.218.64.0/19 66.218.66.0/24 66.218.67.0/24 66.218.69.0/24 69.147.92.0/24 73.30.0.0/16 74.6.0.0/16 206.190.32.0/19 216.34.77.0/25 216.136.226.0/24
重新加载PF
创build/ usr / local / scripts / get-spamtrapped:
#!/bin/sh /usr/local/sbin/spamdb | grep TRAPPED | cut -d '|' -f 2
所有:uatraps:覆盖:nixspam:覆盖:spamtrapped:覆盖:
#阿尔伯塔大学greytrap命中。
#地址呆在里面24小时不正常。
uatraps:\
:黑色:\
:msg =“您的地址%A已经发送邮件到ualberta.ca spamtrap \ n \
在过去24小时内“:\
:方法= HTTP:\
:FILE = www.openbsd.org / spamd的/ traplist.gz:
#Nixspam最近的资源列表。
#从http://www.heise.de/ix/nixspam镜像
nixspam:\
:黑色:\
:msg =“您的地址%A在nixspam列表中\ n \
有关详细信息,请参见http://www.heise.de/ix/nixspam/dnsbl_en/“:\
:方法= HTTP:\
:FILE = www.openbsd.org / spamd的/ nixspam.gz:
#被困IPs - 所以我们可以阻止他们,而不使用灰名单
spamtrapped:\
:黑色:\
:msg =“您的地址%A已将邮件发送到此服务器上的垃圾邮件收据\ n \
在过去24小时内“:\
:方法= EXEC:\
:文件=在/ usr /本地/脚本/ GET-spamtrapped:
覆盖:\
:白色:\
:方法=文件:\
:文件=的/ usr /本地/ etc / spamd的/本地whitelist.txt:
obspamd_enable = “YES” obspamd_flags = “ - 5”
启动spamd:/usr/local/etc/rc.d/obspamd start
Cronjob以每小时一次的黑名单模式运行spamd-setup。 黑名单模式强制它更新<spamd> pf表而不是spamd的内部表。 由于垃圾邮件只是tarpitting和存储数据,其他一切都需要在PF。 (用任何你想要运行的时间来代替XX)
#spamd-setup XX * * * * root / usr / local / sbin / spamd-setup -b
$ sudo pw useradd spamtrap -s / sbin / lologin -d / home / spamtrap -m -c“垃圾邮件收集器”
#!/usr/local/bin/bash # rudimentary checking - more complex checking will be done by # the pfctl and spamdb commands ADDRESS=${1%%[!0-9.]*} if [[ ! ${#ADDRESS} = ${#1} ]] then echo "Invalid characters in IP address" exit 1 fi if [ ! ${ADDRESS} ] then echo "Usage: $0 <address>" exit 1 fi /usr/local/sbin/spamdb -t -a ${ADDRESS} if [ "$?" -ne 0 ] then echo "Failed to add ${ADDRESS} to spamdb" exit 1 fi /sbin/pfctl -qt spamd -T add ${ADDRESS} if [ "$?" -ne 0 ] then echo "Failed to add ${ADDRESS} to pf" exit 1 fi /usr/bin/logger -t spamtrap "Spamtrap caught ${ADDRESS}"
#垃圾邮件
spamtrapper unix - nn - - pipe道
flags = X user = nobody argv = / usr / local / bin / sudo / usr / local / scripts / spamtrap $ {client_address}
没有人ALL = NOPASSWD:/ usr / local / scripts / spamtrap
spamtrap @ localhost spamtrapper
$ echo“Test”| mail spamtrap @ localhost
$ spamdb | grep 127.0.0.1
被困| 127.0.0.1 | 1253655172
$ sudo pfctl -qt spamd -T显示
127.0.0.1
$
需要为每个垃圾邮件垃圾邮件地址发生两件事情。 首先,它必须parsing为一个实际的邮箱,以免在SMTP对话框中被拒绝。 我使用别名为spamtrap @ localhost的虚拟用户。 其次,它需要匹配Postfix中的check_recipient_access规则,并被redirect到spamtrap @ localhost,这样收件人列表中包含的合法用户永远不必看到它。 我是如何做到这一点的:
virtual_maps = hash:/ usr / local / etc / postfix / spamtrap_maps smtpd_recipient_restrictions = check_recipient_access散列:/ usr / local / etc / postfix / spamtrap_recipients
[email protected] spamtrap
[email protected] REDIRECT spamtrap @ localhost
此时,所有向您的垃圾邮件地址发送邮件的客户端都应添加到spamdb和<spamd>中。 没有任何信息被发送到垃圾邮件。 为了使整个阻塞机制生效,添加到/etc/pf.conf并重新加载pf:
没有从<local-whitelist>到端口25的rdr proto tcp rdr将<spamd>的proto tcp传递给端口25 - > 127.0.0.1端口8025
就是这样。
修改spamtrap脚本以将该消息的副本存储在贝叶斯垃圾邮件语料库中将是微不足道的。
如果您订阅任何RBL rsync服务,将这些邮件的反弹卸载到垃圾邮件是微不足道的。
好吧,看起来你已经完成了自己的答案。 只是不要责备postfix-policyd,它比你想象的要灵活得多,因为它提供了几种反垃圾邮件的机制:
Policyd是Postfix(基于MySQL)的反垃圾邮件插件,可以实现灰名单,基于发件人(信封或SASL)的限制(按照定义的时间单位在邮件和/或卷上),垃圾邮件监控/黑名单和HELO自动黑名单。
你不需要使用所有的waepons,你可能会在你的smtpd_recipient_restrictions设置更多的规则。
无论如何,试试看(并阅读文档)或build立自己的解决scheme – 这取决于你。
只是一个简短的提示:使用postfix-policyd,例子包括在configuration…
在main.cf的smtpd_recipient_restrictions中将其设置为策略服务,即:
## call policyd check_policy_service inet:127.0.0.1:10031,
像灰色垃圾邮件一起工作,并启用灰名单。 祝你好运!
OP提出的解决scheme相当复杂。 我用了一个更简单的方法:
/etc/postfix/spamtraps 这只是一个简单的“匹配列表”:一个正则expression式(对于垃圾邮件filter),当满足时应用一个动作:
/spam(master|trap)?\@.*/i DISCARD触发垃圾邮件 /funkyspammer\@.*/i DISCARD触发垃圾邮件
调整你的地址。
/etc/postfix/main.cf设置规则 查找smtpd_recipient_restrictions块,并在networking检查(较less负载)之前,但在经过身份validation的用户之后放置相应的规则。 例如:
smtpd_recipient_restrictions = permit_sasl_authenticated
permit_mynetworks
check_recipient_access正则expression式:/ etc / postfix / spamtraps
...
当然,你现在需要重新加载postfix,所以你的更改才会生效。 根据你的发行版,这可以通过service postfix reload ,/ /etc/init.d/postfix reload service postfix reload或者类似的命令来完成。
这是您可能希望考虑的一个可选步骤:使用Fail2ban ,并让它看着您的邮件日志文件。 只要有人对垃圾邮件进行处理,就禁止该IP(例如30分钟或1小时 – 不要太长时间,因为垃圾邮件发送者可能会使用dynamicIP,这将很快变得“无辜”)。