爬虫IP黑名单自动拦截恶意抓取:服务器运维实战教程
网站上线后,很快会遇到各种爬虫:搜索引擎是好帮手,但恶意抓取、采集、CC攻击的爬虫则会大量消耗服务器资源。
手动封IP太累,而且容易漏封。
本文介绍一种自动拦截方案——使用 Fail2ban 监控 Nginx 日志,一旦检测到异常行为(比如短时间内大量404、请求特定敏感路径),就自动将该 IP 加入黑名单。
全程只需配置一次,后续自动生效。
环境准备:确认系统与安装 Fail2ban
本文操作基于 CentOS 7/8 或 Ubuntu 20.04/22.04,Nginx 已正常运行。
你需要有服务器的 SSH 登录权限,并且知道 root 密码或 sudo 权。
第一步:更新系统并安装 Fail2ban
CentOS 系列执行:
yum install epel-release -y
yum install fail2ban -y
Ubuntu/Debian 系列执行:
apt update
apt install fail2ban -y
安装完成后启动服务并设置开机自启:
systemctl start fail2ban
systemctl enable fail2ban
第二步:确认 Nginx 日志路径
Fail2ban 默认读取 /var/log/nginx/access.log。如果你的日志路径不同,请在后续配置中对应修改。
配置自动拦截规则:让 Fail2ban 识别恶意抓取
Fail2ban 通过“过滤器(filter)”匹配日志特征,然后触发“行动(action)”封禁 IP。
我们使用官方自带的 nginx-botsearch 过滤器,它专门对付扫描敏感路径或攻击的爬虫。
创建本地配置文件(不要直接修改默认的 jail.conf):
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑 jail.local,找到 [nginx-botsearch] 部分,修改为:
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 600
bantime = 3600
参数说明:
maxretry = 5:在 600 秒内匹配到 5 次规则即封禁bantime = 3600:封禁 3600 秒(1 小时),可改为-1永久封禁findtime = 600:统计窗口 600 秒
如果你希望拦截更严格(比如大量 404),可以自定义过滤器。
新建文件 /etc/fail2ban/filter.d/nginx-cc.conf:
[Definition]
failregex = ^ -.* "(GET|POST).*" 404 .*$
ignoreregex =
然后在 jail.local 中增加:
[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
logpath = /var/log/nginx/access.log
maxretry = 20
findtime = 60
bantime = 3600
这个规则会在 60 秒内出现 20 次 404 时封 IP,适合拦截扫描恶意路径的爬虫。
配置完成后重启 Fail2ban:
systemctl restart fail2ban
避坑指南:新手最容易踩的 4 个坑
1. 忘记放行自己的 IP
一旦配置生效,你自己的 IP 也可能因为测试触发规则被封。建议在 /etc/fail2ban/jail.local 的 [DEFAULT] 段添加:
ignoreip = 127.0.0.1/8 你的公网IP
多个 IP 用空格隔开。
2. 日志路径不对
如果 Nginx 日志不是默认位置,logpath 必须写对。可以用 tail -f /your/log/path 验证。
3. 杀敌一千自损八百——bantime 设置过短
建议先设为 2 小时(7200 秒),运行正常后再调整。永久封禁(-1)要谨慎,万一误封就很难解。
4. 没有及时查看封禁状态
用以下命令检查被封 IP 列表:
fail2ban-client status nginx-botsearch
输出显示当前封禁的 IP 数量和解封时间。
效果验证:确保拦截生效
第一步:模拟攻击测试
在另一台机器(或本地终端)执行:
for i in {1..10}; do curl -I http://你的服务器IP/不存在路径; done
这会连续请求 10 次不存在的路径,触发 404 规则。
第二步:查看失败日志
fail2ban-client status nginx-cc
如果显示 Currently banned: 1,说明封禁成功。
第三步:验证正常访问
用浏览器访问你的网站,确认正常页面不受影响。如果自己也被封,从 ignoreip 列表移除后重启 fail2ban 即可。
高频问题解答(FAQ)
Q:我不会用命令,有面板方案吗?
A:宝塔面板用户可以在“软件商店”安装“Nginx防火墙”插件,它能自动拦截恶意爬虫和 CC 攻击,界面化操作,适合不习惯命令行的新手。但原理和本文的 Fail2ban 一致。
Q:封禁时间到了会自动解封吗?
A:会的。bantime 到期后 IP 自动从黑名单移除。如果需要提前解封,执行 fail2ban-client set nginx-cc unbanip <被封IP>。
Q:如何备份配置?
A:/etc/fail2ban/ 目录下的 .local 文件和自定义 filter 就是全部配置,备份这个目录即可恢复。
如果你按照以上步骤配置,就可以实现爬虫IP黑名单自动拦截恶意抓取,减少服务器资源浪费。
遇到异常时,先检查防火墙规则和日志路径,绝大多数问题都出在这两个地方。