linux

fail2ban - 防御cc攻击利器 - 防御ddos攻击

我之前使用zblog后来用emlog,但都是虚拟主机,之后又使用hexo,直到最近才开始使用wordpress,但却遇到了一堆问题,尤其是有大量俄罗斯IP一直在模拟登录,这感觉很恶心,之前一直想基于openresty和lua实现动态拉黑IP,但是又不着急,所以一直搁置,这件事的发生让我觉得很有必要,但我最初的想法是惩罚这个恶意IP,Google的时候发现别人也有类似的想法,惩罚ddos攻击者,而在stackoverflow里,有人建议不要试图去惩罚了,因为背后往往是肉鸡,而应该考虑使用 fail2ban ,所以我很好奇,fail2ban是什么,搜索后发现它可以根据nginx日志及时拉黑恶意IP

背景交代完毕,现在我们一起来看看这个fail2ban的基本配置,至于如何安装,似乎不需要说明,你可以 apt install fail2ban  或者 yum install fail2ban 安装好之后就可以开始配置了,配置文件在 /etc/fail2ban 目录,主要有两个文件夹你需要关心:

1、jail.d  ,即  /etc/fail2ban/jail.d 这个文件夹主要存放具体的任务,理解成任务或许不错,它下面的每个配置文件都代表了要执行的事件吧。

2、filter.d , 即  /etc/fail2ban/filter.d 这个文件夹下面是过滤器,或者理解为筛选器吧,比如,你需要把频繁请求你博客的IP拉黑,那么这件事需要一个描述文件,这个描述文件需要放在  jail.d  目录,而这个描述文件需要一个过滤器,它指定了需要拉黑的IP的特征,已经需要忽略的事件的特征。下面,我们以将频繁请求博客的IP拉黑为例。

首先,fail2ban是根据nginx的日志去筛选事件,比如要拉黑一个IP是一个事件,那么先需要筛选出来,然后拉黑。nginx其实也可以防御ddos攻击,具体请看我之前写的这篇博客:使用Nginx防御ddos攻击  好了,我们先查看nginx拒绝了某个IP的日志  cat /var/log/nginx/error.log找到拒绝后的日志,大致如下:

limiting requests, excess: 10.870 by zone "common", client: 112.10.110.183, serv

现在,我们考虑这段输出如何用正则去匹配,并提取出HOST,首先是以 limiting requests, excess:开头,中间可以理解为任意字符,接着是client: IP 最后的部分也可以理解为任意字符,所以正则可以如下:

limiting requests, excess:.*client: <HOST>

现在,我们创建  /etc/fail2ban/filter.d/nginx-http-limit-request.conf 文件,内容如下:

[Definition]

failregex = limiting requests, excess:.*client: <HOST>

ignoreregex = limiting requests, excess:.*client: 45.77.134.36

这里,45.77.134.36  是我博客地址也是我梯子地址,由于是海外服务器,所以我一般是走代理,所以不要把自己给拉黑了,接着新建  /etc/fail2ban/jail.d/nginx-limit.conf  文件,内容如下:

[nginx-http-limit-request]

enabled  = true
port     = https,http
logpath  = /var/log/nginx/error.log
maxretry = 3
findtime = 120
bantime  = 180

这里,[nginx-http-limit-request]  指定了要使用的过滤器,接着指定了是否启用,以及端口,log文件,maxretry是指 这样的事可以发生几次,findtime 是指每隔多久检查一次log 文件,bantime 是指暗黑时间,我这里拉黑 3分钟。同事,这个目录下有个默认的对ssh的配置你可以删除也可以禁用也可以自己折腾,我是删除了,我的ssh是改了端口且只能证书登录。ssh 相关的你可以查看我这篇博客:ssh命令实用技巧总结

接着,你可以用让fail2ban开机自启并重启服务了:

systemctl enable fail2ban
systemctl restart fail2ban

最后,我们来解决本文开始遇到的难题,将模拟登录的IP给禁掉,有了上线的介绍,应该很明白,其实只需要一个过滤器即可。附上我的过滤器:

/etc/fail2ban/filter.d/nginx-wordpress-login.conf

[Definition]

failregex = <HOST> -.*-.*/wp-login.php HTTP/.* 404 .*

ignoreregex =

那么这里,我为啥没有忽略我自己的IP呢,因为我用了 WPS Hide Login  插件,将我的登录地址改了,所以我不可能访问那个地址,而访问那个地址的绝对是坏人。你也可以测试,让自己触发事件,然后被拉黑,测试是否还能访问。我这边,自己手多的访问了/wp-login.php 结果自己被拉黑,最后通过如下命令进行解封。

fail2ban-client set nginx-wordpress-login unbanip 45.77.134.36

这里,nginx-wordpress-login 是你filter的名字。

full-stack-trip

Share
Published by
full-stack-trip
Tags: ddosnginx

Recent Posts

Android 自定义 View 入门

说来惭愧,工作数年,连基本的自…

4 年 ago

retrofit 同时支持 xml 和 json

retrofit 解析 jso…

4 年 ago

mysql - 存储过程 从入门到放弃

最近有个报表的需求,于是乎用了…

4 年 ago

奶嘴战略 - 你不得不知道的扎心真相(一)

一句:英雄枯骨无人问,戏子家事…

4 年 ago

acme.sh 的简单使用

acme.sh 是纯 shel…

4 年 ago

wrk -更现代化的http压测工具

wrk 是一款更现代化的 ht…

4 年 ago