自动爬虫IP黑名单定时更新拦截恶意抓取

为什么要自动更新爬虫IP黑名单

很多网站在运营过程中都会遇到同行采集、恶意爬虫、CC攻击等问题。
手动封IP不仅效率低,还容易误封。
通过自动爬虫IP黑名单定时更新拦截恶意抓取,可以每天从公开威胁情报源或分析自身访问日志,同步封禁列表,实现无人值守防护。

准备工作

  • 一台Linux服务器(CentOS 7/8或Ubuntu 20.04以上),已安装Nginx。
  • 拥有root或sudo权限。
  • 了解基本的Linux命令(如vi、crontab -e)。

操作步骤:搭建定时更新机制

1. 安装ipset和iptables

ipset能高效管理大量IP集合,比直接iptables规则快得多。

# CentOS/RHEL
yum install ipset iptables-services -y

# Ubuntu/Debian
apt-get install ipset iptables -y

2. 创建IP集合

创建一个名为blacklist的集合,类型为hash:net(可存IP段)。

ipset create blacklist hash:net

3. 配置iptables规则引用该集合

将集合应用到INPUT链,所有来自集合内的IP请求将被DROP。

iptables -I INPUT -m set --match-set blacklist src -j DROP
# 保存规则(防止重启丢失)
service iptables save   # CentOS
# Ubuntu使用iptables-persistent

4. 编写自动更新脚本

/root/update_blacklist.sh中写入以下内容(根据实际来源调整):

#!/bin/bash
# 自动爬虫IP黑名单定时更新脚本
# 从网络源下载最新恶意IP列表(示例使用自定义列表)
wget -q -O /tmp/new_blacklist.txt https://example.com/malicious-ips.txt

# 清空当前集合(注意:保留已封IP?可根据需求改为逐个添加或替换)
ipset flush blacklist

# 逐行添加IP
while IFS= read -r ip; do
    ipset add blacklist "$ip"
done < /tmp/new_blacklist.txt

# 可选:记录日志
echo "$(date) 更新了 $(wc -l < /tmp/new_blacklist.txt) 个IP" >> /var/log/blacklist_update.log

赋予执行权限:chmod +x /root/update_blacklist.sh

说明:实际IP列表可从AbuseIPDB、FireHOL等获取,或通过分析Nginx日志提取抓取频率过高的IP。

5. 设置cron定时任务

每天凌晨3点自动更新一次:

crontab -e

添加一行:

0 3 * * * /root/update_blacklist.sh

保存退出。
至此,自动爬虫IP黑名单定时更新机制搭建完成。

避坑指南

  • 不要直接清空集合导致瞬时空窗:上述脚本先flush再添加,如果下载失败会导致所有IP解封。建议改为差分更新:先下载新列表,然后用临时集合对比,只增减差异。对于新手,可先确保下载源稳定。
  • iptables规则需要持久化:如果不保存规则,重启服务器后规则丢失。CentOS用service iptables save;Ubuntu安装iptables-persistent
  • 测试阶段先添加白名单:如果误封自己的IP会导致无法登录。建议在脚本开头先添加自己的SSH IP到白名单集合(如whitelist)并放在iptables规则之前。
  • IP来源处理:某些公开列表可能包含大量内网保留地址或错误IP,建议添加前做简单过滤(如grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$')。

效果验证

  1. 手动执行一次脚本:bash /root/update_blacklist.sh
  2. 检查集合是否更新:ipset list blacklist | head -10
  3. 尝试从被封锁的IP访问网站(可用curl --resolve模拟),应返回超时或拒绝。
  4. 查看系统日志:grep blacklist /var/log/syslog(或messages),确认无错误。
  5. 确认cron任务:crontab -l,查看定时任务是否存在。

常见问题解答

Q:如果我不想用网络源,只想基于自己的访问日志封禁怎么办?
A:可以编写脚本分析Nginx的access.log,提取502/403频率高的IP,或超过阈值(如每分钟超过100次请求)的IP,加入黑名单。记得用tail -n1000处理,避免一次处理整个日志。

Q:更新黑名单时服务会中断吗?
A:ipset的flush和add操作是原子性的,通常不会影响现有连接。但建议在低峰期执行。

Q:我使用的是宝塔面板,可以搭配这个方案吗?
A:可以。在宝塔中同样支持ipset和iptables,但需注意宝塔自带的系统防火墙可能会覆盖规则。建议在宝塔的“系统防火墙”中关闭重复规则,或者直接在宝塔的计划任务中运行脚本。

Q:如何确保自己不会被误封?
A:在脚本开头添加ipset add whitelist 你的IP,同时iptables规则中先放行白名单(-A INPUT -m set --match-set whitelist src -j ACCEPT),再DROP blacklist。

总结

通过自动爬虫IP黑名单定时更新,你可以大幅减少恶意抓取对服务器资源的消耗。
本文的方案基于ipset+iptables+cron,适合零基础用户一步步搭建。
如果你还没配置过,建议先在自己的测试环境跑一遍,再应用到生产环境。
遇到问题优先看“避坑指南”和“常见问题”部分,大部分情况都能解决。

分享到:
上一篇
多网卡网络分流降低跨境访问网络延迟的实操教程
下一篇
硬盘坏道检测脚本抢救服务器重要数据
1
系统公告

机房迁移升级通知

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