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