在云服务商提供的防火墙过于昂贵的情况下,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 | location ~ \.php$ { |
在上述配置中,我们将burst设置为2,为超过限制的请求留下一定的缓冲空间。
配置完成后,重启Nginx,可以使用Apache Bench(ab)工具测试一下是否在nginx error.log中生效。
安装和配置Fail2Ban
接下来,我们开始安装和配置Fail2Ban。首先,从GitHub上克隆Fail2Ban的源码,然后进入源码目录,使用Python的setup.py脚本进行安装。
1 | git clone https://github.com/fail2ban/fail2ban.git |
然后,将Fail2Ban的启动脚本复制到/etc/init.d目录,然后使用update-rc.d命令设置Fail2Ban为开机启动,并使用service命令启动Fail2Ban。
1 | cp files/debian-initd /etc/init.d/fail2ban |
如果在启动Fail2Ban时遇到”masked”错误,可以使用下面的命令取消屏蔽:
1 | systemctl unmask fail2ban |
然后,我们编辑/etc/fail2ban/jail.local文件,为Fail2Ban添加一些配置。例如,我们可以设置封禁时间为24小时,启用sshd和nginx-limit-req的监控等。
1 | [DEFAULT] |
然后再使用Apache Bench(ab)工具测试一下你的网站,你会发现Fail2Ban已经将测试请求的IP地址封禁了。你可以使用以下命令解封一个IP地址:
1 | fail2ban-client unban <your-ip> |
以上就是使用Fail2Ban保护服务器免受DDoS攻击的基本步骤。希望这篇文章对你有所帮助。