nginx搭配fail2ban 屏蔽恶意爬虫

项目上线之后,查看日志,发现有很多爬虫在恶意扫描网站,对服务器的性能和资源造成了影响,决定使用 fail2ban 稍微屏蔽下这些家伙

安装fail2ban

ubuntu

1
sudo apt-get install fail2ban

centos

1
sudo yum install fail2ban

配置fail2ban

编写规则

1
2
3
4
5
6
sudo vim /etc/fail2ban/filter.d/nginx-404.conf

## 加入以下内容
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD).*HTTP.*" 404
ignoreregex =

编写fail2ban配置

1
2
3
4
5
6
7
8
9
10
11
sudo vim /etc/fail2ban/jail.local

## 加入以下内容
[nginx-404]
enabled = true
port = http,https
filter = nginx-404
logpath = /var/log/nginx/access.log #根据实际日志路径配置
maxretry = 10 #最大尝试次数
findtime = 300 #允许失败次数的时间范围
bantime = 86400 #客户端主机禁止时长(秒)

重启fail2ban

1
2
3
4
#ubuntu
sudo service fail2ban restart
#centos
sudo systemctl restart fail2ban

nginx屏蔽普通爬虫

Nginx可以根据User-Agent过滤请求,在URL入口位置通过一个正则表达式就可以过滤不符合要求的爬虫请求,代码如下:

1
2
3
4
5
6
7
location / {
if ($http_user_agent ~* "python|curl|java|wget|httpclient|okhttp") {
return 503;
}
# 正常处理
...
}

变量$http_user_agent是一个可以直接在location中引用的Nginx变量。~*表示不区分大小写的正则匹配,通过python就可以过滤掉80%的Python爬虫。

常用命令

1
2
3
4
5
6
7
8
# 查看使用那些规则
sudo fail2ban-client status

# 列出被禁止的IP
sudo iptables -nvL

# 移除被禁止的IP
sudo iptables -D f2b-nginx-404 -s 6.6.6.6 -j REJECT

参考链接
https://linux.cn/article-6718-1.html

https://serverfault.com/questions/849854/fail2ban-blocking-behaviours-depending-on-the-status-code

参考