爬虫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黑名单自动拦截恶意抓取,减少服务器资源浪费。
遇到异常时,先检查防火墙规则和日志路径,绝大多数问题都出在这两个地方。

分享到:
上一篇
数据库索引缺失查询缓慢批量优化:MySQL索引缺失导致查询慢
下一篇
磁盘分区调整无损扩容站点存储空间:磁盘分区调整无损扩容
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意