0%

使用Fail2Ban保护服务器免受DDoS攻击

在云服务商提供的防火墙过于昂贵的情况下,Fail2Ban能够为低配置服务器提供有效的DDoS保护,特别适合外包公司将多个网站部署在同一服务器上的情况。Fail2Ban通过定时读取日志文件,并根据规则提取恶意IP,然后将其加入iptables防火墙系统,这样恶意流量就不会流入Nginx,造成高负载,进而导致服务器宕机。

配置Nginx的限制请求模块

首先,我们需要配置Nginx的限制请求模块(nginx-limit-req),超出限制的请求将被记录在Nginx的错误日志中。我们在Nginx配置文件中加入以下配置:

1
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

在上述配置中,我们为每个IP地址设置了每秒10次的请求限制。然后,在Nginx的location配置块中(这里以处理PHP的location为例)加入以下配置:

1
2
3
4
5
6
location ~ \.php$ {
limit_req zone=one burst=2;
fastcgi_pass php-upstream;
include fastcgi_params;
....
}

在上述配置中,我们将burst设置为2,为超过限制的请求留下一定的缓冲空间。

配置完成后,重启Nginx,可以使用Apache Bench(ab)工具测试一下是否在nginx error.log中生效。

安装和配置Fail2Ban

接下来,我们开始安装和配置Fail2Ban。首先,从GitHub上克隆Fail2Ban的源码,然后进入源码目录,使用Python的setup.py脚本进行安装。

1
2
3
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
sudo python setup.py install

然后,将Fail2Ban的启动脚本复制到/etc/init.d目录,然后使用update-rc.d命令设置Fail2Ban为开机启动,并使用service命令启动Fail2Ban。

1
2
3
cp files/debian-initd /etc/init.d/fail2ban
update-rc.d fail2ban defaults
service fail2ban start

如果在启动Fail2Ban时遇到”masked”错误,可以使用下面的命令取消屏蔽:

1
systemctl unmask fail2ban

然后,我们编辑/etc/fail2ban/jail.local文件,为Fail2Ban添加一些配置。例如,我们可以设置封禁时间为24小时,启用sshd和nginx-limit-req的监控等。

1
2
3
4
5
6
7
[DEFAULT]
bantime = 24h
[sshd]
enabled = true
[nginx-limit-req]
logpath = /root/laradock/logs/nginx/error.log #这里我使用docker,这是docker volumes对应的日志,你需要选择你的nginx日志
enabled = true

然后再使用Apache Bench(ab)工具测试一下你的网站,你会发现Fail2Ban已经将测试请求的IP地址封禁了。你可以使用以下命令解封一个IP地址:

1
fail2ban-client unban <your-ip>

以上就是使用Fail2Ban保护服务器免受DDoS攻击的基本步骤。希望这篇文章对你有所帮助。