我知道这是一个老问题,但由于它没有公认的答案,这里是两个工具之间的比较。在线搜索您几乎总能找到安装两者的建议。有人可以随时告诉我我错了,但我认为这是对资源的浪费。在我看来,带有 CRS 3.3.1 的 ModSecurity 2.9.3 的当前版本可以代替运行 mod_evasive。我认为它做得更好并且更可配置,尽管两者略有不同。
mod_evasive默认情况下,当来自同一 Apache 站点的 IP 地址达到 50/秒时,将阻止来自该 IP 地址的请求。它还有一个单独的设置来阻止来自 IP 地址对站点上“同一页面”的请求。这默认为 2/秒,对于大多数网站来说这将是很低的。默认的阻塞期是 10 秒(我认为很低)。当然,所有这些都可以配置。mod_evasive 和 mod_security 之间的主要区别在于 mod_evasive 默认情况下还会阻止“同一页面”请求。我还应该提到 mod_evasive 使用 Apache 子进程号来确定请求是否计入 IP 地址。如果 Apache 产生一个新进程,那么这些请求将不计入一个块。此外,即使在阻塞之后,某些请求也可能会通过。MaxRequestsPerChild
默认情况下,安装了核心规则集的mod_security不能防止 DOS 攻击。crs-setup.conf
您必须通过取消注释规则 900700在文件中专门启用该功能:
SecAction \
"id:900700,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:'tx.dos_burst_time_slice=60',\
setvar:'tx.dos_counter_threshold=100',\
setvar:'tx.dos_block_timeout=600'"
这是它的作用:默认情况下,当客户端在 60 秒内发出 100 个或更多请求时,它将阻止来自特定 IP 地址的请求。因此,例如,如果客户端在 30 秒内发出 100 个请求,它们将被阻止 600 秒。还有其他设置会影响这一点:如果setvar:tx.paranoia_level=1
然后两次突发 100 个请求,每个请求都需要在 60 秒内才能发生阻塞。但是,如果您设置 'setvar:tx.paranoia_level=2' 或更大,则只需要一次突发。ModSecurity 还添加了另一个不错的默认功能:它从请求计数器中排除静态文件。在规则 900260 中,默认扩展名是:setvar:'tx.static_extensions=/.jpg/ /.jpeg/ /.png/ /.gif/ /.js/ /.css/ /.ico/ /.svg/ /.webp/'
当客户端请求静态文件时,这有助于防止意外阻塞,因为这些不需要来自服务器的大量资源。这样我们就可以专注于 DOS 攻击,这些攻击实际上可以降低服务器速度,同时减少误报。
结论
如果想轻松控制特定页面请求的阻塞,或者您需要快速、轻松地设置 DOS 保护,请启用 mod_evasive。我还要补充一点,配置 mod_evasive 以更新您的 iptables 并在命中时运行脚本可能更容易一些。
如果您想更好地控制如何阻止 DOS 攻击的各个方面以及在阻止期间发生的情况,那么您真的只需要 mod_security。如果您只关心 DOS 攻击,那么 mod_security 可能是矫枉过正。就 DDoS 攻击而言,我认为这两种工具在默认设置下同样有用,因为它们都按 IP 地址存储哈希表。现在,如果您想为 mod_security 编写特定规则,那么您阻止的方式和内容没有限制,如果您认为需要,您甚至可以重新创建 mod_evasive 的逐页请求功能。