第七章:Rspamd 基础知识通用配置语言UCL 特点Includes 和 VariablesRedis套接字目录主Redis配置Redis for Rspamd与Redis对话Rspamd组件rspamadm(1)
rspamc(1)
Rspamd文档映射Rspamd中的阻止列表配置 Rspamd编译配置控制器密码Redis本地地址Rspamd操作Rspamd 测试Rspamd Web 界面将 Postfix 连接到 MiltersRspamd测试头和符号创建符号列表合法邮件的Rspamd结果诈骗邮件的Rspamd结果
好的系统使用最少的资源密集型方法来处理最常见的情况。 postscreen
和DNSBL等工具经济高效地消除了大量垃圾邮件。基于内容对消息进行分类在计算上很昂贵,需要专门的工具。有很多可用,但我们将重点介绍rspamd。
Rspamd(https://rspamd.com)最初是一个贝叶斯(Bayesian)垃圾邮件过滤系统,但其可扩展的设计导致人们编写了额外的功能。与许多开源软件套件一样,它是免费提供的,但可通过Rspamd有限公司获得支持。它包括核心软件、许多模块、 rspamadm(1)
管理工具和web界面。它使用Redis进行数据存储。rspamd使用网络端口在进程之间进行通信,而不是Unix套接字。在邮件系统所需的所有程序中,rspamd和Redis的组合可能是资源最密集的。
配置垃圾邮件测试器似乎为时过早——毕竟,我们甚至还没有告诉全世界如何向我们的域发送邮件!然而,Rspamd还支持几个资源密集度较低的功能,例如验证SPF记录和处理DKIM,在让随机人员给你发邮件之前,你绝对需要这些功能。你可以使用外部工具来实现这些,但SPF和DKIM支持是rspamd最轻的功能之一。在我们开始教rspamd如何执行花哨的统计分析之前,我们将为这些更简单的函数设置它,并根据需要返回。
评估垃圾邮件就是检查单个邮件的特征并为每个邮件分配分数。一些特征暗示邮件是有效的火腿(ham);其他则暗示垃圾邮件。每个特征都有一个点值(point value)。如果一条消息累积了足够的分数,它就会被标记为垃圾邮件。邮件是否包含格式错误、加密或可执行的附件?这很糟糕,加分;它有有效的DKIM、SPF和DMARC吗?有希望的,减分;它是否包含通常用于欺骗您的语言的Unicode字符,反向DNS是否与主机名不匹配,或者EHLO中的主机名在DNS中不存在?加分;如果消息正文包含已知用于钓鱼的URL,则该消息将获得所有分数。攒够了足够的分数,rspamd就会宣布该消息为垃圾邮件。足够低,rspamd通过火腿。
深入了解rspamd需要阅读源代码并研究反垃圾邮件论坛。你可以在没有这个的情况下有效地部署rspamd,只要你准备好偶尔深入了解其中的奇怪之处。
某些rspamd在Postfix中具有重复的功能。Postscreen的侵入性检查就像灰名单一样。Rspamd包括一个灰名单模块。你应该使用哪一种?两者都有,或者两者都没有。一旦您为大型邮件系统添加了例外,postscreen的资源密集度就比rspamd低得多。这不是编程技能的问题:rspamd针对深入挖掘消息进行了优化,并且效率很高。如果一条消息通过了postscreen的侵入性检查,但rspamd认为消息内容足够可疑,它也可以进入灰名单。您可以根据需要禁用或加强所有这些功能。
任何垃圾邮件检查系统都会引发隐私问题。rspamd仪表板显示收件人收到的每封邮件的主题行以及rspamd对该邮件所做的处理。Rspamd可以根据外部阻止列表检查邮件正文中的链接和电子邮件地址,但这需要将邮件中的所有电子邮件地址和链接发送到该外部阻止列表。我真的想让一些局外人知道我收到了很多链接吗 https://forums.OverthrowTheEmpire.org
?忘记舒适——这安全吗?你有自己的看法,但收到关于他们所在地、服务器所在地、阻止列表托管地或阻止列表操作员所在地非法内容的消息的人可能会有不同的看法。您正处于中间。Rspamd的默认设置通过启用阻止已知垃圾邮件机器人的测试来划分差异,但不启用基于区块列表的内容分析。Rspamd还使用模糊哈希( fuzzy hashes ),它根据预定义的规则分解消息内容,计算这些块的哈希,并将哈希与 rspamd.com
维护的已知垃圾邮件的哈希列表进行比较。一个匹配是可疑的。一条消息中的多个匹配非常可疑。
您无法提前知道新的rspamd安装将如何对您和您的用户收到的特定混合电子邮件做出反应。虽然我们都收到了垃圾邮件,要求在三十天内将我们提升到银河议会(Galactic Council),但我的日常电子邮件与你的完全不同。通过告诉rspamd永远不要阻止消息,只添加显示测试结果的标头来启动任何部署。当你对rspamd充满信心并训练它来检测你的个人垃圾邮件和火腿时,提高灵敏度。
管理rspamd需要通用配置语言(Universal Configuration Language)。你也需要Redis。我们将简要讨论这两个问题。
Universal Configuration Language —— 通用配置语言
你有没有看过JSON配置并想过,这可能是一个常规的Unix文本文件?或者想知道为什么开发人员使用文本,而JSON或YAML会更好?YAML、JSON和Unix文本都以不同的格式表示类似的数据。每种格式都有其优点、缺点和句法特质,这些都能取悦其爱好者。JSON可能是一个配置存储,可以扩展到完成,但它不是为手工编写而设计的,很少有人提倡这样做。YAML看起来是可写的,直到它无法验证。当你错过一个分号或引号时,即使是纯文本也会出错。每种格式都充满了失败。
通用配置语言(Universal Configuration Language —— UCL)将所有这些故障结合在一起。UCL感知工具可以读取Unix风格的文本配置以及各种JSON、YAML和messagepack。它们可以以这些格式中的任何一种输出配置。如果用YAML配置应用程序对你来说有意义,那就这样做。如果其他人需要相同的应用程序来使用Unix风格的文本配置,那很好。UCL还简化了程序配置更改。Rspamd对其所有配置文件使用UCL。
UCL称文本格式为 configuration 。它大量借鉴了nginx的严格格式。下面是配置中的rspamd配置片段。(这句话说明了为什么这本书将配置格式称为unix风格。)
xxxxxxxxxx
options {
cache_file = "/var/db/rspamd/symbols.cache";
one_shot = false;
map_watch_interval = 300;
map_file_watch_multiplier = 0.100000;
dynamic_conf = "/var/db/rspamd/rspamd_dynamic";
…}
对于任何系统管理员或程序员来说,这种格式几乎都是本能的。JSON中的情况完全相同:
xxxxxxxxxx
"options": {
"cache_file": "/var/db/rspamd/symbols.cache",
"one_shot": false,
"map_watch_interval": 300,
"map_file_watch_multiplier": 0.100000,
"dynamic_conf": "/var/db/rspamd/rspamd_dynamic",
…
你应该使用哪一种?随你喜欢。Rspamd的默认配置文件混合使用JSON和unix风格。
UCL的JSON格式不符合最严格的JSON。顶级对象不需要大括号,可以忽略引号,并且可以使用 =
代替 :
。此外,对象或数组后面可以有逗号。
许多Unix配置都需要布尔设置,如true或false、on和off等。您可以互换使用 true 、 yes 或 on 。同样, false 、 no 和 off 都可以互换。在上下文中使用任何有意义的东西。如果你需要这些字符串中的任何一个,把它们放在引号里。
几十年来,关于基数2和基数10的争论一直困扰着计算,并将继续下去,直到我幸福地从计算中解放出来很久。UCL支持常用的 k
、 m
和 g
标签作为乘数,以及 kb
、 mb
和 gb
。以 b
结尾的版本以 2
为基数计算,而简单的缩写使用 10
为基数。 500mb
与 500m
不同。按照您的意愿调整您的系统。
在单行注释前加上哈希标记(#
),而多行注释可以使用传统的C风格 /* 和 */。UCL支持嵌套注释。
UCL允许开发人员使用各种宏和变量。宏的名称以句点开头(例如,.lightsaber
)。变量以美元符号开头,例如 $DROIDTYPE
。UCL定义了宏 .include
,并建立了一个丰富的语法来拉取其他文件,以及如何处理这些文件的内容。Rspamd的配置大量利用了 .include
语句。
包含文件的一个常见风险是多次定义相同的设置。也许你的主配置文件将 DEBUG
设置为 0
,而其中一个包含的文件将其设置为 YES
,另一个将其设为 wookie
。每个程序都以程序员认为合适的方式处理此类冲突。有时最后一个会赢;有时程序拒绝接受配置,可能会提供有用性不同的错误消息;也许它选择了一个。谁知道呢?UCL通过优先权( priority )制度明确解决了这个问题。您可以为不同的include文件定义优先级,明确声明哪些文件具有优先级。优先级从0到15。默认优先级为0,这意味着默认设置可以被任何东西覆盖。通过为include文件设置优先级,您可以告诉UCL哪个文件获胜。
Rspamd通常以三种方式使用includes。这是 options 部分的一个片段。
xxxxxxxxxx
…
options {
pidfile = "$RUNDIR/rspamd.pid";
.include "$CONFDIR/options.inc"
.include(try=true; priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/options.inc"
.include(try=true; priority=10) "$LOCAL_CONFDIR/override.d/options.inc"
}
选项部分的第一行设置PID文件。它在 $RUNDIR
目录中定义了一个文件。这是在rspamd代码中定义的变量。您的操作系统的rspamd包维护人员将其设置为符合您的操作体系的期望。我们稍后将看到如何更改此设置。
下一行是一个简单的include语句 $CONFDIR
是一个代表配置目录的变量。在我们的例子中,这是 /etc/rspamd 。这一行读取文件 options.inc 并吸收它找到的所有设置。如果 options.inc 不存在,则此配置无效。
第三个条目拉入另一个文件 $LOCAL_CONFDIR/LOCAL.d/options.inc
,但括号提供了特殊处理的说明。try
选项表示尝试查找目标文件,但如果不存在则继续。此文件的优先级为 1
,这意味着在发生冲突的情况下,其条目将覆盖默认设置。duplicate
(重复)语句告诉如何处理重复条目。通过合并(merge),我们允许包含的文件创建新的设置。总的来说,这个 .include
声明 /etc/rspamd/local.d/options.inc 中的文件配置文件覆盖 /etc/rspamd/options.inc 中的内容,并可以添加新的变量。
最后一个条目试图包括 /etc/rspamd/override.d/options.inc ,但条件非常不同。优先级为 10
,因此此文件中的条目比其他任何条目都重要。没有 duplicate
语句,因此 override.d/options.inc
的内容完全覆盖了其他设置。重写(overwriting)是一种严厉的手段,会取代整个配置部分。
“overwriting”是什么意思?考虑我们前面的设置选项示例。
xxxxxxxxxx
"options": {
"one_shot": false,
"cache_file": "/var/db/rspamd/symbols.cache",
"map_watch_interval": 300,
"map_file_watch_multiplier": 0.100000,
"dynamic_conf": "/var/db/rspamd/rspamd_dynamic",
…
}
假设某个rspamd插件移动了缓存文件,但您想通过覆盖将其焊接(weld)到位。您可以在 override.d/options.inc 中尝试此操作。
xxxxxxxxxx
"options": {
"cache_file": "/var/db/rspamd/symbols.cache"
}
看起来不错,对吧?
这里有一个问题:这不会覆盖 cache_file
的定义。它覆盖了 options
的定义。默认 options
部分中的设置,如 one_shot
、 map_watch_interval
等,现在未定义。如果你不告诉UCL合并条目,它就不会合并条目。
除非您要重写整个配置文件,否则请避免覆盖。
Redis是一个数据库,但不像Postgres、MySQL、sqlite、哈希文件或写在餐巾纸或Oracle上的笔记那样。虽然传统数据库优先考虑将数据安全地存储在磁盘上,但Redis将RAM视为其主要数据存储。Redis有安全地将数据存储在磁盘上的选项,包括接近传统数据库可靠性的选项,但其主要目标是速度。Redis是一个键-值(key-value)存储,而不是SQL引擎;您可能会认为它是一个超快速的网络感知哈希文件。几乎每个操作系统都有Redis包。
Redis正在更改其许可证。叉子正在出现。如果你在2024年之后阅读这本书,你应该调查哪些分叉正在蓬勃发展,并考虑使用它。
Rspamd使用Redis来存储IP地址、分数(scores)和符号等临时数据,以及贝叶斯统计数据的长期存储。如果服务器发生灾难性停机,那么短暂的时间并不重要。当您可以从备份中还原它时,所有这些数据都已过期。不过,贝叶斯统计数据很重要。管理拆分(split)的最简单方法是为每个实例都有一个单独的Redis实例。
虽然Redis可以监听网络,但对于仅本地数据库来说,这是不必要的暴露。配置Redis以使用更快、更高效、更安全的Unix套接字。Rspamd需要对这些套接字进行读写访问。Redis和rspamd都以无特权用户身份运行,因此我们需要一个可供其用户访问的目录。此目录对于rspamd和redis必须共享的任何内容都很有用。
xxxxxxxxxx
即使你将rspamd和Postfix移动到单独的机器上,Redis也应该位于rspamd主机上。
在 /etc/Redis.conf 中配置Redis。示例配置包括复制(replication)和TCP积压(backlogs)和保活(keepalives) 选项,所有这些对我们的应用程序来说都是多余的。操作系统的软件包已经调整了内存分配选项。除非你有问题,或者已经是Redis专家并正在浏览本节,否则不要更改它们。
Redis希望您为单独的进程运行多个Redis实例。我鼓励这样做,尤其是当我很容易感到困惑时,尤其是在处理愚蠢的停机时。如果我必须记住默认的Redis实例是由rspamd使用的,那么停机时间会更长。相反,我想要一个明确标记为“rspamd”的Redis实例。不要使用默认的Redis实例。设置一个特定的rspamd实例。在默认配置中设置所需的常用选项,但不要从该配置启动实例。相反,为每个角色创建特定的命名Redis实例,并让这些实例吸收您的默认值。
使用 dir
选项设置redis将存储其磁盘上数据的位置。您的操作系统的默认值可能很好,但您需要知道它在哪里。用 dbfilename
设置磁盘上的文件名:
xxxxxxxxxx
dir /var/lib/redis
dbfilename dump.rdb
Redis将数据转储到磁盘的速度取决于内存中数据存储的变化速度。如果至少有一个更改,它会每小时转储一次数据。如果至少有一百次更改,它每十五分钟就会转储一次。如果在最后一分钟至少有一万个变化,它就会转储。在大多数情况下,这很好。在崩溃的情况下,你可能会丢失一些邮件的垃圾邮件训练数据,但互联网上有无限的垃圾邮件。你会没事的。
虽然Redis有效地使用了内存,但垃圾邮件攻击可能会导致其内存膨胀。Rspamd建议使用 maxmemory
选项将Redis的内存使用量限制在半GB。你或许可以稍后拒绝,但在现代系统中,这是一个很好的起点。Redis接受 mb
、 kb
和 gb
等缩写。与UCL一样,以 b
结尾的缩写以2为基数计算大小,而没有 b
的缩写则使用10为基数。
xxxxxxxxxx
maxmemory 500mb
默认情况下,Redis会将日志记录到自己的文件中,但从长远来看,最好使用 syslog
。禁用 logfile
选项,并设置 syslog-enabled
和 syslog-ident
选项:
xxxxxxxxxx
syslog-enabled yes
syslog-ident redis
Redis需要一个PID文件,由 pidfile
给出。默认值很好,但你需要知道它在哪里:
xxxxxxxxxx
pidfile /var/run/redis/redis.pid
通过告诉Redis监听端口0并分配一个Unix套接字来禁用网络。使用 unixsocketperm
选项允许所有者和所属组访问套接字。在本章的前面,我们创建了一个由 rspamd
和 redis
拥有的套接字目录:
xxxxxxxxxx
port 0
unixsocket /var/run/rspamd-redis/redis-defaultinstance.sock
unixsocketperm 770
最后,设置访问数据库的密码。是的,无论这个词是什么意思,存储在文本文件中的密码都不是“安全的(secure)”。使用密码仍然会增加敌方侦察的难度。使用不方便的(inconvenient)密码作为默认设置。如果此配置被错误地用于启动实例,人们很快就会意识到出了问题:
xxxxxxxxxx
requirepass WhyDoesASpaceStationNeedATrashCompactor?
这些默认值将有助于支持您实际要运行的实例。
我们需要一个Redis实例用于贝叶斯数据,一个用于rspamd的其余部分。每个都需要自己的配置文件。我们称他们为 bayes 和 rspamd 。这是 /etc/redis-bayes.conf :
xxxxxxxxxx
include /etc/redis.conf
syslog-ident redis-bayes
unixsocket /var/run/rspamd-redis/bayes.sock
pidfile /var/run/redis/bayes.pid
logfile /var/log/redis/bayes.log
dbfilename bayes.rdb
dir /var/db/redis/bayes/
requirepass LetsBlowThisThingAndGoHome
我们首先使用 include
从 redis.conf 中获取默认值。
每个Redis进程都需要它自己的Unix套接字、PID文件和log文件。 dbfile
选项告诉Redis将持久数据写到哪里,我们把这些数据放到默认的目录。此实例需要持久数据,因此请将转储文件添加到备份中。我还添加了一个新的 syslogd
标识符,这样当我收到一条奇怪的日志消息时,我就知道是哪个实例在抱怨。
这是rspamd的临时Redis服务 /etc/redis-rspamd.conf 的配置。一个名为简单而旧的 rspamd 的套接字最好直接转到 rspamd
,所以我给它起了一个更具体的名字:
xxxxxxxxxx
include /etc/redis.conf
syslog-ident redis-rspamd
unixsocket /var/run/rspamd-redis/redis4rspamd.sock
pidfile /var/run/redis/rspamd.pid
logfile /var/log/redis/rspamd.log
dbfilename rspamd.rdb
dir /var/db/redis/rspamd/
requirepass HanShotFirst
为每个实例设置单独的密码也可以作为双重检查,告诉每个rspamd模块使用正确的Redis实例。您不想在重新启动之前发现贝叶斯值没有写入磁盘太晚!
运行rspamd一段时间后,您可能需要覆盖某些实例的其他值,如 maxmemory
。这完全取决于您的环境和邮件负载。
每个实例在Redis的数据目录中都有自己的子目录。一定要创建这些目录,并将 redis
作为其所有者。
现在让你的操作系统启动这些额外的Redis进程。大多数Linux需要 systemctl(8)
咒语。BSD使用 /etc/rc.conf 设置。传统的Unix使用 /etc/rc.local 。给你的Unix它想要的东西。验证进程是否可以启动,日志文件是否显示且没有错误,以及TCP端口是否打开。
验证您是否可以手动连接到Redis实例。虽然你会发现花哨的Redis接口,但软件附带的 redis-cli(1)
工具足以进行简单的测试。使用 -s
指定要连接的实例的套接字的路径。在这里,我从 /var/run/bayes-redis 运行此命令,以保持示例输出简短。
xxxxxxxxxx
$ redis-cli -s bayes.sock
redis bayes.sock>
它连接了,但只是在基本的“我看到套接字”的意义上。给出该实例的AUTH命令和密码:
xxxxxxxxxx
redis bayes.sock> auth LetsBlowThisThingAndGoHome
OK
我们现在可以发出命令了。使用 ping
来查看Redis进程是否正在监听您:
xxxxxxxxxx
redis bayes.sock> ping
PONG
它回答了!这些是全新的、刚启动的数据库,所以它们不应该有任何数据。但Redis收到了你的请求并做出了回应。数据库已经准备就绪,可以访问。
如果要查看数据库中发生了什么,请使用 monitor
命令:
xxxxxxxxxx
redis bayes.sock> monitor
OK
启动rspamd时监视Redis将显示活动。rspamd运行一段时间后,使用 info
命令查看它在做什么。它将提供关于软件配置、使用的内存量和错误的多个页面输出。最后,你会看到钥匙的数量。
xxxxxxxxxx
redis bayes.sock> info
redis_version:7.2.4
…
db0:keys=128060,expires=0,avg_ttl=0
这个数据库有128060个密钥。不过,我们现在领先于我们自己。让我们设置rspamd,这样我们就可以拿到那些钥匙了。
使用 quit
命令退出。
Rspamd对每条消息执行测试。测试定义了表示测试类型、结果和权重或点值的符号(symbols 有时称为标签 tags)。符号用大写字母表示。权重表示此特征对垃圾邮件或火腿的指示程度。根据域的SPF记录测试消息可以生成 R_SPF_ALLOW
(权重 -2)、 R_SPF_FAIL
(权重 +1)和 R_SPF_NEUTRAL
(权重0)等标签。符号可以组合;如果消息未通过SPF、DKIM 和 DMARC验证,它将被标记为 AUTH_NA_OR_FAIL
符号。Rspamd将每个模块的符号附加到消息中。您可以微调规则,使其权重在特定条件下成倍增加。消息通过所有模块后,rspamd计算权重并提供最终分数。Rspamd支持数百个符号,并在每次更新时添加更多符号。
一些符号在 /etc/rspamd/ 中的配置文件中定义。其他符号将在核心rspamd规则中定义。这些规则大多是用Lua编写的,将位于 /usr/share/rspamd/rules 之类的位置,或者您的Unix存放这些东西的任何地方。
符号也被分组。可以启用、禁用或加权规则组。如果你想停止使用一整类测试,请检查它们是否已经在一个组中。
模块可以利用外部服务。第8章讨论了将DNSBL附加到postscreen,以在垃圾邮件发送者到达SMTP服务器之前阻止他们。不过,DNSBL可以提供域名和IP地址的信息。像Spamhaus这样的组织维护着网络钓鱼攻击和诈骗邮件中出现的域名阻止列表。Rspamd有一个模块,用于检查消息正文中是否有指向这些域的链接。同样,Rspamd有限公司提供一次性电子邮件地址列表和免费电子邮件服务。
添加和删除测试是安装、启用或禁用模块的问题。每个模块都可以通过包含和覆盖进行配置。在进行更改之前,始终检查rspamd的在线配置参考:不做任何假设。
所有模块在 /etc/rspamd/modules.d 中都有一个配置文件。与rspamd的其余部分一样,不要在其配置文件中配置模块。使用本地文件,或者如果必须,使用覆盖。
您可以通过在以模块文件命名的本地文件中将 enabled
设置为 false 来禁用模块。假设你不想让rspamd变成灰名单。灰名单模块的配置为 /etc/rspamd/modules.d/greylist.conf 。创建仅包含此行的 /etc/rspamd/local.d/greylist.conf :
xxxxxxxxxx
enabled=false;
重新启动rspamd时,模块将关闭。
rspamadm(1)
rspamd正在做什么以及如何设置它的主界面是 rspamadm(1)
。这个程序既适合新手也适合高级用户,因此它的一些功能对小型邮件系统的操作员来说没有用。使用 -l
选项查看rspamadm
版本的所有功能:
xxxxxxxxxx
$ rspamadm -l
您将获得版本号和使用摘要,然后是子命令列表:
xxxxxxxxxx
Available commands:
clickhouse Retrieve information from Clickhouse
configdump Perform configuration file dump
configgraph Produces graph of Rspamd includes
confighelp Shows help for configuration options
…
如果某个选项引起了您的兴趣,请使用 help
命令请求详细描述:
xxxxxxxxxx
$ rspamadm help configdump
您还可以将选项本身与 --help
参数一起使用:
xxxxxxxxxx
$ rspamadm configdump --help
…
Application Options:
-j, --json Json output (pretty formatted)
-C, --compact Compacted json output
-c, --config Config file to test
-h, --show-help Show help as comments for each option
-s, --show-comments Show saved comments from the configuration file
…
rspamadm help
commandname 和 rspamadms
commandname --help
的输出可能不同,因此请检查两者。
一些rspamadm选项可帮助您配置rspamd服务或模块。它们通过添加或编辑本地配置文件来工作。如果您遇到问题,请使用这些工具创建初始配置,然后根据需要调整生成的配置。
rspamc(1)
rspamd命令行客户端 rspamc(1)
对于大型操作或测试单个消息最有用,但某些功能对于较小的邮件系统很有用。最有用的子命令之一是 stat
,它显示了rspamd处理了多少消息以及对这些消息做了什么。故障排除通常涉及单个消息,但如果系统出现问题,密切关注垃圾邮件级别可以警告您。Rspamd每60秒只更新一次统计数据,所以如果更改没有立即出现,也不用担心。
xxxxxxxxxx
$ rspamc stat
Results for command: stat (0.164 seconds)
Messages scanned: 1495
Messages with action reject: 1495, 100.00%
…
stat_reset
子命令显示该信息并将所有计数器重置为零。你可能会认为每天的计数器比持续的分数更重要。
我们将使用 learn_ham
和 learn_spam
子命令来训练统计过滤器。
counters
子命令显示每个符号、其权重、每分钟分配的次数以及符号分配给消息的次数。如果你没有收到足够的电子邮件,每分钟计数器为空,但任何符号被点击的次数很有用。您可以解析该输出,查看典型电子邮件的外观,并可能调整符号权重。
其他 rspamc
命令允许您与远程rspamd服务器通信,操纵符号和哈希,以及调整缓存数据。当您刚开始使用rspamd时,请使用这些配置文件。
你会发现一大堆rspamd文档,但把它们放在一起或找到你想要的功能的说明可能会很有挑战性。
rspamd网站(https://rspamd.com)包括最常见环境的教程和不太常见用途的参考。在微调测试时,每个模块的引用非常有用,这是rspamd最常见的任务。
略读模块的配置文件可以提供有关模块执行哪种测试的提示。
我通常从 /etc/rspamd/modules.d 中的模块配置开始。每个模块都有一个配置文件。每个文件都以警告开头,警告不要直接编辑文件,然后是指向在线文档的指针。
rspamadm
命令为某些模块提供语法。运行 rspamadm confighelp
modulename 可能会显示模块的配置选项。并非所有模块都支持此功能。
rspamd映射(map)在配置文件中包含外部信息。映射通常是键-值存储。与UCL包含语句不同,映射可能在本地系统上或通过HTTP可用。映射会在SIGHUP时重新读取,因此您可以在不完全重新启动rspamd的情况下更新它们。您还可以设置一个回退,以便在首选数据源的任何部分不可用时使用。
考虑一下 /etc/rspamd/modules.d/time_time_types.conf 的这个花絮。
xxxxxxxxxx
mime_types {
file = [
"https://maps.rspamd.com/rspamd/mime_types.inc.zst",
"$LOCAL_CONFDIR/local.d/maps.d/mime_types.inc.local",
"${DBDIR}/mime_types.inc.local",
"fallback+file://${CONFDIR}/maps.d/mime_types.inc"
]
…
Rspamd使用MIME类型来标识应该对消息的每个部分应用哪些测试。IANA独立于rspamd版本分配新的MIME类型,因此此列表需要可轻松更新。Rspamd聚合了来自多个来源的列表,用逗号分隔。
列出的主要数据源是 rspamd.com
网站上的一个文件。
第二个数据源是文件 /etc/rspamd/local.d/maps.d/mime_types.inc.local 。列出该文件中的任何自定义MIME类型。还可以将创建自定义MIME类型的任何人送去审问。
第三个数据源是 /var/db/rspamd/mime_types.inc 文件。web界面将其更改存储在此处。
Rspamd将这三个数据源合并到一个主列表中。如果这些数据源中的任何一个不可用,它将尝试标记为 fallback 。此配置片段中没有引入本地和网站添加的规则,但回退文件本身就包含了它们。
映射的内容不会出现在 rspamadm
编译的配置中,但数据源会出现。
/etc/rspamd/maps.d/ 目录包含许多测试的可编辑映射。
第9章讨论了基于IP地址的DNSBL。不过,阻止列表可用于多个IP地址。如果可以将其编码为DNS查询,则可以在DNSBL中使用。Rspamd可以查询已知垃圾邮件发送者电子邮件地址的DNSBL、消息正文中出现的骗局URL、链接等。如果编辑测试,则必须验证每个测试是否连接到适当的阻止列表。
默认情况下,Rspamd模块被配置为查询适当的阻止列表。在覆盖阻止列表时要格外小心。也许您不喜欢一个DNSBL管理其操作的方式,但切换到具有更合适管理但信息类型错误的不同DNSBL将无济于事。如果您查询的DNSBL编目了错误的FROM地址,则检查消息体中已知骗局URL的测试将不起作用。
Rspamd的配置文件位于 /etc/rspamd 中。配置文件使用通用配置语言(UCL)。默认文件是Unix风格或JSON。初始文件旨在轻松创建一个可在大多数平台和环境中使用的功能性反垃圾邮件系统。我们将完成分配管理密码、连接Redis、启用web界面以及使rspamd非侵入性所需的最低配置,以便我们对其进行测试。
Rspamd通过两个变量简化了其配置文件。 LOCAL_CONFDIR
变量指的是包含rspamd配置的目录。在我们的示例中,它是 /etc/rspamd 。变量 DBDIR
给出了rspamd存储其磁盘数据的位置。对于此安装,它是 /var/db/rspamd 。使用的目录取决于您的操作系统如何打包rspamd。
/etc/rspamd 中的覆盖(overrides)和包含(includes)看起来有些混乱,但升级将覆盖默认配置文件而不发出警告。切勿编辑默认文件。如本章前面的“通用配置文件”所述,使用本地配置文件和覆盖文件。本地文件允许您设置单个选项,而覆盖文件会替换整个配置节,并强制覆盖其他地方设置的选项。
诸如“此邮件发送给了多少人?”“此邮件中有多少MIME附件?”和“日期是否合理?”等基本测试都在核心规则中,而不是模块中。Rspamd的一个主要功能不是模块,而是贝叶斯分析 (Bayesian analysis)。贝叶斯规则( Bayes rule )是一个用于评估概率的统计定理。贝叶斯分析采用一组已知的垃圾邮件和一组已知好消息(或ham——火腿),并仔细检查它们的模式。当新的垃圾邮件到达我的收件箱时,我将其保存到垃圾邮件文件夹的操作应该会触发对该邮件的分析。如果rspamd将一条好消息过滤到我的垃圾邮件文件夹中,将其移出收件箱应该会触发新的分析。这种持续的分析教会了rspamd用户的邮件是什么样子的,以及如何识别你收到的垃圾邮件。贝叶斯分析在持续训练的情况下效果良好。
主rspamd配置文件是 rspamd.conf 。它主要由所有模块的 include
语句组成。它读取所有这些文件、所有本地文件、所有覆盖文件以及包含这些文件的所有文件。然后,它将它们组装成一个单一的配置。使用 rspamadm configdump
查看完整的解析配置。添加 -s
标志以查看原始配置文件中的注释。一个rspamd配置有数千行,因此将其重定向到一个文件:
xxxxxxxxxx
$ rspamadm configdump -s > rspamd.config
完全理解rspamd的最佳方法是逐行浏览此配置,在在线配置参考中查找每个选项。不过,首先,浏览一下它,了解rspamd配置是如何连接在一起的。
仅当符号出现在配置文件中时,转储才会包含这些符号。除非您更改了核心规则中定义的符号,否则它们不会显示。
对于新用户来说,解开rspamd正在解析哪些文件会让人感到不知所措。如果您喜欢可视化表示, rspamadm
的 configgraph
命令可以生成一个正式定义的配置文件依赖关系图以及已解析的文件。如果您不确定rspamd是否正在读取您的配置文件,或者您想看看所有这些文件是如何组合在一起的,请生成图表并进行检查。您需要Graphviz的 dot(1)
将图形转换为PNG等可用格式:
xxxxxxxxxx
$ rspamadm configgraph > rspamd-config.dot
$ dot -Tpng rspamd-config.dot -o rspamd.conf.png
您将希望在宽屏上查看此内容。一个大而宽的屏幕。更广的。
Rspamd附带了大部分工作配置。在使用该程序之前,您必须设置一个控制器密码,并通知各个模块其Redis实例。一旦它起作用,你就可以调整设置。
Rspamd提供了一个可作为本地套接字或在TCP端口11334上访问的工作器控制进程。此控制器是web界面不可或缺的一部分,支持只读密码和读写密码。rspamadm
的 pw
子命令生成密码哈希值:
xxxxxxxxxx
$ rspamadm pw
Enter passphrase:
$2$1yfwuq4c…
在 /etc/rspamd/local.d/worker-controller.inc 中设置密码。 password
选项为只读密码,而enable_password
为读写密码:
xxxxxxxxxx
password = "$2$1yfwuq4c…”
enable_password = "$2$1kf1ql9…”
即使您无意访问控制器套接字或使用web界面,也不要让控制器不受保护。分配密码。
本章前面我们配置了两个Redis实例:一个用于贝叶斯统计,一个用于只在短期内有用的事物(ephemera)。这些模块或功能中的每一个都使用不同的配置文件。
贝叶斯统计引擎的默认配置设置在 /etc/rspamd/statistic.conf 中。rspamd支持在本地 classifier-bayes.conf 中设置贝叶斯分析特定值。您现在需要做的就是设置Redis服务器:
xxxxxxxxxx
backend = "redis";
servers = "/var/run/rspamd-redis/bayes.sock";
password = "LetsBlowThisThingAndGoHome";
将您的包罗万象的Redis实例放在 /etc/rspamd/local.d/redis.conf 中,并使用 password
和 servers
选项:
xxxxxxxxxx
password = "HanShotFirst";
servers = "/var/run/rspamd-redis/redis4rspamd.sock";
每当您使用包含和覆盖文件时,我建议您根据编译的配置仔细检查您的更改。运行 rspamadm configdump
并搜索Redis套接字和密码以验证您的工作,然后重新启动以使更改生效。
我们大多数人不需要针对本地网络的垃圾邮件防护。如果你告诉rspamd网络是本地的,它不会对来自这些地址的邮件执行DKIM、DMARC或SPF检查。它跳过灰名单、RBL测试等。 /etc/rspamd/options.inc 中的默认 local_addrs
包括在RFC 6890中分配的私有地址,例如 10.0.0.0/8
和 192.168.0.0/16
。使用 /etc/rspamd/local.d/options.inc 中的 local_addrs
选项添加到此列表:
xxxxxxxxxx
local_addrs = [203.0.113.0/24, 2001:db8::/32]
来自这些地址的电子邮件仍将进行统计分析。
Rspamd按分数对垃圾邮件进行评分。操作(actions)设置是点阈值,rspamd建议MTA采取操作或添加描述邮件可疑原因的标头。在 /etc/rspamd/actions.conf 中查找默认设置。
xxxxxxxxxx
reject = 15; # Reject when reaching this score
add_header = 6; # Add header when reaching this score
greylist = 4; # Apply greylisting when reaching this score
当消息的分数达到 reject
值时,rspamd会拒绝该消息。从技术上讲,rspamd不会拒绝该消息。它建议MTA拒绝。MTA可以配置为覆盖该计时器。然而,Postfix采纳了rspamd的建议。
在 add_header
级别,rspamd向消息添加一个标头,指示收件人应将其视为垃圾邮件。使用筛选(Sieve)规则将这些邮件过滤到垃圾邮件文件夹中。
当分数等于 greylist
或更高时,rspamd会给发件人一个451的临时失败。发送主机的网络被列入灰名单,持续五分钟。
Rspamd提供了除这些之外的操作,但大多数都是针对边缘情况的。
在初始部署时,我们不希望rspamd拒绝或减慢电子邮件速度。我们想看看rspamd如何处理我们收到的消息。提高侵入行为的门槛。创建 /etc/rspamd/local.d/actions.conf 并设置新值:
xxxxxxxxxx
reject = 500;
greylist = 499;
add_header = 15;
这并不能保证传递所有邮件,但如果15通常被认为是无可置疑的垃圾邮件,并且收到的邮件达到500分,我们可能应该拒绝它。我们只会添加一个得分为15分或更高的“这是垃圾邮件”标头。
测试所有电子邮件,但不做任何更改是很好的,但我们需要看到结果。 milter_headers 模块可以添加、更改和删除消息头。使用 extended_spam_headers
选项告诉rspamd将测试结果添加到每条消息的标头中。用一行创建 /etc/rspamd/local.d/milter_headers.conf :
xxxxxxxxxx
extended_spam_headers = true;
重启rspamd。
Rspamd提供了一个用于管理和显示图形的web界面。web界面偏向于处理数百或数千条同时消息的稳定流的大型网站。许多统计功能不适用于小型服务器。当服务器每小时收到50条消息时,“每分钟被拒绝的垃圾邮件数量”毫无意义。
web界面允许您配置一些但不是全部的rspamd函数。这些更改存储在数据库中。web界面中的更改会覆盖配置文件中的更改。一旦你开始使用web界面配置rspamd,识别你所做的所有更改就很有挑战性。基于Web的rspamd管理是一个单向的过程:开始使用它,就无法返回配置文件。使用你喜欢的任何一种,但要保持一致。
web界面通过控制器套接字访问 rspamd
。您之前在套接字中设置了只读和读写密码。web界面使用相同的密码。如果您不想通过web界面配置rspamd,请使用只读密码保护自己。
您只能通过端口11334从本地主机访问web界面。我们可以配置您的web服务器来代理这些请求,但您应该先验证网站是否正常工作。使用lynx等纯文本浏览器测试终端中的web界面:
xxxxxxxxxx
$ lynx localhost:11334
你会得到一个最小的网页,抱怨lynx缺乏JavaScript支持,但它证实了一个网站的存在。
现在设置您的web服务器以将请求转发到它。在web服务器中配置非密码访问控制。这是Apache 2.4的一个代码片段,它将所有请求转发到 /rebelscum 到rspamd代理,并限制对我的办公网络的访问:
xxxxxxxxxx
RewriteEngine On
RewriteRule ^/rebelscum$ /rebelscum/ [R,L]
RewriteRule ^/rebelscum/(.*) http://localhost:11334/$1 [P,L]
<Location /rebelscum>
Require ip 203.0.113.0/24
</Location>
即使在只读模式下,界面也能提供方便的信息。顶部的菜单提供了许多rspamd功能的信息。 Status 选项卡提供通用统计信息和图表。 Throughput 图提供了有关rspamd如何对消息进行分类的更多详细信息。Configuration 允许您设置操作阈值和编辑某些其他设置。 Symbols 选项卡显示rspamd安装中的所有符号。在 Scan 下,您可以粘贴消息并查看rspamd将如何评估它。最后,History 显示了接收到的消息的完整历史记录、应用于消息的符号以及扫描结果。
现在,您可以将Postfix连接到rspamd。你的邮件会有新的标题,但不会有过滤、拒绝或其他更改,除非邮件是极其垃圾的。
Rspamd的 proxy worker 进程处理负载平衡、镜像流量和向扫描层馈送请求等功能。它还在 localhost
端口11332上提供了一个milter。Rspamd不提供Unix套接字生成器。我们将用它来演示如何将Postfix连接到milter。
只有来自互联网的邮件需要SPF验证。您的MTA使用SMTP AUTH验证通过提交服务到达的邮件。只有到达端口25的邮件才应进行SPF合规性测试。您需要配置该过程,这意味着编辑 master.cf 而不是 main.cf 。
默认 master.cf 中第一个未注释的行是标准 smtpd(8)
进程,它在TCP端口25上监听世界。
xxxxxxxxxx
smtp inet n - n - - smtpd
要将选项应用于此进程,请添加 -o
和选项名称。选项 smtpd_milters
将milter附加到 smptd(8)
进程。将按顺序处理多个milters。使用关键字 inet
表示监听TCP端口的milters,使用关键字 unix
表示unix套接字。rspamd milter在 localhost
的11332端口上运行:
xxxxxxxxxx
smtp inet n - n - - smtpd -o smtpd_milters=inet:localhost:11332
用逗号分隔多个milter。如果你有长的 -o
选项,你可以使用大括号来允许空白,使其更容易管理。重新启动postfix,smtpd
将通过rspamd路由所有传入邮件。
它有效吗?在rspamd和邮件日志上运行 tail -f
。从一个测试主机向另一个主机发送另一封邮件。你应该看到活动。
Rspamd的扩展垃圾邮件标题为电子邮件添加了五个新标题。
X-Spam
标头声明此邮件有足够的点数被视为绝对的垃圾邮件。只有当消息的点数超过add_header操作的阈值时,它才会出现。X-Rspamd-Server
标头记录了哪个Rspamd服务器处理了电子邮件。大型服务提供商需要多个rspamd服务器。X-Rspamd-Queue-Id
标头显示该Id,并记录在系统日志中。您可以使用它来识别特定消息的rspamd日志条目。X-Rspamd-Action
,Rspamd会根据测试结果告诉您它建议的操作。X-Spamd-Result
提供此邮件的垃圾邮件总得分、所有结果的符号及其数值得分。识别和理解这些测试是调整rspamd的核心。我们将把大部分时间花在这个标题上。当您在标题或日志中遇到符号时,您可能想知道符号的描述或如何更改其点值。web界面允许您按名称搜索符号。不过,在命令行中,挖掘规则和配置文件很不方便。在开始工作之前,将网站中的符号提取到可恢复的(greppable)列表中。
使用curl或wget或任何你手指知道的工具从网站上抓取符号列表。
xxxxxxxxxx
$ fetch http://localhost:11334/symbols
该文件是压缩的JSON,一行包含十万个字符。用 jq(1)
将其转换为列表。JSON文件包含统计和计时数据,但要查找符号,您只需要符号名称、权重和描述:
xxxxxxxxxx
$ jq -c '.[].rules[] | [.symbol,.weight,.description]' symbols.json > symbols.txt
文件 symbols.txt 每行包含一个符号。带正值的符号表示消息倾向于垃圾邮件,而带负值的符号表示火腿。每个符号都有一个简短的描述。考虑一下这个条目:
xxxxxxxxxx
["MSBL_EBL",7.500000,"MSBL emailbl (https://www.msbl.org/)"]
符号MSBL_EBL的值为7.5,强烈表明此邮件是垃圾邮件。该描述是一个阻止列表网站。访问该网站了解阻止列表及其工作原理。其他条目更难。
xxxxxxxxxx
["RCVD_HELO_USER",3.0,"HELO User spam pattern"]
无论“HELO用户垃圾邮件模式”是什么,它都值得三分。
不幸的是,虽然描述告诉了符号代表的特征,但rspamd并没有提供行为为何是阳性或可疑的详细信息,甚至没有提供此测试的测试目的。经验丰富的垃圾邮件过滤器操作员可能已经知道“HELO用户垃圾邮件模式”的所有信息,但如果我们想了解更多信息,我们需要找到规则定义。我们可以阅读 /usr/share/rspamd 中的Lua规则定义,或者检查C中规则的源代码并尝试提取含义。阅读测试源告诉我,垃圾邮件机器人有时会打开带有收件人电子邮件地址的SMTP对话,如 EHLO mwl@ratoperatedvehicle.com
。我们在第二章就知道这是错误的。
如果测试的重要性让你感到困惑,请查看rspamd邮件列表档案或搜索更大的互联网。
这是来自亚马逊联盟计划的合法电子邮件的典型X-Spamd-Result标头:
xxxxxxxxxx
X-Spamd-Result: default: False [1.30 / 500.00];
URI_COUNT_ODD(1.00)[7];
R_PARTS_DIFFER(1.00)[100.0%];
DMARC_POLICY_ALLOW(-0.50)[amazon.com.au,quarantine];
FORGED_SENDER(0.30)[associates@amazon.com.au,202401291702330ba37c0cd7f
7475badc0483049e0p0fe-C5GOEGCBN7OXP@bounces.amazon.com];
R_SPF_ALLOW(-0.20)[+ip4:54.240.0.0/18:c];
R_DKIM_ALLOW(-0.20)[amazon.com.au:s=p3dozbfvgms6qio3537seunjegojqglw,a
mazonses.com:s=hsbnp7p3ensaochzwyq5wwmceodymuwv];
MIME_GOOD(-0.10)[multipart/alternative,text/plain];
…
第一行声明此测试是使用默认的rspamd规则执行的。在要求的500分中,它的总分为1.30分。
考虑第一个符号 URI_COUNT_ODD
。描述为“多部分/替代消息中URI的奇数”。但为什么这很重要?Rspamd没有说。您必须从对协议和工具的理解中得出更深层次的含义。在这种情况下,这是一条HTML消息。它有一个纯文本版本。纯文本版本中的链接数量应与HTML版本中的连接数量相同。如果他们没有,那就很可疑。
第二个符号 R_PARTS_DIFFER
被描述为“文本和HTML部分不同”。垃圾邮件发送者通常只针对查看HTML邮件的人。这并不是说那些以文本形式阅读电子邮件的人不太容易受到骗局的影响——所有人都有硬件漏洞。HTML邮件很容易显示一个亮红色的按钮,上面写着“点击此处领取免费的landspeeder”,但在纯文本中,这个链接显然会导致明目张胆的骗局网站。垃圾邮件发送者经常用从古腾堡项目或其他无害来源提取的无害文本填充纯文本版本,希望这些文本会混淆贝叶斯分析。不过,纯文本版本也不包括表情符号,所以这个测试只值一分。
web界面将 DMARC_POLICY_ALLOW
描述为“DMARC许可策略”。您会发现DMARC的几个符号。每个符号描述了消息传递DMARC的不同方式。成功的DMARC值半分。
FORGED_SENDER
符号看起来很可疑,不是吗?它被描述为“发件人是伪造的(不同于From:header和smtp MAIL From:addresses)。”这条消息声称来自一个看起来正常的亚马逊地址,但实际的MAIL From是 bounces.Amazon.com
上的一长串字母和数字。为什么伪造的电子邮件只值0.3分?自动化。您所在组织的web服务器可能会以用户 www
的身份发送邮件,但您需要它显示为 billion@
或 bountities@
或其他什么。
再往下看,我们有成功的SPF和DKIM,以及正确的MIME。把所有这些加起来,你会得到1.3分。
然而,这条消息进行了更多的测试。
xxxxxxxxxx
RCPT_COUNT_ONE(0.00)[1];
ASN(0.00)[asn:16509, ipnet:54.240.24.0/22, country:US];
MIME_TRACE(0.00)[0:+,1:+,2:~];
MISSING_XM_UA(0.00)[];
ARC_NA(0.00)[];
DWL_DNSWL_NONE(0.00)[amazonses.com:dkim];
RCVD_IN_DNSWL_NONE(0.00)[54.240.25.3:from];
FROM_HAS_DN(0.00)[];
RCVD_COUNT_ZERO(0.00)[0];
FROM_NEQ_ENVFROM(0.00)[associates@amazon.com.au,202401291702330ba37c0c
d7f7475badc0483049e0p0fe-C5GOEGCBN7OXP@bounces.amazon.com];
TO_MATCH_ENVRCPT_ALL(0.00)[];
TO_DN_NONE(0.00)[];
DKIM_TRACE(0.00)[amazon.com.au:+,amazonses.com:+]
所有这些测试的权重都为零。每个都描述了电子邮件中检测到的一种情况,但默认的rspamd规则声明它们无关紧要。值得研究这些符号,看看它们是否可能表明您环境中的垃圾邮件行为。它们还可能会引导您找到此消息不匹配的符号,但会指示可疑消息。符号列表显示, RCPT_CONT_ONE
表示此邮件发往一个收件人。这在我的小服务器上很正常。少数收件人是正常的。搜索更广泛的 RCPT_COUNT
会显示两个收件人的符号,3-5个收件人,7-11个收件人,以此类推,直到“50以上”。这可能很有趣。
“肯定是垃圾邮件”的默认得分是6,“拒绝此邮件”的默认分数是15,但这封壮观的信件取得了令人印象深刻的38.9分:
xxxxxxxxxx
X-Spamd-Result: default: False [38.90 / 500.00];
FUZZY_DENIED(12.00)[1:9052c3c872:1.00:txt];
MSBL_EBL(7.50)[agentmichealfbi@gmail.com:email,agentmichealfbi@gmail.com:replyto];
RCVD_HELO_USER(3.00)[];
FORGED_MUA_OUTLOOK(3.00)[];
MISSING_MID(2.50)[];
HFILTER_HOSTNAME_UNKNOWN(2.50)[];
RBL_SENDERSCORE(2.00)[148.135.13.66:from];
RBL_VIRUSFREE_BOTNET(2.00)[148.135.13.66:from];
MISSING_TO(2.00)[];
RECEIVED_SPAMHAUS_XBL(1.00)[103.169.216.1:received];
AUTH_NA(1.00)[];
OLD_X_MAILER(0.40)[];
RCVD_NO_TLS_LAST(0.10)[];
MIME_GOOD(-0.10)[text/plain];
…
X-Spam: Yes
FUZZY_DENIED
符号表示文本主体类似于Rspamd Inc的模糊哈希服务中被识别为垃圾邮件的文本。权重为12表示此邮件中的大部分内容与已识别的垃圾邮件相匹配。
MSBL_EBL
的描述指出,该消息来自MSBL阻止列表上的主机,并给出了一个描述阻止列表及其工作原理的网页。Rspamd信任此列表,并为其分配7.5分。
下一个符号是 RCVD_HELO_USER
。它被描述为“HELO用户垃圾邮件模式”。有关更多详细信息,您必须阅读定义该符号测试的Lua代码。
FORGED_MUA_OUTLOOK
很容易理解。描述是“伪造的Outlook MUA”。发件人伪造了一些邮件头,试图假装邮件是从微软的桌面客户端发送的,但做得很糟糕。您可能不喜欢将Outlook用作客户端,但假冒的Outlook更糟糕,值得得三分。
MISSING_MID
?什么是MID,我们为什么关心它?它被描述为“缺少消息ID标头”。所有合法的MTA都应用 Message-ID
标头,但无论发送什么,都不会打扰。
根据描述,当发送MTA没有反向DNS时,会出现 HFILTER_HOSTNAME_UNKNOWN
。实际的MTA需要正确的正向和反向DNS。权重为2.5,这条规则很严重。
接下来的两个符号(以 RBL
开头)引用了发送主机显示的两个不同的块列表。
MISSING_TO
告诉我们原始消息没有 TO:
头。另一个MTA故障。
RECEIVED_SPAMHAUS_XBL
符号告诉我们发件人在SPAMHAUS XBL、漏洞利用和僵尸网络过滤器上。发送者不是病毒或入侵者。它只是驻留在由病毒或入侵者控制的主机上。这值得一分。
AUTH_NA
可能看起来令人费解,但描述说它只是缺少SPF、DKIM、DMARC,甚至ARC。就像缺少反向DNS一样,这暗示着这个主机不是用来发送邮件的。
OLD_X_MAILER
标头表示该标头表示这是由旧邮件客户端发送的。该垃圾邮件机器人不仅伪造了Outlook,而且伪造了一个旧版本。
RCVD_NO_TLS_LAST
表示此消息是在没有TLS的情况下传递的。TLS通常是首选,但尚未广泛部署到需要的程度。这只是0.1分。
此垃圾邮件插件无法伪装成合法的邮件客户端,并且主机不是合法的邮件服务器。垃圾邮件发送者甚至懒得为他们的垃圾配置SPF记录。MIME_GOOD
表明,他们确实正确地配置了消息以显示HTML和文本版本。这部分是用户可见的,所以他们必须正确地完成。
在这些之后,我们看到了通常的零点符号列表。
最后,还有一个X-Spam
标头。如果消息得分高于 add_header
操作,rspamd会添加此标头以表示该消息是垃圾邮件。你可以过滤它。
安装了rspamd后,您可能会冒着通知世界您的邮件系统存在的风险。