我之前使用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的名字。