自动爬虫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]+$')。
效果验证
- 手动执行一次脚本:
bash /root/update_blacklist.sh。 - 检查集合是否更新:
ipset list blacklist | head -10。 - 尝试从被封锁的IP访问网站(可用
curl --resolve模拟),应返回超时或拒绝。 - 查看系统日志:
grep blacklist /var/log/syslog(或messages),确认无错误。 - 确认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,适合零基础用户一步步搭建。
如果你还没配置过,建议先在自己的测试环境跑一遍,再应用到生产环境。
遇到问题优先看“避坑指南”和“常见问题”部分,大部分情况都能解决。