搭建IP黑名单自动拦截恶意爬虫抓取,三套方案快速落地
核心答案:三招实现IP黑名单自动拦截恶意爬虫
搭建IP黑名单自动拦截恶意爬虫,最常见且对新手友好的方案有三种:使用Fail2ban动态封禁异常请求IP、在Nginx站点配置中直接deny已知恶意IP段、以及利用宝塔面板的防火墙插件进行IP黑名单管理。
本文用最简单的话讲清楚每种方案的准备、操作和验证,你不需要懂复杂原理,照着做就能跑起来。
第一步:搞清楚你面对的是哪种恶意爬虫
在动手之前,先花一分钟判断你要拦截的对象是什么。
恶意爬虫通常表现:短时间大量请求同一个页面、请求头缺少正常浏览器特征(如无User-Agent或User-Agent特别奇怪)、高频访问后台登录文件(如wp-login.php)。
如果只是偶尔的搜索蜘蛛(百度、谷歌),不需要拦截;
只有确定是恶意采数据或攻击的才加入黑名单。
方案一:用Fail2ban自动封禁异常访问IP(推荐Linux主机)
安装Fail2ban
以CentOS 7/8为例,执行:
yum install epel-release -y
yum install fail2ban -y
systemctl enable fail2ban
systemctl start fail2ban
配置针对Nginx的恶意爬虫规则
新建配置文件 /etc/fail2ban/jail.local,写入:
[DEFAULT]
ignoreip = 127.0.0.1
bantime = 3600
findtime = 600
maxretry = 30
[nginx-badbots]
enabled = true
filter = nginx-badbots
logpath = /var/log/nginx/access.log
action = iptables[name=BadBots, port=http, protocol=tcp]
然后创建过滤器文件 /etc/fail2ban/filter.d/nginx-badbots.conf:
[Definition]
failregex = ^ -.*"(GET|POST).*HTTP/.*" 200 .*"-" "(Mozilla/5.0 (compatible; AhrefsBot|Mozilla/5.0 (compatible; SemrushBot|Mozilla/5.0 (compatible; Bytespider)"
ignoreregex =
上面是匹配特定爬虫头部的示例,你可以把实际需要拦截的User-Agent关键词加进去。
重启Fail2ban生效:systemctl restart fail2ban。
之后可用 fail2ban-client status nginx-badbots 查看封禁IP列表。
方案二:在Nginx配置里直接deny已知恶意IP段(适合独立站点)
如果你手头有一份确认的恶意IP列表(比如从日志、公开黑名单获取),直接在站点server块或location块中添加:
location / {
deny 192.168.1.100; # 单个IP
deny 10.0.0.0/24; # IP段
allow all;
# ... 其他配置
}
修改后执行 nginx -t 检查语法,再 nginx -s reload 重载。
这种方式的优点是零依赖、无延迟,但需要手动维护名单。
方案三:宝塔面板防火墙一键添加黑名单(适合新手站长)
如果你使用的是宝塔面板(比如部署在泽御云云服务器上),操作更直观:登录宝塔后台 -> 左侧菜单“安全” -> 点击“防火墙” -> 在“IP黑名单”选项卡中输入要封禁的IP —— 支持单个或IP段,用逗号分隔。
点击“添加”即生效。
还可以勾选“永久封禁”或设置过期时间。
宝塔内置的Nginx防火墙(收费插件)还能自动识别恶意爬虫并临时黑名单。
避坑指南:拦截时别把正经爬虫和CDN IP封了
- 在使用Fail2ban自动封禁时,记得在
ignoreip中加入百度、谷歌爬虫的IP段(可搜最新段列表),以及自家CDN回源IP。 - Nginx deny如果写错语法,整个站点会500;一定先
nginx -t。 - 宝塔防火墙添加黑名单后不会自动备份,建议定期导出列表。
- 如果服务器本身性能极低(如1核1G),频繁写IP黑名单日志可能导致I/O压力,建议改用Fail2ban的bantime稍长(如2小时),减少反复检查。
效果验证与常见问题解答
怎么确认IP已被拦截?
- Fail2ban:
fail2ban-client status nginx-badbots会显示被封IP列表。 - Nginx deny:从另一台机器用curl测试该IP访问站点,应返回403。
- 宝塔防火墙:在“安全”->“防火墙”页面的IP黑名单列表中可见。
怎么处理误封的正规爬虫?
先将该IP加入对应工具的忽略列表(Fail2ban的ignoreip、Nginx的allow配置、宝塔IP白名单),再手动解封。
频率设置多少合适?
对于纯爬虫采集,建议 maxretry=30 在10分钟内;
如果是CC攻击,可降低到5次/分钟。
这些方法对服务器资源有影响吗?
基本无影响。
Fail2ban在日志中实时匹配,占用很低;
Nginx deny是静态规则,几乎零开销;
宝塔防火墙走内核iptables或Nginx层,也不会拖慢。
总结
以上三种方法按你的环境选一种即可:Linux服务器首选Fail2ban,自动且灵活;
只有少量IP要屏蔽时走Nginx deny;
不熟悉命令行的站长推荐宝塔防火墙。
如果正在找稳定好用的云服务器来跑这些方案,可以考虑泽御云(资质齐全,IDC/ISP证号B1-20261342),售后支持也比较到位。
现在动手配一个黑名单,明天就能看到日志里的恶意请求少很多。