spamd
我正在尝试使用 OpenBSD、OpenSMTPD 、和设置邮件服务器pf
。我遇到的第一个问题是,许多大型网络邮件提供商(如 Gmail)会从具有不同 IP 地址的不同服务器重试投递,这使得他们很难将灰名单移至白名单。我编写了一个脚本,我认为它可能有帮助,它对 GREY 元组的 IP 执行 PTR 请求,并将生成的域与我信任的手动维护的域列表进行比较。
- 首先,这是一个合理的方法吗?我可能会遇到什么问题?
spamdb
其次,为什么在我通过白名单将灰色记录加入白名单后 ,灰色记录不会消失,spamdb -a X.X.X.X
而是显示为白色记录?一旦将它们列入白名单,它应该适用于整个 IP,我想到那时灰色元组已经过时了。这些spamdb
元组的典型生命周期是什么?我看到一些消失了,一些重复了(灰色然后是白色),等等。- 第三,我是否应该将这些列入白名单的 IP 从我的脚本写入文件,然后将该文件作为表加载,
pf
从而将这些受信任域的连接直接传递到smtpd
?换句话说,我是否应该绕过,将它们列入灰名单,然后直接转到某个 pf 白名单表,而不是spamd
仔细检查这些 IP 并将spamdb -a
其添加到<spamd-white>
pf 表中,spamdb
然后将它们列入白名单。
这是我编写的脚本草稿,它会定期运行,以自动将遇到的和列入灰名单的受信任域列入白名单:
#!/bin/sh
set -A whitelist \
amazon.com \
google.com
spamdb | while read line
do
IFS="|"
set -A fields $line
status=${fields[0]}
if [[ $status = "GREY" ]]
then
ip=${fields[1]}
ptr=`host ${ip}`
IFS="."
set -A tokens $ptr
size=${#tokens[*]}
domain="${tokens[size-2]}.${tokens[size-1]}"
found=false
IFS=" "
for whitelisted in ${whitelist[@]}
do
if [[ $domain = $whitelisted ]]
then
found=true
fi
done
if (($found))
then
echo "+ $ip ($domain) has been whitelisted"
spamdb -a "$ip"
else
echo "- $ip ($domain) is unrecognized"
fi
fi
done
exit 0
答案1
这取决于™:
- 请记住,DNS
PTR
记录可能是错误的——仅仅因为您.google.com
作为 的一部分获得PTR
,并不意味着是Google控制了相关IP地址。为确保万无一失,您可能还想在采取任何行动之前进行正向解析(尽管公平地说,灰名单的影响将非常有限,因为任何能够修改的人PTR
很可能首先能够成功绕过您的灰名单)。 - 处理来自以下来源的互联网输入
sh
可能不是最好的方法。 - 此外,您将花费相当多的时间来完成这些解决方案,其中一些可能会超时,因此,您必须确保不要过于频繁地运行该脚本,特别是在它的另一个副本已经在运行时。
- 请记住,DNS
欢迎浏览http://BXR.SU/OpenBSD/usr.sbin/spamdb/spamdb.c#dbupdate。不过,代码似乎不太易读。
我认为两种方法都可以。使用自动白名单来维护可能更容易
spamdb
,因为它会负责维护、到期和一些统计信息。但是,如果您维护自己的列表,则可以获得在网络范围内进行白名单管理的额外好处。
此外,如果您希望将此限制在 Google、Amazon 和其他保留正确 SPF 记录的提供商,请考虑通过一次获取所有 IP 地址来直接领先,甚至通过自动化方式(例如,借助 SPF)。请参阅https://support.google.com/a/answer/60764。您甚至很可能使用现有的 SPF 库来获取所有这些 IP 地址的列表。