转自:https://kyle.ai/blog/6215.html
最近总有一些无聊的人,会来扫描一下我的服务器,看有没有啥漏洞可以利用的。。。
可以看到类似这样的404访问日志:
这种攻击的特点就是短时间内会大量的404请求,可以利用这一特点,用工具进行拦截,检测到多少时间内,404请求数超过了多少,就把这个ip给封掉。
于是就从网上搜索到了这个工具:fail2ban,官方主页:https://www.fail2ban.org/wiki/index.php/MANUAL_0_8
在Ubuntu中安装fail2ban很简单:
安装好后,配置文件在 /etc/fail2ban 里面。
首先我们需要配置一个filter规则,以便检测我们的日志文件中404的目标。
vim /etc/fail2ban/filters.d/web-404.conf
写好规则后,可以用命令行测试一下能不能命中:
有一点必须注意,你的日志文件中,行的开头一定要先命中时间戳,格式可以是系统能识别的时间格式,如果没有命中时间,那么你写的filter规则是永远不会被命中的。
比如我刚开始的日志格式是这样的:
日期格式 20170607 不能被识别,所以我写的filter规则死活命中不了。。。
官方文档有解释:https://www.fail2ban.org/wiki/index.php/MANUAL_0_8
如果要自定义时间格式,可以在filter的配置中设置 datepattern 参数,详情见官方文档:https://manpages.debian.org/testing/fail2ban/jail.conf.5.en.html
定义好filter后,就可以写ban的规则:
cat /etc/fail2ban/jail.local
上面配置的含义就是,使用 moviex_web-404 这一个filter配置,检测日志文件logpath,在findtime时间内,匹配到 maxretry 次数后,就ban掉对方的ip,在有效时间 bantime 内,拒绝对方连接 port 参数指定的端口。
logpath 的第二个参数可以是 head 或 tail,默认为head,从日志的开头进行匹配,这样有个不好的地方就是每次重启fail2ban后,都要从日志开头匹配一遍。
如果有多个logpath,则换行写,一行写一条。
可以在 jail.local 中定义忽略ip,比如说google 爬虫的ip地址,在jail.local文件中加上配置:
如果想要让ip白名单只针对某些jail规则生效,则可以使用fail2ban-client命令来设置。例如:
重启fail2ban生效后,可以查看日志 /var/log/fail2ban.log 来看检测情况,也可以通过命令行来查看状态:
fail2ban-client 还有很多其它命令,可以参考文档说明: fail2ban-client –help