我知道这是一个老问题,但由于它没有公认的答案,这里是两个工具之间的比较。在线搜索您几乎总能找到安装两者的建议。有人可以随时告诉我我错了,但我认为这是对资源的浪费。
在我看来,带有 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 产生一个新进程,那么这些请求将不计入一个块。此外,即使在阻塞之后,某些请求也可能会通过。您需要确保 Apache 具有较高的 MaxRequestsPerChild 值。
安装了核心规则集的
mod_security 默认情况下无法防御 DOS 攻击。您必须通过取消注释规则 900700 在 crs-setup.conf 文件中专门启用该功能:
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 的逐页请求功能。