如何在 CentOS 7 上使用适用于 Apache 的 mod_evasive 来防范 DoS 和 DDoS
介绍
mod_evasive Apache 模块,以前称为 mod_dosevasive,有助于防止对 Apache Web 服务器的 DoS、DDoS(分布式拒绝服务)和暴力攻击。它可以在攻击期间提供规避操作,并通过电子邮件和系统日志工具报告滥用行为。该模块通过创建 IP 地址和 URI 的内部动态表以及拒绝来自以下任何一个的任何单个 IP 地址来工作:
- 每秒多次请求同一页面
- 每秒对同一个孩子发出超过 50 个并发请求
- 在暂时列入黑名单期间提出任何要求
如果满足上述任何条件,则会发送 403 响应并记录 IP 地址。或者,可以向服务器所有者发送电子邮件通知,或者可以运行系统命令来阻止 IP 地址。
在本教程中,我们将讨论如何在您的服务器上安装、配置和使用 mod_evasive。
先决条件
在开始使用本教程之前,您应该具备以下条件:
- CentOS 7 64 位 Droplet(也适用于 CentOS 6)
- 具有 sudo 权限的非根用户。要设置这种类型的用户,请遵循 CentOS 7 教程的初始服务器设置。所有命令都将以此用户身份运行。
- 在 Droplet 上运行的 Apache 网络服务器。要安装 Apache,请按照如何在 CentOS 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈一文的步骤 #1 进行操作。
第 1 步 — 安装 mod_evasive
在本节中,我们将安装 mod_evasive 运行所需的包,并最终安装 mod_evasive。
首先,我们需要在服务器上安装 EPEL (Extra Packages for Enterprise Linux) yum 仓库。 EPEL 是一个 Fedora 特殊兴趣小组,它为 Enterprise Linux 创建、维护和管理一组高质量的开源附加软件包。运行以下命令在您的服务器上安装并启用 EPEL 存储库:
在 CentOS 7 上:
- sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
在 CentOS 6 上:
- sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
让我们使用以下方法验证是否启用了 EPEL 存储库:
- sudo yum repolist
如果启用,您将在输出中看到以下 repo:
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64
现在,让我们使用 yum 插件 protectbase 保护基础包免受 EPEL 的影响。
- sudo yum install yum-plugin-protectbase.noarch -y
protectbase 插件的目的是保护某些 yum 存储库免受来自其他存储库的更新。受保护存储库中的包不会被不受保护存储库中的包更新或覆盖,即使不受保护的存储库具有更高版本。
现在我们准备安装 mod_evasive 模块。运行以下命令来安装它:
- sudo yum install mod_evasive -y
第 2 步 — 验证安装
现在安装了 mod_evasive,让我们验证配置文件是否已安装并且模块是否正在加载。
安装时添加了mod_evasive配置文件/etc/httpd/conf.d/mod_evasive.conf
。要验证此运行:
- sudo ls -al /etc/httpd/conf.d/mod_evasive.conf
输出应类似于:
-rw-r--r-- 1 root root 3473 Jul 21 01:41 /etc/httpd/conf.d/mod_evasive.conf
默认情况下,以下 LoadModule
行将添加到配置文件 mod_evasive.conf
的顶部。打开文件并添加该行(如果它不存在)。这一行告诉 Apache Web 服务器加载和使用 mod_evasive 模块。
在 CentOS 7 上,该行应如下所示:
LoadModule evasive20_module modules/mod_evasive24.so
在 CentOS 6 上,该行应如下所示:
LoadModule evasive20_module modules/mod_evasive20.so
让我们列出为 Apache Web 服务器加载的模块并查找 mod_evasive:
- sudo httpd -M | grep evasive
输出应显示:
evasive20_module (shared)
第 3 步 — 配置 mod_evasive
现在安装已完成并经过验证,让我们看看模块的配置。 mod_evasive 可以通过 mod_evasive.conf
配置文件轻松定制。我们将在本教程中讨论一些配置参数。有关所有参数的信息,请参阅配置文件 - 它包含每个参数的说明。
您需要更改的配置选项之一是 DOSEmailNotify
。这是一个非常有用的指令。如果设置了这个值,每当 IP 地址被列入黑名单时,都会向指定的电子邮件地址发送一封电子邮件。电子邮件正文将显示 mod_evasive HTTP Blacklisted 111.111.111.111
例如,如果您想发送 mod_evasive 警报说 sammy@example.com,请编辑文件:
- sudo nano /etc/httpd/conf.d/mod_evasive.conf
通过删除行前面的 #
取消注释 DOSEmailNotify
行,并将电子邮件地址更改为您的:
DOSEmailNotify sammy@example.com
注意:mod_evasive 使用 /bin/mail
发送电子邮件警报。您需要安装并运行邮件服务器,请参阅本教程以获取有关如何设置简单邮件服务器以便电子邮件通知正常工作的信息。
您可能要设置的另一个参数是 DOSWhitelist
。使用此选项,可以将受信任客户端的 IP 地址添加到白名单中,以确保它们永远不会被拒绝。白名单的目的是保护软件、脚本、本地搜索机器人或其他自动化工具不会因从服务器请求大量数据而被拒绝。
要将 IP 地址列入白名单,例如 111.111.111.111,请将条目添加到配置文件中,如下所示:
DOSWhitelist 111.111.111.111
如有必要,通配符最多可用于 IP 地址的最后 3 个八位字节。
要将来自不同 IP 范围的多个 IP 地址列入白名单,您可以在配置文件中添加单独的 DOSWhitelist 行,如下所示:
DOSWhitelist 111.111.111.111
DOSWhitelist 222.222.222.222
DOSPageCount
和 DOSSiteCount
是建议更改为不太激进的值的另外两个参数,以避免客户端被不必要地阻止。
DOSPageCount
是一个 IP 地址每页间隔(通常设置为一秒)对同一页的请求数限制。一旦超过该间隔的阈值,客户端的 IP 地址将被添加到阻止列表中。默认值设置得非常低,为 2。您可以通过在 /etc/httpd/conf.d/mod_evasive.conf
中编辑以下内容,将其更改为更高的值,例如 20:
DOSPageCount 20
DOSSiteCount
是每个站点间隔(默认为 1 秒)的 IP 地址对同一网站的请求总数限制。要将其更改为更大的值,例如 100 秒:
DOSSiteCount 100
您可以更改其他一些参数以获得更好的性能。
一个是 DOSBlockingPeriod
,这是客户端(IP 地址)被添加到阻止列表后将被阻止的时间(以秒为单位)。在此期间,来自客户端的所有后续请求将导致 403(禁止)错误并重置计时器(默认为 10 秒)。
例如,如果您想将阻塞时间增加到 300 秒:
DOSBlockingPeriod 300
另一个是 DOSLogDir
,它指的是 mod_evasive 使用的临时目录。默认情况下,/tmp
将用于锁定机制,如果您的系统对 shell 用户开放,这会带来一些安全问题。如果您有非特权 shell 用户,您将需要创建一个目录,该目录只能写入运行 Apache 的用户(通常是 apache),然后在您的 mod_evasive.conf 文件中设置此参数。
例如,要将 mod_evasive 使用的目录设置为 /var/log/mod_evasive
,请使用以下命令创建目录:
- sudo mkdir /var/log/mod_evasive
然后将所有权设置为 apache
用户:
- sudo chown -R apache:apache /var/log/mod_evasive
现在编辑 mod_evasive 配置并更改目录,如下所示:
DOSLogDir "/var/log/mod_evasive"
另一个参数是 DOSSystemCommand
。如果设置了一个值,则只要将 IP 地址列入黑名单,就会执行指定的命令。使用此参数,您可以将 mod_evasive 与安装在服务器上的防火墙或 shell 脚本集成,并在防火墙中阻止被 mod_evasive 列入黑名单的 IP 地址。
第 4 步 — 加载 mod_evasive 模块
一旦我们对配置文件进行了更改,我们需要重新启动 Apache Web 服务器以使它们生效。运行以下命令以重新启动 Apache。
在 CentOS 7 上:
- sudo systemctl restart httpd.service
在 CentOS6 上:
- sudo service httpd restart
注意:请注意,mod_evasive 似乎与 FrontPage 服务器扩展冲突。您可能还想检查您的 Apache Web 服务器设置以确保 mod_evasive 能够正常运行。建议的 Apache 调整是为 MaxRequestsPerChild
设置非常高的值,但不是无限的(零值表示无限制),并使用 KeepAliveTimeout
启用 KeepAlive
> 设置得相当长。
第 5 步 — 测试 mod_evasive
让我们做一个简短的测试,看看模块是否正常工作。我们将使用由 mod_evasive 开发人员编写的 perl 脚本 test.pl。要执行脚本,我们需要先在服务器上安装 perl
包:
- sudo yum install -y perl
测试脚本随 mod_evasive 安装在以下位置:
/usr/share/doc/mod_evasive-1.10.1/test.pl
默认情况下,测试脚本连续 100 次从 Apache Web 服务器请求同一页面以触发 mod_evasive。在上一节中,我们修改了 mod_evasive 以更容忍每秒对同一页面的请求。我们需要将脚本更改为连续 200 个请求而不是 100 个,以确保我们触发所有 mod_evasive 的通知方法。
编辑 /usr/share/doc/mod_evasive-1.10.1/test.pl
:
- sudo nano /usr/share/doc/mod_evasive-1.10.1/test.pl
找到以下行:
for(0..100) {
将 100 替换为 200:
for(0..200) {
保存并退出。
要执行脚本,请运行:
- sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl
您应该看到类似于以下内容的输出:
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
...
该脚本向您的 Web 服务器发出 100 个请求。 403 响应代码表示访问被 Web 服务器拒绝。当 IP 地址被阻止时,mod_evasive 也会记录到系统日志。使用以下命令检查日志文件:
- sudo tailf /var/log/messages
它应该显示类似于以下内容的行:
Jul 29 00:11:18 servername mod_evasive[18290]: Blacklisting address 127.0.0.1: possible DoS attack.
表明 IP 地址被 mod_evasive 阻止。
如果您已将 mod_evasive 配置为在 IP 被阻止时发送电子邮件警报,您将在收件箱中收到一封包含以下内容的电子邮件:
mod_evasive HTTP Blacklisted 127.0.0.1
结论
mod_evasive 非常擅长抵御单服务器、脚本攻击以及分布式攻击。但是,它仅对服务器处理和响应无效请求的总带宽和处理器容量有用。出于这个原因,最好将此模块与您的服务器防火墙集成以获得最大程度的保护。如果没有真正良好的基础设施和适当的防火墙,严重的 DDoS 攻击可能仍会使您脱机。如果攻击非常严重且持续存在,您可能需要转向基于硬件的 DDoS 缓解解决方案。